ドラコレでやってる技術的な話
昔、ドラコレのディレクターさんの話を聞く機会があったので
そこで伺った技術的な話のメモ
既にいろんなサイトとかで書かれている内容が多いかな
「5秒ルール」への対応(2種類)
SNSプラットフォームでは、5秒以内に応答を返さなければならないというルール
⇒5秒を超えてしまうとサービスが止められてしまう
SYN再送を短く固定
SYN再送を1秒に固定するようOSカーネルの設定
スクリプトの実行時間を制限
5秒以上かかりそうな応答をキャンセルする仕組み
PHPを使うアプリケーションの場合
set_time_limit()関数を使えばスクリプトの実行時間を制限できます。
この関数はWindowsとLinuxで挙動が異なるので注意が必要
Linux上で動作するPHPでは、「PHPのプロセスが処理に費やした時間だけ」が計測の対象
サーバとの接続待ち、応答待ちの時間などは計測されず、タイムアウトしません
タイムアウトの実装にsetitimer()関数が使われていて、第1引数に指定できる3種類のタイマーのうちITIMER_PROFを使っているため
引数にITIMER_REALを指定すれば計測の挙動を変更できます
PHPは100%非同期シグナルセーフとはいえない
時間指定の単位を1秒未満の精度にする
タイムアウト時のHTTP応答を変更可能にする
TIME_WAITでセッションリサイクルを調整
ピーク時間帯においてプラットフォームとコナミ間の通信で1,000セッション/秒を超えてセッションリサイクルが間に合わない状況が発生する
プラットフォーム側のTIME_WAITがLinuxデフォルト60秒より短い設定になっている
Linuxデフォルト60秒のコナミ側がセッションを回収するより前に新しい接続が送信されてきて、ぶつかってしまう
TIME_WAITを60秒から5秒にOSカーネルの設定
データベースのチューニング
net_slave_timeoutは短くする
スレーブサーバでは、しばしばレプリケーションが行われなくなっていることがあります
MySQLはこのことを認識しません
プリケーション通信が行われない場合のコネクション再接続時間が長い
標準で3,600秒
max_binlog_sizeは小さくする
バイナリログがローテーションされるサイズのしきい値を指定
標準で1GBが設定
これではI/O負荷が高くなり、処理の滞留が発生
この値を200~300MB程度に減らすことで1回あたりのログ削除負荷を軽減し、処理滞留を防止
innodb_log_file_sizeは最大に
MySQL5.1+InnoDB Plugin、あるいはMySQL5.5を使う前提では、innodb_log_file_sizeとinnodb_log_files_in_groupでInnoDBログの
ファイルサイズが常に最大の約4GB
ギリギリまで拡大
標準でinnodb_log_file_size = 2047MB
innodb_log_files_in_group = 2
実際のところ、シャットダウン時のクラッシュリカバリ時間には、あまり影響しません。
MySQLの通信は圧縮する
MySQLサーバとの通信はプロトコルがほぼテキスト形式であるため、zlibによる圧縮が有効
非圧縮時に比べ40%程度まで帯域を節約
同様に、マスターとスレーブの両方でslave_compressed_protocolを有効
レプリケーション通信も圧縮可能
CPU負荷の上昇は影響を与えるレベルではない
帯域が従量課金制の場合や、通信が安定しづらいクラウドサービスで非常に有効
(PHPでPDO+mysqlndの組み合わせで接続している場合、圧縮機能が実装されていません)
パーティションは有効に
MySQL5.1系からパーティショニング機能が使える
パーティショニング機能はテーブルをIDや日次ごとなどに分割する機能
機能はバトルログなどが溜まりがちなソーシャルゲームでは非常に有効
古いログを削除するために大量のDELETEを行う必要がありません。
ただし、バグの少ない最新版を使うように
my-innodb-heavy-4G.cnfは使わない
ソースディレクトリのsupport-filesディレクトリ内のmy.cnfテンプレートにあるもの
OLTP系のサーバにはまったく不適
そもそもMySQLには今となってはあまりよい設定テンプレートがついていない
ベースにするのであればmy-huge.cnfがおすすめ
slow_query_log_file, log-errorは必ず指定する
スロークエリログのファイル名、エラーログのファイル名を指定
指定しないとログ名にホスト名が入ってしまうため、ログのローテーションやログ監視が煩雑
システムを使うにつれて響いてくるポイント
アラート通知は「Nagios」
統計情報は「Cacti」