読者です 読者をやめる 読者になる 読者になる

GR

ゲーム好き。スマホゲームはユーザーとして遊びつつ運営する側のこととか考えてます。

ドラコレでやってる技術的な話

昔、ドラコレのディレクターさんの話を聞く機会があったので

そこで伺った技術的な話のメモ

既にいろんなサイトとかで書かれている内容が多いかな

 

「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%非同期シグナルセーフとはいえない

   POSIXタイマーとPOSIXリアルタイムシグナルを使う

   時間指定の単位を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