【发布时间】:2014-06-09 04:56:41
【问题描述】:
在我的rss为65G的程序中,调用fork,sys_clone->dup_mm->copy_page_range会消耗2秒以上。在这种情况下,一个 cpu 在执行 fork 时将 100% sys,同时一个线程在 fork 完成之前无法获得 cpu 时间。该机器有 16 个 CPU,其他 CPU 空闲。
所以我的问题是一个 cpu 忙于 fork,为什么调度程序不将等待这个 cpu 的进程迁移到其他空闲 cpu?一般来说,调度程序何时以及如何在 cpu 之间迁移进程?
我搜索了这个网站,现有的帖子无法回答我的问题。
【问题讨论】:
-
为什么你认为这个其他线程正在挨饿?可能是它在某个资源/内存锁上休眠,在 fork 期间不可用。
-
抱歉,我的描述不清楚。实际上,wait-cpu 线程是我的 IO 线程,它从客户端发送/接收包,在我的观察中,包始终存在,但 IO 线程无法接收它。在 systemtap 的帮助下,我发现 IO 线程无法获得 CPU 时间。我可以找到一个 100% sys(do sys_clone) 的 cpu,同时另一个 cpu 处于空闲状态。
-
sys_clone可能会在执行dup_mm(pi_lock或mm->mmap_sem)时阻塞某些内核互斥体,并且您的 I/O 线程需要锁定相同的互斥体/信号量。尝试为第二个线程获取堆栈(内核或用户)...(您确定只有fork可能对您有用吗?尝试 vfork+exec =posix_spawn,如果在 fork 之后有 exec。) -
雷蒙德,有更新吗?
标签: linux fork scheduler multicore