我正在使用perf来学习如何找出进程进入"D“(不可中断睡眠)状态的原因。
我正在使用perf命令:
perf record -g -p 4710 -e sched:sched_stat_iowait,sched:sched_stat_blocked sleep 60其中,4710是名为meetmaker的进程的pid。
然后我查看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)据我所知,处于D状态的是jbd内核线程,它抢占了我的meetmaker进程。不是meetmaker进程进入了D状态,对吧?
所以这不是我要找的。尽管我给perf提供了-p参数,但它给了我另一个我不感兴趣的过程。
我说的对吗?
这是找出任何特定进程何时以及为什么进入"D“状态的最佳方法吗?
发布于 2016-01-20 21:38:14
perf在这里是错误的工具。您可以使用systemtap跟踪这样的状态转换。
然而,并没有什么神奇的规则。你必须分别调查每一个地方。
发布于 2016-01-21 17:22:54
D状态是当一些内核进程必须等待一些肯定会发生的驱动程序事件,并且不能接受信号(即使是不可忽略的信号,如SIGKILL或SIGSTOP)时进入的内核状态。信号通常会离开正常的程序流,所以在用户空间中(作为用户,您希望能够中断您的程序),这在某种程度上是很常见的,但是在内核空间中,有一些进程(与驱动程序工作相关)如果被允许中断,将导致驱动程序数据处于不稳定状态(假设您编写了一些设备来中断您,而您不在那里确认中断。你会得到一个设备锁),所以内核有这个状态(D代表Driver状态?有人能证实这一点吗?)假设您正在读取一些磁盘数据,并且您已经将控制器芯片编程为中断您,那么您必须等待磁盘将所有块数据传输到内核缓冲区并中断您。中断肯定会以毫秒或用例的形式出现...但是如果你在中间中断进程,就不会有进程被唤醒,也不会有任何东西来确认设备中断,设备将被阻塞。D状态依赖于驱动程序。当内核进入驱动程序代码(驱动程序编写者专门调用wait__non_interruptable函数来获取它)以执行某些特定任务时,它会在持久操作中进入这种状态。
因此,它是不可中断的,你必须等待它自己出来。这意味着你无论如何都不能从用户空间杀死进程,并且锁定你的系统通常意味着一些驱动程序错误。
https://stackoverflow.com/questions/34901524
复制相似问题