Ubuntu

使用任務集為特定使用者的所有程序設置 CPU 親和性

  • January 8, 2016

我有 ubuntu 伺服器 14.04,我想知道是否有任何簡單的方法來完成這項任務。

例如,我已經可以使用 對單個程序執行此操作taskset -pac 2 29435,但是有沒有辦法通過使用者名而不是程序 ID 來分配它?

先感謝您。

沒做什麼。真的,什麼都不做。

如果您的目的是盡可能有效地分配資源,那麼正確的做法是讓作業系統按需和必要時將程序移動到相關 CPU。

  • 如果所有程序同時需要 CPU,作業系統將遷移它們,使它們無論如何都將在不同的處理器上執行。
  • 如果其中一個程序大部分時間都處於空閒狀態,最好讓它與其他程序共享一個 CPU。

對於性能優化的情況,限制 CPU 資源或使用從來都不是一個好主意——你只會讓性能變得更糟。您只想限制 CPU 資源或可用於故意破壞程序的 CPU。

您可能想要削弱流程的時間是:

  • 您是託管服務提供商,並且正在為資源消費者可用的資源提供最小/最大範圍。
  • 該程序編寫得很糟糕/行為不端,並且會不正確地消耗給定係統上的所有資源,從而導致其他程序停止執行。這樣做會使您的負載激增,但會“拯救”系統,避免不必要地消耗可用於其他事情的 CPU。在這種情況下,您通常會尋求實際修復程序作為適當的修復。

所以 - 什麼都不做,讓作業系統來解決它。在您的實例執行一段時間後(如果它們確實佔用大量 CPU),您可以執行該命令ps -Lo psr,pid,tid $(pgrep <processname>),您會看到每個資源都在 CPU 上正確分配。

如果您想確定每個程序是否獲得了公平的份額,以及您在每個程序中實際使用了多少,您可以執行以下替換程序名稱並獲得以下結果:

$ ps -Lo psr,pid,tid,etime,cputime,comm $(pgrep firefox)
PSR   PID   TID     ELAPSED     TIME COMMAND
 2  3400  3400  1-07:16:10 01:22:29 firefox
 2  3400  3425  1-07:16:10 00:00:00 gdbus
 2  3400  3426  1-07:16:09 00:00:00 Gecko_IOThread
 3  3400  3427  1-07:16:09 00:00:00 Link Monitor
 1  3400  3428  1-07:16:09 00:02:50 Socket Thread
 1  3400  3429  1-07:16:09 00:00:00 firefox
 0  3400  3430  1-07:16:09 00:00:25 JS Helper
 3  3400  3431  1-07:16:09 00:00:26 JS Helper
 3  3400  3432  1-07:16:09 00:00:25 JS Helper
 1  3400  3433  1-07:16:09 00:00:25 JS Helper
 1  3400  3434  1-07:16:09 00:00:26 JS Helper
 3  3400  3435  1-07:16:09 00:00:25 JS Helper
 0  3400  3436  1-07:16:09 00:00:25 JS Helper
 0  3400  3437  1-07:16:09 00:00:26 JS Helper
 2  3400  3438  1-07:16:09 00:00:02 JS Watchdog
 2  3400  3439  1-07:16:09 00:00:00 Hang Monitor
 1  3400  3440  1-07:16:09 00:00:00 BgHangManager
 3  3400  3441  1-07:16:09 00:00:32 Cache2 I/O
 0  3400  3442  1-07:16:09 00:02:41 Timer
 3  3400  3444  1-07:16:09 00:00:00 GMPThread
 2  3400  3447  1-07:16:09 00:07:24 Compositor
 0  3400  3448  1-07:16:09 00:01:08 ImageBridgeChil
 3  3400  3449  1-07:16:09 00:00:31 ImgDecoder #1
 1  3400  3450  1-07:16:09 00:00:32 ImgDecoder #2
 3  3400  3451  1-07:16:09 00:00:31 ImgDecoder #3
 2  3400  3452  1-07:16:09 00:00:00 ImageIO
 2  3400  3453  1-07:16:09 00:04:07 SoftwareVsyncTh
 0  3400  3454  1-07:16:08 00:00:00 firefox
 2  3400  3455  1-07:16:08 00:00:00 Cert Verify
 2  3400  3456  1-07:16:08 00:00:00 IPDL Background
 0  3400  3457  1-07:16:08 00:00:37 DOM Worker
 2  3400  3458  1-07:16:08 00:00:03 HTML5 Parser
 2  3400  3462  1-07:16:07 00:00:01 mozStorage #1
 1  3400  3463  1-07:16:07 00:00:00 Proxy R~olution
 1  3400  3464  1-07:16:07 00:00:49 URL Classifier
 2  3400  3466  1-07:16:07 00:00:02 mozStorage #2
 0  3400  3467  1-07:16:07 00:00:00 gmain
 3  3400  3468  1-07:16:07 00:00:00 Cache I/O
 3  3400  3471  1-07:16:07 00:00:00 mozStorage #3
 2  3400  3477  1-07:16:07 00:00:35 DOM Worker
 2  3400  3479  1-07:16:07 00:00:00 mozStorage #4
 0  3400  3482  1-07:16:07 00:00:00 localStorage DB
 2  3400  3483  1-07:16:07 00:00:03 mozStorage #5
 1  3400  3519  1-07:15:57 00:00:00 mozStorage #6
 2  3400  3537  1-07:14:09 00:00:31 DOM Worker
 0  3400  3562  1-07:08:35 00:00:00 mozStorage #7
 0  3400  3587  1-06:59:39 00:00:00 threaded-ml
 2  3400  3597  1-06:49:40 00:00:00 mozStorage #8
 2  3400  7594  1-01:36:55 00:00:34 threaded-ml
 3  3400 11679    10:48:07 00:00:00 firefox
 2  3400 11684    10:48:07 00:00:00 typefind:sink
 2  3400 11687    10:48:07 00:00:00 typefind:sink
 1  3400 11689    10:48:07 00:00:00 typefind:sink
 0  3400 11690    10:48:07 00:00:00 mpegaudioparse0
 1  3400 11691    10:48:07 00:00:00 mpegaudioparse1
 2  3400 11692    10:48:07 00:00:00 mpegaudioparse2
 0  3400 11693    10:48:07 00:00:00 aqueue:src
 1  3400 11694    10:48:07 00:00:00 aqueue:src
 1  3400 11695    10:48:07 00:00:00 aqueue:src
 2  3400 22770    05:38:46 00:00:00 firefox
 3  3400 29803       10:17 00:00:00 DNS Res~er #226
 3  3400 30018       01:28 00:00:00 DNS Res~er #228

在這個例子中,我在我的機器上使用了 firefox,但您可以更改程序名稱以滿足您的需要。

在這裡,我請求程序中的每個執行緒。這些列的含義如下:

  • PSR 是分配給該任務的處理器編號。
  • PID 是程序 ID。
  • TID 是執行緒 ID。(主程序 tid 等於它的 pid)
  • ELAPSED 提供程序可執行的總時間。基本上,它開始的時間量。
  • TIME 是程序在 CPU 上實際執行的總時間。
  • COMMAND 是程序聲明的命令名稱。在這裡,您可以看到每個實際執行緒都有一個特定的名稱,大概是用來描述其目的。

要確定程序在其生命週期內的使用率百分比,您可以執行以下計算(我使用的是 firefox):

TIME     /    ELAPSED * 100  = UTIL
112570   /    4949    * 100  = 4.40

注意:實際的程序 ID(tid == pid 的主啟動執行緒)充當所有執行緒(現有或不再存在)CPU 時間的累積總數的“容器”,因此可以合理準確地描述程序整個使用。

解釋一下,如果一個程序的生命週期等於它的 CPU 時間,這意味著該程序一直存在的所有時間裡,它都需要一個 CPU 來執行。這將等於 100% 的 CPU 使用率。

我幾乎可以肯定,實際上你會發現你的程序幾乎不會使用任何 CPU。

所以 - 重申一下,盡可能高效地執行什麼都不做,因為您的核心知道如何最好地優先考慮 CPU 資源以最好地利用您的系統。在大多數情況下,您可能添加的任何內容都會降低您的整體效率

taskset除非您計劃以某種方式實際削弱流程(並且在某些情況下您可能實際上打算這樣做) ,否則您不想使用control groupsLXC/Docker獲得最佳性能。

引用自:https://serverfault.com/questions/747679