有没有办法获得有关Unix中进程的非常精确的信息(使用的字节数,CP
问题在于:有一组用不同语言编写的程序(主要是Perl和
Python).每个程序x从stdin读取行,做一些工作(解析行,更??新数据结构,没有长期查询到数据库或花哨的网络通信,甚至磁盘IO很少),也许打印到stdout的东西.任务是编写这样的程序f,给定x和stdin,将对这些行进行采样,这对于x来说计算难度最大.我们的想法是在将来使用这些线来测试和标记x.
这是我坚持的事情:f包裹x,从stdin读取单行l,x准备处理l,f将l传递给x并且不再开始收集关于x的静态.问题是,我找不到任何能够区分计算难度和线条的度量标准.现在我尝试了两种方法: >在x的运行之间转储整个/ proc / [x pid] / stat.它几乎不会改变(甚至CPU滴答). 也许有一些高精度指标?像运行的CPU命令数或内存中的字节数一样? 这是我编写的Python中的实际代码,它充满了细节,所以它是最后一个阅读它我认为https://gist.github.com/alexanderkuk/5630079#file-f-py. 解决方法
您的代码存在很多问题.首先,这个:
def command_is_running(pid): with open('/proc/%d/stat' % pid) as stat: stats = stat.read() return ' R ' in stats def wait_command_processes_line(pid): # stats = ... while command_is_running(pid): # stats = update_stats(stats,pid) return stats 是一个繁忙的循环.它会吃尽可能多的CPU,反复读取… / stat直到R消失.在尝试获得准确的CPU使用时间时,运行额外的CPU占用过程并不是一个好主意. 我不知道有什么方法可以让进程进入休眠状态,直到另一个进程的运行状态发生变化,因此我无法为繁忙的循环提供有效的替换.但这并不重要,因为第二个问题:流程状态不像您希望的那样可预测. 您假设当您将一些数据写入其管道时,该过程将变为可运行,并且在该输入的处理期间将保持可运行.很难保证这是真的.您已经说过“磁盘IO非常罕见”,但您必须做得更好并完全消除它,包括页面错误.这很难,你可能还没有做到.所以我认为你的问题不是/ proc / PID / stat包含错误的信息,而是你在错误的时间阅读它. 您可以通过将D状态视为R来解决磁盘IO问题.但它仍然看起来很糟糕. 您应该找到一个更好的指示器,表明子进程已完成处理最近的输入行,而不是查看进程运行性.你说它“可能会印刷一些东西给stdout”.如果您可以安排它始终为每个输入行打印一些东西到stdout,那么父进程可以等待该输出并在出现时对子进程的CPU使用情况进行采样. 如果您无法让子进程为每个输入行提供完成的外部指示,则可以考虑在尝试读取下一个输入行时使用输入行来完成.基本上你会使用ptrace实现一个类似strace的实用程序,记录输入管道上读取的时间,只有在你的跟踪告诉你它正在尝试读取之后才在管道中写入一行. 也许你甚至可以用strace和一些聪明的shell脚本来做到这一点. 该想法的另一个变体是使用gdb在其输入处理循环开始时在子进程中设置断点,并设置每次遇到断点时运行的脚本.该脚本将收集计时信息,将下一行写入管道,然后执行gdb cont. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |