我正在讀書這個連結剛才這讓我開始思考。
不久前,我在 32 核虛擬機的多達 30 個核心上啟動模擬,並使用調用nohup perl ...<rest of command>...
和重定向 STOUT/STDERR 的包裝器腳本來執行此操作 - 我不確定具體細節是否相關,所以我會備用你詳細資訊。
從概念上講,我對多執行緒任務處理很滿意,但我天真地認為,在nohup 呼叫中對每個進程進行後台處理(每個進程都是一個單獨的模擬,然後運行幾週),足以將每個子程序放置到一個核心/執行緒上它自己的,然後繼續完成,而不需要 GNU Parallels 或其他東西。
我定期檢查它們,總是看到 30 個 vCPU 正在處理任務,一切都在合理的時間內完成,所以到目前為止我的邏輯似乎沒有任何問題...
有人(我認為在某個頁面上)告訴我這可能最終會導致「CPU 抖動」。
所以我的問題有幾個相互關聯的部分:
- 首先,我是否錯誤地假設 nohup 和/或後台足以將進程黏在特定核心上? (並且可以在終端中顯示在特定核心上運行的進程嗎?Top 只告訴您哪些核心正忙,而不是據我所知它們正在執行什麼任務?)
- 其次,即使有 2 個備用 CPU 可以處理系統其他任務,CPU 抖動也會發生嗎?
- 最後,如果我沒記錯的話,給定的進程是否會固定到特定的 CPU,而且只有那個CPU,或者它們會根據調用順序/計時等在線程之間跳轉。
答案1
首先,我是否錯誤地假設 nohup 和/或後台是在終端機中顯示的特定核心上運行的進程? Top 只告訴您哪些核心正忙,而不是據我所知它們正在執行什麼任務? (並且可以
Nohup 運行命令的方式與沒有執行命令時完全相同,唯一的區別是它們從 pid 列表中刪除,以便在退出時向其發送訊號。 (disown 適用於未使用 nohup 啟動的程序)。
其次,即使有 2 個備用 CPU 可以處理系統其他任務,CPU 抖動也會發生嗎?
僅當在沒有 nohup 的情況下發生 CPU 抖動時...
最後,如果我沒有錯的話,給定的進程是否會固定到特定的CPU,並且只有該CPU,或者它們會根據調用順序/計時等在線程之間跳轉。一個行程會被固定在一個特定的CPU上嗎?
和沒有 nohup 一樣...
您可以使用 ps 查看進程正在哪個 cpu 核心上運行,並且可以使用任務集限製或更改對核心的限制。
ps -eo pid,sgi_p,cmd --sort sgi_p
taskset -c -p 0 1234
答案2
nohup
沒有設定任何東西來在特定核心上保留進程。你通常會使用taskset
一起nohup
做那件事。top
可以顯示進程最後調度在哪個核心上,它就是P
列。
多年來,進程和執行緒調度變得相當複雜,因為需要考慮的因素越來越多:CPU 親和性、快取親和力、中斷處理、功率包絡……但如果您假設系統不太忙於其他任務,則啟動的作業數量少於可用核心的數量。以類似的方式,您無法真正預測任務將在哪個 CPU 上運行,但如果合適,調度程序很可能在選擇核心後將其保留在同一核心上。