書籍 Systems PerformanceのChapter 1の1.9節 Case Studiesの話。
- データベースチームから、データベースサーバのディスクが遅いと言われる。
- ディスクが遅いということが、データベースの問題を引き起こす直接の原因かどうかはわからない。
- データベースチームに下記の質問をしてみた。
- 現在、データベースの性能に問題はあるのか?どのようにしてそれを測定したのか?
- 問題はどれくらいの間起きているのか?
- 最近、データベースに何か変更を加えたか?
- なぜディスクを疑ったのか?
- 返答があった。
- USE(The Utilization Saturation and Errors)メソッドでリソースボトルネックを調査した。
- USEメソッドを達成するために、サーバのログを見たり、コマンドを叩いたりしなければなかった。
- この現象がデータベースを本当にブロックしているかを確認するために、動的トレーシングツール(Dtraceなど)を使った。
- クエリ処理のうち、ms単位でファイルシステムのreadがデータベースをブロックしていることがわかった。
- なぜブロックしているのか?
- ワークロードの性質をみるために、iostatでIOPS、スループット、平均ディスクI/Oレイテンシ、read/writeの比率を測定した。
- これらの情報から、平均I/Oサイズとアクセスパターン(ランダムかシーケンシャルか)を計算した。
- より詳細をみるために、ディスクI/Oレベルのトレーシングを使った。
- しかし、これらの調査はディスクの負荷が高いとわかるだけで、ディスクそのものが問題ではないことがわかってきた。
- データベースの負荷は増えたのか?
- CPU負荷が上がらずに、ディスクI/O負荷が上がることはありえるのかを考えた。
- 同僚はファイルシステムのフラグメンテーションではないかと言っていたが、ディスクの使用量はたったの30%だった。
- ディスクI/Oの真の原因をドリルダウンすることはできそうだが、時間がかかりそうだった。
- ファイルシステムキャッシュのヒットレートは現在91%であることをチェックした。
- ファイルシステムキャッシュサイズとメモリの使用状況に関心が移った。
- 開発チームはアプリケーションのプロトタイプを持っていて、プロダクションレベルの負荷がないわりに、そのアプリケーションがメモリを徐々に食いつぶしていた。
- したがって、ファイルシステムキャッシュ用のメモリが足りなくなっていた。
- アプリケーションを停止させて、他のサーバに移した。
普通は、プロダクションのデータベースサーバにアプリケーションが同居しているとかありえないし、topでメモリソートするかpsして変なプロセスみつけるだけで問題に気づきそうな気がする。
とはいえ、一見負荷が高いことしかわからないということはよくある。 このようなときにツールで調査するだけでは真の原因にたどり着けることは難しくて、システムのモデル(今回のケースではファイルシステムキャッシュ)を把握しておく必要がある。
本題とは関係ないけど、OSの負荷をみれないデータベースチームというものがあるのか。

Systems Performance: Enterprise and the Cloud
- 作者: Brendan Gregg
- 出版社/メーカー: Prentice Hall
- 発売日: 2013/10/26
- メディア: ペーパーバック
- この商品を含むブログを見る