innodb_buffer_pool_sizeの違いによるアクセス速度の変化

MySQLinnodb_buffer_pool_sizeはインデックスやテーブルデータのインメモリキャッシュサイズであり、かなりパフォーマンスに影響するパラメータとして知られています。

RDSなんかだと、デフォルトでDBメモリサイズの 3/4になるっぽいのですが、MySQLを自前で構築すると、デフォルトとして128MBになってしまうので、ぜひパラメータを調整したいところです。

今回は先日作った検証環境 上でinnodb_buffer_poolサイズを変えながらリクエストをさばく速度に差が出るのかを計測してみたいと思います。

計測条件

  • システム構成

    • nginx + rails + mysqlをdocker compose上に構築し、k6からリクエス
    • DB
      • メモリ1GB
      • 10万レコードのテーブルと30万レコードのテーブルをrailsからselect
  • 計測指標

    • avg http req duration P90 [s]: リクエストの応答にかかった時間の平均の90パーセンタイル
    • http req per sec [count]: 秒間リクエスト数
  • 動かすパラメータ
    • innodb_buffer_pool_sizeを 128MB (デフォ)、800MB (今回のメモリの80%)、2GB (今回のメモリの200%) それぞれ計測

結果

avg http req duration P90 [s]は 800MB < 2GB < 128MB という結果となりました。(少ないほどよい)

http req per sec [count]は 800MB > 2GB > 128MB という結果となりました。(大きいほど良い)

innodb_buffer_pool_sizeはメモリの80%がよいとされているのですが、予想通りの結果となりました。

buffer_pool_sizeがRAMの量をオーバー(今回計測の2GB)の場合、スワップ領域を使うため、スワップインアウトにコストがかかるため遅くなるとのことです。