2013-02-17 9 views
14

ゲストとして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でも同じことが可能であるとすれば、そのどれも必要ないと読んでいます。

私は正しいアプローチが何であるかについて非常に混乱しています。

私が望むのは、タイマー割り込みを可能な限り低くすることです。

これを行う正しい方法がわかりますか?

答えて

15

心配しないでください!あなたの混乱は何も予想されていません。 Linuxタイマーの割り込みは非常に混乱しており、長い歴史があります。

CLK_TCK

Linuxは何sysconfシステムコールを持っていないとglibcはちょうど100申し訳ありませんが、一定値を返しています。

HZ < - あなたはおそらく、あなたのカーネルを設定するときは、100Hzの、250Hzの、300Hzから1000Hzのか、どちらかのタイマー周波数を選択することができます

を望むもの。これらはすべてサポートされていますが、1000Hzがデフォルトですが、必ずしも最良ではありません。

一般に、待機時間(デスクトップまたはWebサーバー)を評価するときに高い値を選択し、スループット(HPC)を評価するときに値を低く設定します。

CONFIG_HIGH_RES_TIMERS

これは、タイマ割り込みとは何の関係もありませんが、それはちょうどあなたが高分解能タイマーを持つことができるメカニズムです。これは、基本的には、selectのようなコールのタイムアウトが1/HZ秒より正確であることを意味します。

デバイダ

このコマンドラインオプションは、Red Hatが提供するパッチです。あなたはおそらくこれを使うことができます(もしあなたがRed HatやCentOSを使っているのなら)。しかし、私は注意が必要です。それは多くのバグを引き起こしているので、異なるHz値で再コンパイルするほうがよいでしょう。これは本当に多くをしない

CONFIG_NO_HZ

は、それは節電のためだと何も実行されていない場合には、ダニが停止(または少なくともそれほど頻繁になる)ことを意味します。これはおそらくあなたのカーネルですでに有効になっているでしょう。少なくとも1つのタスクが実行可能なときには、何の違いもありません。

Frederic Weisbeckerは、実際には単一のタスクだけが実行されている場合にこれを一般化するパッチを保留中ですが、まだまだです。

+1

'cat/proc/interrupts'を2回実行すると、最初の呼び出しと2回目の呼び出しの間に「ローカルタイマー割り込み」が増えます。しかし、「IO-APICエッジタイマ」とラベル付けされたものは、2つの呼び出しの間で同じままである。なぜなら、基本的に起動時間以来のチックの数を記録するグローバルタイマ変数 'jiffies'をインクリメントする責任を負う各CPU上で動作する'ローカルタイマー割り込み 'はありますか?また 'IRQ 0'は' cat/proc/interrupts'の1行目のタイマー割り込みに対応していますので、私は 'tickless system'を持っていると思います。非常に明確な説明...ありがとう – Deepthought

+0

心配しないでくださいI/O APIC、ローカルタイマー割り込みは実際にはローカルAPICからのものですが、これはまったく別のものです。 IRQ 0と表示されているのはI/O APICタイマーです。これはおそらく使用されていません(おそらく、起動時を除いて)。ただし、ローカルタイマーが増分jiffiesを中断すると言っても間違いありません。 – jleahy

+0

ちょっと、プロのLinuxカーネルアーキテクチャーと呼ばれるこの本からabtタイマーを読んだり、Linuxカーネルを理解するのに少し時間がかかりましたが、私はまだプロセスを理解していません...効率的な方法でjiffiesを更新するコードを試して修正しなければなりません...あなただけの理論だけでなく、仕事をしているカーネルのコードも理解できる良い出典をお勧めできますか?ありがとう – Deepthought