【发布时间】:2012-04-22 08:23:31
【问题描述】:
这是我之前的question 的续集。我正在使用 fork 创建子进程。在孩子内部,我正在命令运行如下进程:
if((childpid=fork())==0)
{
system("./runBinary ");
exit(1)
}
我的 runBinary 具有测量从开始到结束所需时间的功能。
令我惊讶的是,当我直接在命令行上运行 runBinary 时,大约需要 60 秒。但是,当我将它作为子进程运行时,它需要更多,比如 ~75 或更多。有什么我可以做或目前做错的事情导致了这种情况吗?
提前感谢您的帮助。 更多细节:我在 linux RHEL 服务器上运行,有 24 个内核。我正在测量 CPU 时间。一次,我只 fork 8 个孩子(按顺序),每个孩子都绑定到不同的核心,使用任务集(代码中未显示)。除了我自己的程序,系统没有加载。
【问题讨论】:
-
在孩子退出后,你沉睡的父进程可能需要 15 秒才能被 o/s 唤醒?
-
@JonathanLeffler 你能告诉我如何确认吗?谢谢
-
@sarnold 实际上是 runBinary,它本身正在测量时间。
-
如果 runBinary 正在计时,则不清楚唤醒睡眠父母所花费的时间是问题所在。鉴于有关 24 核机器的更新并使用
taskset(),然后尝试在不使用taskset()或 CPU 绑定的情况下运行它。runBinary程序本身是多线程的吗?当您从自己的二进制文件运行 8 时,是否会比从命令行一次运行它们时遇到更多的争用? (你确实从命令行运行 8,不是吗?) -
性能是否取决于
/proc/sys/kernel/sched_autogroup_enabled变量?