ゲストとしてGentooを使用して仮想マシンを実行すると、tick_periodic
の機能からかなりのオーバーヘッドが発生することがわかりました。これは、すべてのタイマ割り込みで実行される関数です。この関数は、をグローバルに更新し、オーバーヘッドにつながるwrite_seqlocks
を使用します。Linuxカーネルタイマの周波数を下げる
私のカーネル設定ファイルにはHZ
というgrepと関連するものがあります。
[email protected]:~$ cat /boot/config | egrep 'HZ|TIME'
# CONFIG_RCU_FAST_NO_HZ is not set
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
# CONFIG_MACHZ_WDT is not set
CONFIG_TIMERFD=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_X86_CYCLONE_TIMER=y
CONFIG_HPET_TIMER=y
明らかに、1000年に設定を設定しているが、私はsysconf(_SC_CLK_TCK)
を行うとき、私は私のタイマー周波数として100を得ます。では、私のシステムのタイマー周波数は何ですか?
私がしたいことは、可能な限り周波数を100に、さらに低くすることです。 poll
/select
とスケジューラのタイムスライスのインタラクティビティと精度に影響するかもしれませんが、私はVMをスピードアップするため、これらのことをより少ないタイマー割り込みに犠牲にする用意ができています。
私は何が行われなければならないのか調べようとしたところ、設定ファイルを変更することでできることを読んでいました。それ以外の場合は、divider = 10を追加するとブートパラメータにジョブが追加されます。ここでは、CONFIG_HIGH_RES_TIMERS
をタイマー周波数を上げなくても低レイテンシタイマーに設定でき、ティックレスシステムCONFIG_NO_HZ
でも同じことが可能であるとすれば、そのどれも必要ないと読んでいます。
私は正しいアプローチが何であるかについて非常に混乱しています。
私が望むのは、タイマー割り込みを可能な限り低くすることです。
これを行う正しい方法がわかりますか?
'cat/proc/interrupts'を2回実行すると、最初の呼び出しと2回目の呼び出しの間に「ローカルタイマー割り込み」が増えます。しかし、「IO-APICエッジタイマ」とラベル付けされたものは、2つの呼び出しの間で同じままである。なぜなら、基本的に起動時間以来のチックの数を記録するグローバルタイマ変数 'jiffies'をインクリメントする責任を負う各CPU上で動作する'ローカルタイマー割り込み 'はありますか?また 'IRQ 0'は' cat/proc/interrupts'の1行目のタイマー割り込みに対応していますので、私は 'tickless system'を持っていると思います。非常に明確な説明...ありがとう – Deepthought
心配しないでくださいI/O APIC、ローカルタイマー割り込みは実際にはローカルAPICからのものですが、これはまったく別のものです。 IRQ 0と表示されているのはI/O APICタイマーです。これはおそらく使用されていません(おそらく、起動時を除いて)。ただし、ローカルタイマーが増分jiffiesを中断すると言っても間違いありません。 – jleahy
ちょっと、プロのLinuxカーネルアーキテクチャーと呼ばれるこの本からabtタイマーを読んだり、Linuxカーネルを理解するのに少し時間がかかりましたが、私はまだプロセスを理解していません...効率的な方法でjiffiesを更新するコードを試して修正しなければなりません...あなただけの理論だけでなく、仕事をしているカーネルのコードも理解できる良い出典をお勧めできますか?ありがとう – Deepthought