Scheduling

為什麼 nice-level 會被忽略?(在不同的登錄會話之間——如果從同一個會話開始,則尊重。)

  • March 7, 2018

當我以不同的好級別啟動兩個佔用 CPU 的程序時,例如

過程1:

nice -19 sh -c 'while true; do :; done'

過程2:

sh -c 'while :; do true; done'

(我改變了 and 的順序,:只是為了在ortrue的輸出中區分程序),ps``top

nice 級別似乎被忽略了,並且兩者都使用相同數量的 CPU。

的輸出top就像

 PID USER      PR  NI    VIRT    RES %CPU %MEM     TIME+ S COMMAND
8187 <user>    39  19   21.9m   3.6m 45.8  0.0   0:20.62 R sh -c while true; do :; done
8188 <user>    20   0   21.9m   3.5m 45.6  0.0   0:20.23 R sh -c while :; do true; done
[...]

(當然,%CPU不同樣本的值略有不同,但平均而言它們似乎相等)。

top表明兩個程序以不同的 nice 值執行,但它們似乎仍然獲得相同數量的 CPU 時間。

這兩個命令都是由同一使用者從不同的終端執行的(都是登錄 shell)。

如果它們從同一個終端執行,它們會按預期執行:更好的程序為不太好的程序讓路。

是什麼原因?如何在整台機器上全域做好工作?

前段時間那台機器上的情況有所不同,那裡似乎尊重了良好的價值觀。

它是單處理器/單核機器。

有關資訊:

  • 核心:版本 4.4.5(Arch Linux 庫存核心);uname -r: 4.4.5-1-ARCH,
  • /proc/cpuinfo是:
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 23
model name      : Intel(R) Core(TM)2 Solo CPU    U3500  @ 1.40GHz
stepping        : 10
microcode       : 0xa0c
cpu MHz         : 1400.000
cache size      : 3072 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority
bugs            :
bogomips        : 2794.46
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

啊,不是每個使用者都有自己的 cgroup 的 systemd-logind 功能。我認為這裡負責的變化是舊的;它們只是令人困惑地相似。(我搜尋了“程序組公平調度”,認為它可能是基於我從未真正理解的 unix 的“程序組”的東西)。維基百科:

Linux 核心在 2010 年 11 月收到了針對 2.6.38 核心的 CFS 更新檔,這使得調度程序更適合在台式機和工作站上使用。

當一個任務呼叫 __proc_set_tty() 時,對預設組的程序範圍的引用被刪除,一個新的任務組被創建,程序被移動到新的任務組中。此後子代繼承此任務組,並增加其引用計數。在退出時,當對每個信號結構的最後一個引用被刪除時,對目前任務組的引用被刪除。當最後一個引用它的信號結構被釋放時,任務組被銷毀。在執行隊列選擇時,如果一個任務沒有 cgroup 分配,則使用其目前的自動組。

如果選擇了 CONFIG_SCHED_AUTOGROUP,則預設情況下從引導啟用該功能,但可以通過引導選項/proc/sys/kernel/sched_autogroup_enablednoautogroup禁用01可以動態打開/關閉.]

由此解決的主要問題是多核和多 CPU (SMP) 系統在執行在這些任務中使用許多執行緒的其他任務時體驗增加的互動式響應時間。一個簡單的解釋是,在編譯 Linux 核心或類似的過程(如編碼影片)時,仍然可以觀看影片、閱讀電子郵件和執行其他典型的桌面活動,而不會出現故障或斷斷續續。不過,有人反對這一說法。

引用自:https://unix.stackexchange.com/questions/277505