PAUSE命令Broadwell / Skylake / Sunny CoveMemcached

マイクロアーキテクチャを考慮したスピン待機のPAUSE命令の性能分析

データセンタに混在する複数世代のCPUマイクロアーキテクチャに対し、スピンロック内のPAUSE命令の最適な挿入回数がアーキテクチャごとに異なることを検証する研究(慶應義塾大学 河野研究室 修士研究)。

背景

データセンタでは同じIntel x86_64でもBroadwell・Skylake・Ice Lake(Sunny Cove)など異なる世代のマシンが混在してデプロイされている。しかし、マシンごとのマイクロアーキテクチャ差を考慮した性能最適化はほとんど行われておらず、同じアプリケーション設定がそのまま使い回されているのが実情。

着目点

スピンロックなど主要なOSSで広く使われているPAUSE命令(プロセッサにスピン中であるというヒントを伝える命令)の実行サイクル数は、アーキテクチャによって大きく異なる。実測では、Broadwell(Intel E5-2640 v4, 2.4GHz)が21.90サイクルなのに対し、Skylake(Xeon Silver 4110, 2.10GHz)は156.38サイクルとBroadwellの約7倍、Sunny Cove(Xeon Silver 4314, 2.40GHz)は53.27サイクルだった。

検証方法

スピンロックはロック獲得に失敗すると「PAUSE命令をN回挟むスピンループ」→「OSへのスリープ」という2段階の待機戦略を取る。ワークロードにはMemcachedを使用し、ロック獲得失敗時に即座にスリープするデフォルト実装に対し、MySQLの待機戦略を参考にPAUSEスピンを追加実装。Broadwell・Skylake・Sunny Coveの3世代で、スピン内のPAUSE挿入回数N(0〜200)を振りながらmutilateベンチマークでスループットを測定した(4コア4スレッド、同時発行リクエスト数32、読み書き比率1:1)。

結果

アーキテクチャごとに最適な挿入回数Nが異なり、PAUSE命令のサイクル数が大きいアーキテクチャほど少ない挿入回数でスループットのピークに到達した。いずれのアーキテクチャでも、Nを増やすとスループットは向上するが、ある点を超えると過剰な挿入によって徐々に悪化するという共通のパターンが見られた。

今後の課題

この挙動について2つの仮説を検証中: (1) N=0からピークにかけてはバス競合の緩和とwake-upコストの減少が効いている — キャッシュミス回数の計測で検証する。(2) Nが過剰になるとロック解放への応答が遅れる — futexシステムコールの呼び出し回数の計測で検証する。今後はOSメトリクスを実測して定量的に裏付けたうえで、他のワークロードや他のマイクロアーキテクチャへも検証範囲を広げる予定。