ニースレベルの異なる2つのCPUを消費するプロセスを開始すると、たとえば
プロセス1:
nice -19 sh -c 'while true; do :; done'
プロセス2:
sh -c 'while :; do true; done'
(:
の順序を変更しました およびtrue
ps
の出力でプロセスを区別するためだけに またはtop
)、
nice-levelは無視されているようで、どちらも同じ量の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
は、両方のプロセスが異なる適切な値で実行されていることを示していますが、それでも同じ量のCPU時間を取得しているようです。
両方のコマンドは、異なる端末から同じユーザーによって実行されました(どちらもログインシェルです)。
それらが同じ端末から実行される場合、それらは期待どおりに動作します。より良いプロセスは、それほど良くないプロセスに道を譲ります。
理由は何ですか?マシン全体でグローバルに優れた作業を行うにはどうすればよいですか?
以前は、そのマシンではそれが異なっていました。そこでは、nice-valuesが尊重されているように見えました。
シングルプロセッサ/シングルコアマシンです。
詳細情報:
- カーネル:バージョン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()を呼び出すと、デフォルトグループへのプロセス全体の参照が削除され、新しいタスクグループが作成され、プロセスが新しいタスクグループに移動されます。その後、子はこのタスクグループを継承し、そのrefcountを増やします。終了時に、各シグナル構造体への最後の参照が削除されると、現在のタスクグループへの参照が削除されます。タスクグループは、それを参照している最後のシグナル構造体が解放されると破棄されます。ランキューの選択時に、IFFタスクにはcgroupが割り当てられておらず、現在の自動グループが使用されます。
CONFIG_SCHED_AUTOGROUPが選択されている場合、この機能はデフォルトで起動から有効になりますが、起動オプションnoautogroupを使用して無効にすることができ、オンザフライでオン/オフにすることもできます [
/proc/sys/kernel/sched_autogroup_enabled
経由 :を書く 新しく作成されたタスクでは無効になり、
1
と記述します。 有効にします。]これによって解決される主な問題は、マルチコアおよびマルチCPU(SMP)システムで、これらのタスクで多くのスレッドを使用する他のタスクを実行しているときに、対話型応答時間が長くなることです。簡単に説明すると、Linuxカーネルやビデオのエンコードなどの同様のプロセスをコンパイルしている間も、ビデオを見たり、電子メールを読んだり、その他の一般的なデスクトップアクティビティをグリッチや途切れることなく実行できます。ただし、この声明には反対意見があります。