
我如何知道 Linux 中使用者使用的處理器總數?例如:使用者「X」運行 2 個(或更多)進程,總共使用 3 個處理器。我怎麼知道呢?如果不可能,那麼我如何知道使用者可以使用多少個處理器?例如:使用者「X」使用 2 個處理器(可能有 8 個)開啟會話。
我需要編寫Perl 函數來取得使用者名稱(例如「root」)並傳回標量- 可能的情況之一: 1. 使用的使用者處理器總數(例如8 個中的2 個) 2. 使用的使用者核心總數3 . 可用於的處理器用戶在我的情況下,用戶運行一個(可能更多,但不多)運行幾天的大進程,我想知道(特殊用戶的)進程如何加載機器......因為如果他使用大量資源,那麼我得阻止他...
答案1
無法判斷給定程式使用了哪些核心。 CPU 根據大量因素,無形地自動將執行緒分配給核心,並執行大量的手動操作,使一切看起來都在同步運行,即使在分配處理時間方面存在一些時間切片到每個執行緒。
歸根結底,會話無法映射到一組核心。您可以將會話對應到在一個或多個核心上執行執行緒的程式的使用,但這嚴格取決於所有行程的當前狀態的需要。
它不像您為 sally 分配 2 個核心,為 bob 分配 2 個核心,為 tom 分配 4 個核心,導致您「用完」它們。 sally、Bob 和 Tom 的程式都可以使用最多 8 個內核,系統將決定如何最好地將線程分配給處理設施。
答案2
您可以使用sched_getaffinity 和 sched_setaffinity尋找允許用戶進程運行的核心。然而,這並不意味著它將在所有這些設備上運行。
您可以透過在下列位置啟動進程來限制進程可以運行的核心:中央處理器組(一個特定的部分組組)
例如參見本指南關於如何在 Red Hat 6 中為 cgroup 新增進程以及本指南關於如何有效地按群組(或每個使用者)劃分 cpu 和記憶體。
如果您只是想獲取特定用戶正在使用的 cpu%,您可以使用以下 oneliner:
top -b -n 1 -u <username> | awk 'NR>7 { sum += $9; } END { print sum; }'