Linux OSのジッタを体系的に削減する黒魔術

  • このエントリーをはてなブックマークに追加

      2020/08/31

Linux OSのジッタを体系的に削減する黒魔術
低遅延性の求められるトレードシステムにおいて、ジッタの原因をどのように体系的に発見してひとつずつ削除するのか?この質問はmechanical-sympathyのメーリングリストで提示されました。
アズール・システムズの技術担当副社長兼CTOであり、共同創業者であるGil Tene氏はこの質問に対して豊富な実経験から生まれた、蓄積された知恵を用いて回答しました。それは広く共有されるべき回答ですので、ここに紹介します。
Linuxシステムにおける一次的中断 (“hiccup”) やジッタの原因を見つけることはほぼ魔術と言えます。人々はしばしば急なCPU使用率の上昇を見て「この原因は一体何だろう」と想像をめぐらせます。

私の場合は、経験上の証拠(これまで手掛けた数十個のサイトに共通する)や他の技術者との情報交換に基づき、私の好みに合わない設定になっていて、かつシステムレベルの一時的中断が発見された場合に原因の「常習犯」リストを作って参照しています。これらの設定を始めから行っておくことにより、多くの試行錯誤を減らすことができます。(そして、これは「優先事項」ではありません。さらなるアドバイスを探す前に、適切に設定を行っておくべきことです。)
Linuxシステムにおいて数ミリ秒レベルの一時中断瞬断を避けようとするときに、現在私が最初にやることを以下にまとめます。

  1. THP (Transparent Huge Pages)をオフにすること
  2. vm.min_free_kbytesを少なくとも1GB(大規模のシステムでは8GB)に設定すること
  3. Swappinessを0に設定すること
  4. zone_reclaim_modeを0に設定すること

上記1~4のデフォルト値はLinux上では「間違い」であって、それぞれが、(独立して)数ミリ秒単位の一時的中断を引き起こします。私がそのことを知っているのは、実際に個人的にそれらの一時的中断に遭遇したことがあるからです。(例えばTHPが不正を働いた痕跡を示すカーネルスタックトレースがある状態で現行犯逮捕するようなものです。)

加えて、私は通常次を推奨しています。

5. HT(ハイパースレッディング)をONにすること。(Vcoreの実行待ち行列 (run queues) を2倍にするとCPUを待つ可能性は数倍低くなります。)

HT=Offがしばしば推奨されていますが、それはジッタが発生する可能性を著しく増加させてしまう未熟なスピード最適化技法です(数ミリ秒の停滞をジッタと見なすのであれば)。ハイパースレッディングをOFFにすることはシステムにより引き起こされた一時的中断を減らす助けにはなりません(少なくとも20マイクロ秒レベルより大きいレベルの場合には)。HTをOFFにすることはスレッドの実行の線速度を高めることの助けになる場合とならない場合があります。しかし、それはOSについて利用可能な実行待ち行列の数を半分にするという代償のもとに起こるものであって、もし実行可能なスレッドがコアよりも多い状態が数ミリ秒でも存在すれば、スケジューラのクォンタムレベルでの一時的中断が起こる可能性を著しく増大させます。これがシステムから一時的中断がなくなるまで通常HTをONにしておく理由です。その後、HTをOFFにして実験を行うことにより(a)一時的中断が再び起こらないか(b)何か他の測定基準が良くなったかを見るために実験を行うことができます。

numactl, taskset,isolcpusを使用することは、個別のスレッドすべてでジッタや一時的中断の発生(更に、キャッシュの挙動など)を防止する助けになります。同じことが、irqbalanceについても言えます。それらはすべてより高度なものですが、私はまずシステムをクリーンアップし、その後にコアのみを割り当てるやり方が好きです。それに加えて、コアなどを割り当てたら、関心のあるコア(またはコアのセット)上の一時的中断やジッタを個々に測定し始めるべきです。例えば、プロセスをnumactlとともにノード1にロックする場合には、jHiccup(または使用している他のあらゆるツール)の実行が同じノードに制限されるようにする必要があります。

一時的中断やジッタをコントロールするためには、使用しているコアに負荷をかけないようにすることが、特定のコアにワークロードを割り当てることよりもずっと重要なことです。定番のワークロードを避けて、残りのシステムにコアを割り当てること(例えば、initの起動やそれにともないブート後に来るすべてものなど)は、注意深くどのコアがどのワークロードのスレッドを実行するかを考えることよりも決定的に重要なことなのです。

しばしばスレッドがコアに注意深く配置されているシステムを見かけます。しかし、これらのコアはシステムにおいてきちんと割り当てがされていないようなプロセスと共有されています。(そう、これは愚かなことのように見えますが、非常に一般的に見受けられることです。)私がよく最初にお勧めするのは、「全体のシステム」を一つのソケットで実行させ続ける(例えばノード0)ことです。そして、遅延に敏感なプロセスを「もう一方のソケット」(例えばノード1)で実行させます。この状態で実行が適切かつクリーンに行われるようになり、不都合で除去が必要なほど大きな一時的中断がないことが見えてくると、望んでいるソケット内でコアを選択し始めることが可能になります。ただし、大体の場合はそこまで徹底的にやらなくてもよいことの方が多いです。

Isolcpusの場合は幾分(完全にではありませんが)異なります。Isolcpusにより、誰も「偶然に」あなたのコアを共有しないことを知るという利益を得ることができます。しかし、また同時にisolcpusのコアに割り当てるスレッドに関するスケジューラのコア負荷分散機能を失ってしまいます。特定のスレッドをisolcpusのコアで使用することを選択することは時々有益ですが、残りのプロセス(例えば、「JVMの残り」のように、プロセス内でバックグラウンドワーカーとともに稼働するもの)は一時的中断の少ないシステムやノードから依然利益を得ることになります。その利益は、重要なisocpusが割り当てられたスレッドの上にまで代わりに現れることになります。例えば、JVMにおいてisolcpusが割り当てられたスレッドの最も悪い一時的中断でさえも全てのJVMスレッドをまたがるセーフポイントのタイミングのようなものがほとんどになります。そしてisolcpuが割り当てられたスレッドやコアの外部で遅延の影響を依然受けやすい状態になってしまいます。

原文:http://highscalability.com/blog/2015/4/8/the-black-magic-of-systematically-reducing-linux-os-jitter.html(2015-4-8)
※元記事の筆者には直接翻訳の許可を頂いて、翻訳・公開しております。

 -Tech, プログラミング

FAworksではプロのコンサルタントが案件をお探しします

  関連記事

生まれてから100種以上に騎乗してきた僕が選ぶ本命ワーキングチェア。

どーも!こんにちは! 最近よく目にする「iPadのCM」の最後に出てくる都市、ベトナムはホーチミンで

Criteoにおける大規模機械学習の仕組み

Criteoの事業の核を担うのは、機械学習です。当社は、広告を表示させたいときの選択や、個別の製品レ

関数型プログラミング vs命令型プログラミング~Java8でフィボナッチ、素数、階乗をやってみた~

関数型プログラミング vs命令型プログラミング~Java8でフィボナッチ、素数、階乗をやってみた~

プログラミングには多様な形式やパラダイムがあるが、有名なものを2つ挙げるとしたら、関数型と命令型だろ

LL系カンファレンスの歴史

WEBエンジニアの祭典!LL系カンファレンスの歴史

例年夏から秋にかけて開催されているLL(lightweight language, 軽量プログラミン

コーディングが捗るROCK MUSIC

コーディングが捗るROCK MUSIC

みなさんは作業をするときに音楽を聴きますか? 私は仕事中は聞きませんが、家で作業したり勉強するときは

Crystalの紹介:Cのように速く、Rubyのように滑らか

Crystalの紹介:Cのように速く、Rubyのように滑らか

僕は、Rubyistだ。Rubyと、そのコミュニティ、その生産性など、Rubyにまつわる多くのものが

NGINXのスレッドプールがパフォーマンスを9倍にする!

NGINXのパフォーマンスをスレッドプールで9倍にする

はじめに NGINXが接続処理に非同期かつイベント駆動のアプローチを用いていることは、よく知られてい

「AIって何?」なんて今さら聞けない!最低限抑えておきたいこれからの技術トレンド4つ(最新版)

【関連記事】 ❏これから必ず伸びる!最低限抑えておきたい技術トレンド3つ(2015年度版) ❏海外エ

トリバゴがどうやってマテリアル・デザインアプリの堅実な基盤を作っているか

トリバゴがどうやってマテリアル・デザインアプリの堅実な基盤を作っているか

トリバゴのデザイナーたちは、会社のブランディングについて共通の認識を持っていますが、急成長を遂げるト

アナ雪でJavascript!?最近の子ども向けプログラミング学習ツールがすごい

  生まれた時からスマホやタブレットが当たり前。 現代を生きる「デジタルネイティブ」の子ど