DPDKのスピンループがSMT環境下で他の論理コアのリソースを浪費する問題を、PAUSE命令の選択的な挿入によって解消し、ネットワークアプリケーションのスループットを落とさずに計算集約型タスクのスループットを最大18.5%向上させた研究(慶應義塾大学 河野研究室 卒業研究)。
DPDKはPoll Mode Driver(PMD)でNICキューを直接ポーリングすることで高速なパケット処理を実現するが、ポーリングはスピンループで実装されており、パケットが届かないI/O待ちの間もCPUを占有し続ける。SMT環境では同じ物理コアを共有する他の論理コアのリソースを奪う形になり、実効CPU利用率が低下する。実際にSMT下でスピンループと計算集約型タスクを同時実行すると、計算集約型タスクのスループットが単体実行時より16%低下することを確認した。
スピンループのポーリングでパケットを受信しなかった場合にのみPAUSE命令(cpu_relax相当)を挿入する方式を提案。PAUSE命令はプロセッサに「スピン待機中」であることを伝えるヒント命令で、他の論理コアへのリソース配分を促す。毎回ではなくパケット未受信時のみ挿入することで、パケット到着時の検知遅延によるスループット低下を避けつつCPU浪費を削減する。
SMTを有効化したサーバ(6コア Xeon E-2336)上で、同一物理コアの論理コアにDPDKネットワークアプリケーションとsysbenchをそれぞれ配置。DPDKアプリケーションとして自作のUDPエコーサーバ、f-stack nginx、f-stack redisの3種を使用し、送信レートを変えながら両者のスループットを計測した。Turbo Boost・P-State・C-Stateを無効化し、CPU状態変動による測定誤差を排除している。
提案手法によるDPDKアプリケーション自体のスループット低下はほぼ確認されず(低下率最大0.54%)、パケット処理性能を維持したまま、同時実行しているsysbenchのスループットが向上した。向上率はエコーサーバで最大18.5%、f-stack nginxで最大1.37%、f-stack redisで最大1.14%。いずれもネットワーク負荷が低いほど(PAUSE命令の実行回数が多いほど)向上率が高くなる傾向が明確だった。
エコーサーバとf-stackとで向上率に差が出た主因は、アプリケーション自体が消費するリソース量の違い。エコーサーバは受信パケットをコピーして送るだけの軽量処理でレイテンシも30μs前後と低く安定している一方、f-stack nginx/redisは複雑な処理を伴いレイテンシが最小でも450μs以上、高負荷時は300ms近くまで増加する。処理が重い分スピンループ1周にかかるサイクル数が多く、PAUSE命令の実行回数(=他コアにリソースを譲る機会)自体が少なくなるため、sysbenchへの還元効果も小さくなると考えられる。
本実験はDPDKアプリケーションとsysbenchの2タスクのみの単純な構成。sysbenchのCPUテストは整数演算中心でメモリアクセスやキャッシュ負荷がほとんどなく、実データセンタで起きるようなリソース競合を再現できていない。また、PAUSE命令の効果はCPUマイクロアーキテクチャによって異なることが知られており、今回使用したXeon Silver 4110以外のCPUでの検証も必要。