カーネルスレッディングがチックレスモード全体を妨げているような気がしますか?

カーネルスレッディングがチックレスモード全体を妨げているような気がしますか?

待ち時間を減らすためにローカルタイマー割り込みをディセーブルにします。カーネル構成で完全なノーティックモードを有効にし、関連コアのブートパラメータ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-cpuy1つしかない場合にのみ機能します。実行可能各CPUnohz_fullの作業:

適応クロックは、クロック予約を必要としない他の状況が多い場合でも、特定のCPUに対して実行可能なタスクが1つしかない場合は何もしません。

(よりドキュメント/タイマー/NO_HZ.txt)

したがって、nohz_fullpsを使用して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_fnMachine 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追加の割り込み要因(オペレーティングシステムスラッシングとも呼ばれます)を説明し、トレースが有効になっている間にテストロードを実行して割り込みを見つける方法を示します。

おすすめ記事