[英]In multi-core machine, Linux OS, when process scheduler will migrate one process to another cpu
在我的rss為65G的程序中,調用fork
, sys_clone->dup_mm->copy_page_range
將消耗2秒鍾以上的時間。 在這種情況下,執行fork時,一個cpu將100%sys,同時,直到fork完成,一個線程才能獲得cpu時間。 機器有16個CPU,其他CPU處於空閑狀態。
所以我的問題是一個cpu忙於派生,為什么調度程序不將等待此cpu的進程遷移到其他空閑cpu? 通常,調度程序何時以及如何在cpus之間遷移進程?
我搜索此站點,並且現有線程無法回答我的問題。
rss為65G,當調用fork時,sys_clone-> dup_mm-> copy_page_range將消耗2秒鍾以上
在進行fork
(或clone
)操作時,應將現有進程的vmas復制到新進程的vmas中。 dup_mm
函數(kernel / fork.c)創建新的mm
並進行實際復制。 沒有直接調用copy_page_range
,但是我認為, 靜態函數dup_mmap
可以內聯到dup_mm
並且它具有對copy_page_range
調用。
在dup_mmap
中,新的mm
和舊的oldmm
都鎖定了幾個鎖:
356 down_write(&oldmm->mmap_sem);
取得mmap_sem
讀取器/寫入器信號量后,所有mmap上都有一個循環來復制其元信息:
381 for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next)
僅在循環(您的情況很長)之后, mmap_sem
解鎖:
465 out:
468 up_write(&oldmm->mmap_sem);
雖然rwlock mmap_sep
被writer降低了,但是其他任何閱讀器或作家都無法對oldmm中的oldmm
做任何事情。
一個線程在派生完成之前無法獲得cpu時間所以我的問題是一個cpu忙於派生,為什么調度程序不將等待此cpu的進程遷移到其他空閑cpu?
您確定其他線程已准備好運行並且不想對mmap做任何事情,例如:
brk
), 實際上,wait-cpu線程是我的IO線程,它從客戶端發送/接收程序包,據我觀察,該程序包始終存在,但IO線程無法接收它。
您應該檢查您的wait-cpu線程的堆棧(甚至還有SysRq),以及I / O的種類。 mmap
荷蘭國際集團文件的是I的變體/ O,這將被阻塞上mmap_sem
通過叉。
你也可以檢查等待CPU線程,例如“最近使用的CPU”,在top
監測工具,通過啟用線程視圖( H
鍵),並加入“上次使用的CPU”列輸出( fj
中老年; f
滾動到P
,輸入較新的字符)。 我認為您的wait-cpu線程可能已經在另一個CPU上,只是不允許(未准備好)運行。
如果僅使用fork來使exec
,則對以下情況可能有用:
vfork
+ exec
(或者只是切換到posix_spawn
)。 vfork
將掛起您的進程(但可能不會掛起其他線程,這很危險 ),直到新進程執行exec
或exit
為止,但是執行速度可能比等待復制65 GB的mmap更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.