使用任務集為特定使用者的所有程序設置 CPU 親和性
我有 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 groups
或LXC/Docker
獲得最佳性能。