Я пытаюсь профилировать узкие места в моей программе.
Я использую perf
как sudo perf record -agi -F 10000 -p $(pidof myapp)
Это часть вывода, который я вижу с sudo perf report -g graph,0.01
+ 63.68% 0.00% my_thread [kernel.kallsyms] [k] entry_SYSCALL_64_after_hwframe
+ 63.60% 0.49% my_thread [kernel.kallsyms] [k] do_syscall_64
+ 49.35% 0.14% my_thread libpthread-2.27.so [.] __libc_write
+ 49.08% 0.04% my_thread [kernel.kallsyms] [k] __x64_sys_write
+ 49.04% 0.02% my_thread [kernel.kallsyms] [k] ksys_write
+ 48.92% 0.07% my_thread [kernel.kallsyms] [k] vfs_write
+ 48.78% 0.03% my_thread [kernel.kallsyms] [k] __vfs_write
+ 48.67% 0.12% my_thread [kernel.kallsyms] [k] sock_write_iter
+ 48.65% 0.07% my_thread [kernel.kallsyms] [k] new_sync_write
+ 48.53% 0.01% my_thread [kernel.kallsyms] [k] sock_sendmsg
+ 48.44% 0.07% my_thread [kernel.kallsyms] [k] inet_sendmsg
Что похоже на сетевой стек в ядре. Это очень разумно в зависимости от того, что делает мое приложение.
Позже я вижу, что функции моего пользовательского пространства обрабатывают полученные данные.
Но нигде я не вижу связи - я имею в виду это: я не вижумои пользовательские функции вызывают некоторые read()
/ write()
.
- Есть ли способ узнать, сколько времени тратится на
read()
/ write()
(в случае, если сокет блокируется)? - Есть ли способ увидеть трассировку стека из сетевого стека ядра с моим приложением? Итак, я буду знать, какая именно функция выполняет большую нагрузку на сеть? например, посмотрите, кто
write()
все время?
Более конкретно;Допустим, у меня есть 3 функции, какая из них является причиной всех этих перфорированных выводов?
void func1() {
// ...
read();
// ...
}
void func2() {
// ...
write();
// ...
}
void func3() {
// ...
write();
// ...
}
--- Обновление ---
Я использую -g
, но все еще не вижу соединения с моим кодом:
- 43.68% 0.86% my_thread [kernel.kallsyms] [k] do_syscall_64
- 42.81% do_syscall_64
- 25.34% __x64_sys_write
- 25.31% ksys_write
- 25.18% vfs_write
- 24.99% __vfs_write
- 24.79% new_sync_write
- sock_write_iter
- 24.60% sock_sendmsg
- 24.42% inet_sendmsg
- 24.32% tcp_sendmsg
- 23.85% tcp_sendmsg_locked
- 22.09% tcp_push
- 21.98% __tcp_push_pending_frames
- 21.87% tcp_write_xmit
- 21.25% __tcp_transmit_skb
- 20.70% ip_queue_xmit
- 20.61% __ip_queue_xmit
- 20.45% ip_local_out
- 20.27% ip_output
- 20.16% ip_finish_output
- 20.01% ip_finish_output2
- 18.50% __local_bh_enable_ip
- do_softirq.part.21
- do_softirq_own_stack
- 18.37% __softirqentry_text_start
- 18.07% net_rx_action
- 17.92% process_backlog
- 17.78% __netif_receive_skb
- 17.74% __netif_receive_skb_one_core
- 17.53% ip_rcv
- 17.44% ip_rcv_finish
- 17.40% ip_local_deliver
- 17.37% ip_local_deliver_finish
- 17.27% ip_protocol_deliver_rcu
- 17.10% tcp_v4_rcv
- 16.42% tcp_v4_do_rcv
- 16.27% tcp_rcv_established
- 14.49% tcp_data_queue
- 14.28% sock_def_readable
- __wake_up_sync_key
__wake_up_common_lock
_raw_spin_unlock_irqrestore