Понимание того, как символы ядра связаны с моим приложением в Perf - PullRequest
1 голос
/ 23 декабря 2019

Я пытаюсь профилировать узкие места в моей программе.
Я использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...