2016-01-20 60 views
1

我在玩perf以了解如何找出进程进入“D”(不间断睡眠)状态的原因。使用perf来确定何时以及为什么进程进入不间断睡眠

我使用PERF命令:

perf record -g -p 4710 -e sched:sched_stat_iowait,sched:sched_stat_blocked sleep 60 

其中4710是我进程的PID叫meetmaker

然后我在看perf script输出是

meetmaker-3.0.0 4710 [008] 19187729.668851: sched:sched_stat_iowait: comm=jbd2/dm-2-8 pid=697 delay=120641 [ns] 
     ffffffff810a08a0 enqueue_sleeper ([kernel.kallsyms]) 
     ffffffff810a08a0 enqueue_sleeper ([kernel.kallsyms]) 
     ffffffff810a756a enqueue_entity ([kernel.kallsyms]) 
     ffffffff810a7e83 enqueue_task_fair ([kernel.kallsyms]) 
     ffffffff810967b1 ttwu_activate ([kernel.kallsyms]) 
     ffffffff81096983 ttwu_do_activate ([kernel.kallsyms]) 
     ffffffff8109819a ttwu_queue ([kernel.kallsyms]) 
     ffffffff810983fe try_to_wake_up ([kernel.kallsyms]) 
     ffffffff810ada66 autoremove_wake_function ([kernel.kallsyms]) 
     ffffffff810ad8fa __wake_up_common ([kernel.kallsyms]) 
     ffffffff810addb8 __wake_up ([kernel.kallsyms]) 
     ffffffff810ade11 __wake_up_bit ([kernel.kallsyms]) 
     ffffffff81260fcb ext4_finish_bio ([kernel.kallsyms]) 
     ffffffff812617df ext4_end_bio ([kernel.kallsyms]) 
     ffffffff8131b433 blk_update_request ([kernel.kallsyms]) 
     ffffffff8131b5b7 blk_update_bidi_request ([kernel.kallsyms]) 
     ffffffff8131c9af blk_end_bidi_request ([kernel.kallsyms]) 
     ffffffff8148f1f0 scsi_io_completion ([kernel.kallsyms]) 
     ffffffff813263bb blk_done_softirq ([kernel.kallsyms]) 
     ffffffff8106af9c __do_softirq ([kernel.kallsyms]) 
     ffffffff8106b1e5 irq_exit ([kernel.kallsyms]) 
     ffffffff816399fa do_IRQ ([kernel.kallsyms]) 
     ffffffff8163796d ret_from_intr ([kernel.kallsyms]) 
        487f77 [unknown] ([unknown]) 
        487f77 meetmaker__user_counters_get (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        505cff gpbrpc_exec (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        4eb45c ipc_game_loop (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        4ed48a game (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        48ebe3 service_late_init (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        47371a main (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
      7fd3cc391c36 __libc_start_main (/lib64/libc-2.11.3.so) 

meetmaker-3.0.0 4710 [008] 19187729.668886: sched:sched_stat_blocked: comm=jbd2/dm-2-8 pid=697 delay=120641 [ns] 
     ffffffff810a08d8 enqueue_sleeper ([kernel.kallsyms]) 
     ffffffff810a08d8 enqueue_sleeper ([kernel.kallsyms]) 
     ffffffff810a756a enqueue_entity ([kernel.kallsyms]) 
     ffffffff810a7e83 enqueue_task_fair ([kernel.kallsyms]) 
     ffffffff810967b1 ttwu_activate ([kernel.kallsyms]) 
     ffffffff81096983 ttwu_do_activate ([kernel.kallsyms]) 
     ffffffff8109819a ttwu_queue ([kernel.kallsyms]) 
     ffffffff810983fe try_to_wake_up ([kernel.kallsyms]) 
     ffffffff810ada66 autoremove_wake_function ([kernel.kallsyms]) 
     ffffffff810ad8fa __wake_up_common ([kernel.kallsyms]) 
     ffffffff810addb8 __wake_up ([kernel.kallsyms]) 
     ffffffff810ade11 __wake_up_bit ([kernel.kallsyms]) 
     ffffffff81260fcb ext4_finish_bio ([kernel.kallsyms]) 
     ffffffff812617df ext4_end_bio ([kernel.kallsyms]) 
     ffffffff8131b433 blk_update_request ([kernel.kallsyms]) 
     ffffffff8131b5b7 blk_update_bidi_request ([kernel.kallsyms]) 
     ffffffff8131c9af blk_end_bidi_request ([kernel.kallsyms]) 
     ffffffff8148f1f0 scsi_io_completion ([kernel.kallsyms]) 
     ffffffff813263bb blk_done_softirq ([kernel.kallsyms]) 
     ffffffff8106af9c __do_softirq ([kernel.kallsyms]) 
     ffffffff8106b1e5 irq_exit ([kernel.kallsyms]) 
     ffffffff816399fa do_IRQ ([kernel.kallsyms]) 
     ffffffff8163796d ret_from_intr ([kernel.kallsyms]) 
        487f77 [unknown] ([unknown]) 
        487f77 meetmaker__user_counters_get (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        505cff gpbrpc_exec (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        4eb45c ipc_game_loop (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        4ed48a game (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        48ebe3 service_late_init (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
        47371a main (/local/meetmaker/bin/meetmaker-3.0.0_2724) 
      7fd3cc391c36 __libc_start_main (/lib64/libc-2.11.3.so) 

据我了解这个PERF输出,它是jbd内核线程是在d状态,并抢占我meetmaker过程。这不是meetmaker进程进入D状态,对吧?

所以这不是我正在寻找的。即使我给了perf的-p的说法,它给了我另一个我不感兴趣的过程。

对吗?

这是找出何时以及为什么特定过程进入“D”状态的最佳方法吗?

回答

0

这里perf是错误的工具。您可以使用systemtap跟踪这些状态转换。

但是,没有魔法规则。你必须分别调查每个地方。

0

D状态是一个内核状态进入时一些内核进程必须等待一些司机事件肯定会发生什么,而不能接受信号(甚至非忽略的,如SIGKILLSIGSTOP)。信号通常不在正常的程序流程中,所以在用户空间中有点常见(您作为用户希望能够中断您的程序),但在内核空间中存在会导致驱动程序的进程(与驱动程序有关)如果允许被中断的数据处于不稳定状态(假设你编程某个设备来中断你,并且你不在那里确认中断,你会得到一个设备锁),所以内核有这种状态(D代表Driver状态?有人可以证实这一点?)。假设你正在读取一些磁盘数据,并且你已经编程了控制器芯片来中断你,你必须等待磁盘将所有的块数据传送到内核缓冲区并中断你。这个中断肯定会有几毫秒或者几秒钟,可以肯定......但是如果你中断了进程,那么就没有任何过程可以唤醒,没有什么可以确认设备中断并且设备将被阻塞。 D状态是驱动程序依赖的东西。当内核进入驱动程序代码(驱动程序编写者特别呼叫wait_non_interruptable函数来获取它)时,内核进入该状态以进行持久的操作以完成某些特定的任务。

因此,它是不可中断的,你必须等待它自己走出去。这意味着无论如何您都不能从用户空间中终止进程,并且锁定系统的其中一件事通常意味着一些驱动程序错误。

相关问题