2009年9月9日水曜日

【注意】PowerPCのマルチプロセッサとInnoDB

多分、関係ある人にはクリティカルな内容なので、急いで報告します。

ここ2週間くらい、とある案件で頭を悩ませていました。
POWER5 の 8コア構成の IBM のサーバ(Linux)でMySQL(InnoDB)を利用すると、どのバージョンでも(ビルトインInnoDBでも、InnoDB Pluginでも、GCC atomic builtin を使わなくても)しばらくするとハングアップ/クラッシュするそうなのです。

紆余曲折ありましたが、どうも自分の仮説が正しそう(作ったパッチが効果ある模様)なので、先ほどバグレポートを報告しました。

All InnoDB (builtin and plugin) is unstable at PowerPC SMP server

簡単に言うと、InnoDBのコードはIntel CPUのSMPの仕様に依存した作りになっています。Intel系CPUのSMPでは、メモリへの書き込みは他のCPUのキャッシュにも自動的に影響して一貫性を保つのですが、PowerPCではCPU間のキャッシュの一貫性確保を明示的に行う必要があるのです。

結論から言うと、残念ながら、PowerPCのマルチプロセッサ構成でInnoDBを利用するのは危険。ということになります。

もう引き下がれない人や、既にハングアップに悩まされている人は、とりあえず当該レポートにアップロードしておいたパッチで InnoDB Plugin 1.0.3 を使ってみてください。ハングアップの可能性はかなり減る筈です。

-------
(2009/10/9 追記)
大幅に改善したものの、ハングアップの可能性がまだあるようです。
うーむ、__sync_synchronize() は sync になるようだが、store に対する memory barrier にはなってないのかも。
該当個所を asm volatile ("isync") に書き換えてみるか…(独り言)

-------
(2009/10/20 追記)
現在のパッチを同じバグレポートにアップロードしておきました。
動作は今のところ大丈夫そうです。