公開できる範囲で個人的なISUCON対策TIPSを整理していきます。
MySQLのスロークエリログの設定
mysqlのconfファイルに追加する。
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 0.1 ← 閾値を設定。0に設定すると全てのSQLがスロークエリとして出力される。
log-queries-not-using-indexes
MySQLのスロークエリログを解析
MySQL標準のmysqldumpslowコマンドを使います。-sオプションはソートの基準を指定しており、tは総合合計時間です。-tオプションは上位何件までを出力するかで、例では上位5件を出力します。
mysqldumpslow -s t -t 5 /var/log/mysql/mysql-slow.log
my.cnfテンプレ
my.cnf修正箇所のテンプレです。これはあくまでもテンプレなので状況に応じてカスタマイズください。
## 外部のサーバから接続させるための設定。複数台構成では必須。
#bind-address = 127.0.0.1
## クライアントが接続する際に名前解決を無効にしてくれる。
skip-name-resolve
## 実際の環境ではダメですが、少しでも速くするためにbinlogを止める。
disable-log-bin
## スロークエリログ設定。まっさきに設定するもの。そして終了間際では忘れずに止めること。
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 0.1
log-queries-not-using-indexes
## InnoDB関連(値はデータ量によって調整)
innodb_buffer_pool_size = 128M
innodb_log_file_size = 16M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
skip_innodb_doublewrite
## アプリの負荷が高い時は気にしなくてよいが、アプリの負荷が解消されDBの負荷が高くなってきたら要チェック
max_connections = 500
thread_cache_size = 300
再起動後に特定のコマンドを実行させる
ISUCONでは単純にハイスコアを出せばいいわけではなく、再起動後でもきちんとサービスが稼働することが求められます。これが意外と落とし穴らしく、競技中に本戦出場枠に入ったチームでも再起動テストに失敗し、予選落ちしたケースがあるようです。
systemdやsupervisordを使って常駐プロセスにすることも可能ですが、とにかく再起動後にコマンド実行し常駐化させるのであればcronで実現できます。
@reboot [実行したいコマンド]
これを実際の運用環境で使うのは厳しいですが、ISUCONであれば使えるテクニックです。
随時更新していきます!