未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

spin-waitの実装とHyperThreading (MySQL)

このところあるプロジェクトでMySQLPostgreSQLベンチマークを行っている。OSDL DBT-1というTPC-Wのようなベンチマークを実施している。PostgreSQLは某社の16CPUというとてつもないマシンでの計測で、U社の皆様が計測したデータに対していろいろレビューをしたり考察をしている。MySQLの方はSC社と共同でIntelのDual-CoreマシンでHyperThreadingをONにしたりOFFにしたりしてその挙動を調べている。
IntelHyperThreading(以下HTと記す)というのは非常に大雑把に言えばCPUチップの中に各種レジスタを2セット用意し、同時に2つの実効ができるという代物である。完璧に2つのCPUがあるのではなく、キャッシュは共有していたり、見えないところでいろいろ制約がある。
HyperThreadingをONにして、ある条件のもとDBT-1を実行すると性能が劣化する場合があることを発見した。いまその原因を調査中である。調査の流れは以下のような感じになる。

  • HTをON/OFFして、それぞれのoprofile(実行プロファイリング)データを取得する。
  • oprofileデータを比較し、顕著な差を発見する。
  • 発見した部位のソースコードを眺め原因を推測する。
  • 仮説を立て、問題を解決すると予想される解決策を検証してみる。
  • 上記を仮説が立証されるまで繰り返す。

HTをONにしたときMySQLのmutex_spin_waitというルーチンでHTをOFFにしたときよりかなり多くの時間を費やしているので、取りあえずこのルーチンから調べることにした。
oprofileを使えば、差の部分を発見するところまで一直線で行ける。そこからは一進一退で試行錯誤を繰り返しながら仮説検証プロセスを楽しむ。MySQLのパッチを作って楽しんでいる今日この頃である。問題が解決するといいなあ。