clone()/ fork()/进程创建在某些机器上很慢

Kni*_*nio 9 linux ubuntu performance kernel

在我的一些机器上创建新进程非常慢,而在其他机器上则不然.

这些机器都很相似,有些慢速机器在同一硬件和内核(2.6.32-26,Ubuntu 10.04)上运行与一些快速机器完全相同的工作负载.不涉及创建流程的任务在所有计算机上的速度相同.

例如,该程序在受影响的计算机上执行速度慢约50倍:

int main()
{
    int i;
    for (i=0;i<10000;i++)
    {
        int p = fork();
        if (!p) exit(0);
        waitpid(p);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

什么可能导致任务创建速度慢得多,以及我可以在机器中寻找其他差异?

Edit1:运行bash脚本(因为它们产生了很多子进程)在这些机器上运行速度也非常慢,并且对慢速脚本的分析显示了clone()内核调用的减速.

Edit2:vmstat在快速与慢速机器上没有显示任何显着差异.它们都有足够的RAM用于工作负载,而不是交换.

编辑3:我没有看到任何可疑的内容 dmesg

编辑4:我不知道为什么现在这是在stackoverflow上,我不是在问上面的示例程序(只是用它来演示问题),而是linux管理/调优,但如果人们认为它属于这里,很酷.

mal*_*pdx 1

我可能会首先使用 strace 来查看正在运行哪些系统调用,以及缓慢的系统调用挂在哪里。我也很好奇你在这里如何使用 waitpid() 。在我的系统上,waitpid 的签名是

pid_t waitpid(pid_t pid, int *status, int options);
Run Code Online (Sandbox Code Playgroud)

它看起来像是您正在使用 wait(),但传入子进程的 pid,而不是传递一个 int “status”,该 int “status” 具有您想要测试的状态标志的 OR。我预计,如果 PID 最终被解释为状态掩码,这可能会导致一些奇怪的事情发生。