在多核机器Linux OS中,当进程调度程序将一个进程迁移到另一个cpu
在我的程序中,其rss是65G,当调用fork时,sys_clone-> dup_mm-> copy_page_range将消耗超过2秒.在这种情况下,一个cpu在执行fork时会100%sys,同时,一个线程在fork完成之前无法获得cpu时间.机器有16个CPU,其他CPU空闲. 所以我的问题是一个cpu忙于fork,为什么调度程序不会将等待这个cpu的进程迁移到其他空闲cpu?一般来说,调度程序何时以及如何在cpus之间迁移进程? 我搜索这个网站,现有的线程无法回答我的问题. > How Linux scheduler schedules processes on multi-core processors?
在执行fork(或clone)时,应将现有进程的vmas复制到新进程的vmas中. 在dup_mmap中,锁定了几个锁,包括新mm和旧oldmm:
在获取mmap_sem读取器/写入器信号量之后,在所有mmaps上都有一个循环来复制它们的元信息:
只有在循环之后(在你的情况下很长),mmap_sem才会被解锁:
虽然rwlock mmap_sep被写入程序关闭,但没有任何其他读者或编写者可以使用oldmm中的mmaps做任何事情.
您确定,其他线程已准备好运行且不想对mmaps执行任何操作,例如: >捣乱新事物或取消不需要的东西,
你应该检查你的wait-cpu线程的堆栈(甚至还有SysRq),以及那种I / O. mmaping文件是I / O的变体,它将被fork阻塞在mmap_sem上. 您还可以检查wait-cpu线程的“上次使用的CPU”,例如在顶部监视实用程序中,通过启用线程视图(H键)并添加“上次使用的CPU”列来输出(fj在较旧; f滚动到P,输入较新).我认为你的wait-cpu线程可能已经在另一个CPU上,只是不允许(未准备好)运行. 如果你只使用fork来创建exec,那么它对以下内容很有用: >切换到vfork exec(或只是切换到posix_spawn). (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |