【问题标题】:how to detect if a thread or process is getting starved due to OS scheduling如何检测线程或进程是否由于操作系统调度而变得饥饿
【发布时间】:2012-06-22 00:06:07
【问题描述】:

这是在 Linux 操作系统上。应用程序是用 C++ 编写的,带有 ACE 库。

我怀疑进程中的一个线程有时会被阻塞很长时间(5 到 40 秒)。该应用程序在大多数情况下运行良好,除了一天几次它有这个问题。由于大量的套接字传入数据,还有其他类似的 5 个应用程序在盒子上运行,它们也是 I/O 绑定的。

我想知道我是否可以通过编程方式做任何事情来查看线程/进程是否正在获取它们的时间片。

【问题讨论】:

    标签: c++ linux operating-system job-scheduling ace


    【解决方案1】:

    如果某个流程被饿死,那么对该流程的自我监控就不会那么高效。但是,如果您只是希望该进程注意到它有一段时间没有运行,它可以定期调用 times 并将经过时间的相对差异与计划用户时间的相对差异进行比较(您可以将 @987654322 @ 和 tms_cutime 字段,如果您想将等待孩子计算为生产时间,如果您将代表您花费的内核时间计算为生产时间,您将在 tms_stimetms_cstime 字段中求和)。对于线程时间,我知道的唯一方法是查阅 /proc 文件系统。

    高优先级外部进程或高优先级线程可以通过读取进程的适当/proc/<pid>/stat 条目(以及线程的/proc/<pid>/task/<tid>/stat)来从外部监视感兴趣的进程(和线程)。用户时间位于stat 文件的第 14 和第 16 字段中。系统时间位于第 15 和第 17 字段中。 (对于我的 Linux 2.6 内核,字段位置是准确的。)

    在两个时间点之间,您可以确定经过的时间量(监控进程或线程通常会定期唤醒)。然后,每个时间点的累积处理时间之间的差异表示感兴趣的线程在该时间段内运行了多少时间。处理时间与经过时间的比率将代表时间片。

    最后一点信息:在Linux上,我使用以下方法获取当前线程的tid,用于检查/proc/<pid>/task/目录中正确的task

    tid = syscall(__NR_gettid);
    

    我这样做是因为我找不到系统上任何库实际导出的gettid 系统调用,即使它已记录在案。但是,它可能在您的身上可用。

    【讨论】:

      猜你喜欢
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多