簡體   English   中英

在多核計算機(Linux OS)中,當進程調度程序將一個進程遷移到另一個CPU時

[英]In multi-core machine, Linux OS, when process scheduler will migrate one process to another cpu

在我的rss為65G的程序中,調用forksys_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將掛起您的進程(但可能不會掛起其他線程,這很危險 ),直到新進程執行execexit為止,但是執行速度可能比等待復制65 GB的mmap更快。
  • 或者不從具有多個活動線程和多GB虛擬內存的多線程進程中進行派生。 您可以創建一個小型(沒有多GB映射的)幫助程序進程,使用ipc或套接字或管道與之通信,並要求它派生並做您想做的一切。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM