首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perf找出进程何时以及为什么进入不可中断的休眠

使用perf找出进程何时以及为什么进入不可中断的休眠
EN

Stack Overflow用户
提问于 2016-01-20 21:35:14
回答 2查看 892关注 0票数 1

我正在使用perf来学习如何找出进程进入"D“(不可中断睡眠)状态的原因。

我正在使用perf命令:

代码语言:javascript
复制
perf record -g -p 4710 -e sched:sched_stat_iowait,sched:sched_stat_blocked sleep 60

其中,4710是名为meetmaker的进程的pid。

然后我查看perf script输出,它是

代码语言:javascript
复制
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“状态的最佳方法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-01-20 21:38:14

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

然而,并没有什么神奇的规则。你必须分别调查每一个地方。

票数 0
EN

Stack Overflow用户

发布于 2016-01-21 17:22:54

D状态是当一些内核进程必须等待一些肯定会发生的驱动程序事件,并且不能接受信号(即使是不可忽略的信号,如SIGKILLSIGSTOP)时进入的内核状态。信号通常会离开正常的程序流,所以在用户空间中(作为用户,您希望能够中断您的程序),这在某种程度上是很常见的,但是在内核空间中,有一些进程(与驱动程序工作相关)如果被允许中断,将导致驱动程序数据处于不稳定状态(假设您编写了一些设备来中断您,而您不在那里确认中断。你会得到一个设备锁),所以内核有这个状态(D代表Driver状态?有人能证实这一点吗?)假设您正在读取一些磁盘数据,并且您已经将控制器芯片编程为中断您,那么您必须等待磁盘将所有块数据传输到内核缓冲区并中断您。中断肯定会以毫秒或用例的形式出现...但是如果你在中间中断进程,就不会有进程被唤醒,也不会有任何东西来确认设备中断,设备将被阻塞。D状态依赖于驱动程序。当内核进入驱动程序代码(驱动程序编写者专门调用wait__non_interruptable函数来获取它)以执行某些特定任务时,它会在持久操作中进入这种状态。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34901524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档