待ち時間を減らすためにローカルタイマー割り込みをディセーブルにします。カーネル構成で完全なノーティックモードを有効にし、関連コアのブートパラメータnohz_fullを設定しました。
ただし、/ proc / interruptsを介した割り込みの数を見ると、ローカルタイマー割り込みがコアあたり1秒あたり1000回ずつ計算されることがわかります。
ティックなしモードのドキュメントでは、ティックなしで動作するには、そのコアで実行されているプロセスが1つだけ必要であることが示されています。
上部を見ると、特定のコア(この場合はコア1)の下に次のように表示されます。
19 root RT 0 0 0 0 S 0.0 0.0 0:00.00 1 watchdog/1
20 root -2 0 0 0 0 S 0.0 0.0 0:02.15 1 rcuc/1
21 root RT 0 0 0 0 S 0.0 0.0 0:00.04 1 migration/1
22 root -2 0 0 0 0 S 0.0 0.0 0:00.25 1 ksoftirqd/1
23 root RT 0 0 0 0 S 0.0 0.0 0:00.00 1 posixcputmr/1
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 1 kworker/1:0
25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 1 kworker/1:0H
私はそれらのいくつかがカーネルスレッドであることを知っています。これが完全チックレスモードが機能しない理由ですか?
答え1
たとえば、アクティブなフルチックレスモードは、nohz_full=cpux-cpuy
1つしかない場合にのみ機能します。実行可能各CPUnohz_full
の作業:
適応クロックは、クロック予約を必要としない他の状況が多い場合でも、特定のCPUに対して実行可能なタスクが1つしかない場合は何もしません。
したがって、nohz_full
psを使用してCPUを確認する場合は、実行可能なジョブを明示的に見つけることをお勧めします。たとえば、次のようになります。
$ ps -e -L -o cpuid,pid,lwp,state,pri,rtprio,class,wchan:20,comm \
| awk '$1 == '$mycpunr
(つまり、ステータスバーを見てください)
nohz_full
これは、実行できない限り、CPUにいくつかの追加タスクがある可能性があることを意味します。
使用される限り、カーネルがnohz_full=
選択したCPUでユーザー/カーネルスレッドを予約するのを防ぎません。したがって、これらのCPUは通常、他のスレッドの干渉を避けるために隔離されます。たとえば、
nohz_full=cpux-cpuy isolcpus=cpux-cpuy
(よりLinuxカーネルパラメータ)
nohz_full
これらのオプションを使用すると、タイマーやRCU操作などによって独立CPUのスレッドが停止し続けることがあります。
したがって、分離されたスレッドの待ち時間を最小限に抑えるために、他の割り込みソースを無効にする必要があります。
/proc/timer_list
隔離されたCPUでどのタイマーがまだアクティブになっているかを確認できます。
隔離されたCPUに存在する可能性があるタイマーの一般的な例は、watchdog_timer_fn
Machine Check Exception(MCE)機能に関連するタイマーです。
次のようにして、これらの割り込みをさらに無効にすることができます。カーネルオプション、例えば:
nowatchdog mce=ignore_ce
カウンタを見ることは、/proc/interrupts
ハードウェアによる割り込みをチェックする良い方法です。割り込みのもう一つの原因はSoftirqなので、/proc/softirqs
カウンタも確認する必要があります。
たとえば、隔離されたCPUでRCU固有の割り込みを最小限に抑えるには、RCUコールバックをカーネルスレッドにオフロードし、それを非分離CPUに移行し、カーネルオプションを追加して、隔離されたCPUがコールバックスレッドを通知しないように除外できます。
rcu_nocb_poll
このオプションは有効でなければなりませんrcu_nocbs=
が、nohz_full=
すでにrcu_nocbs=
指定されたCPUを暗示します。
これらのスレッドのCPUアフィニティを明示的に設定して、オフロードされたRCUコールバックスレッドを管理CPUに明示的に移動する必要があります。 Tunaを例にしてみましょう(CPU 0)。
# tuna -U -t 'rcu*' -c 0 -m
カーネル文書document/kernel-per-CPU-kthreads.txt追加の割り込み要因(オペレーティングシステムスラッシングとも呼ばれます)を説明し、トレースが有効になっている間にテストロードを実行して割り込みを見つける方法を示します。