メモ > サーバ > 各論: トラブル対応例 > サーバが重い・サーバに繋がらない 13
サーバが重い・サーバに繋がらない 13
サイトが突然503エラーになった。
AWSコンソールで確認すると、Webサーバが二台ともロードバランサーから外れていた。
WebサーバのCPU使用率やネットワークINは普段より多いものの、異常と言えるほどではない。
10分ほど経つと自動で回復した。
以下調査内容。
RDSの状態を確認すると、15:50ごろから「DB接続(カウント)」がどんどん上がっている。
アプリケーション(Laravel)のログを確認すると、
Next exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction (SQL: update `stocks` set `deleted_at` = 2018-01-31 16:04:56, `updated_at` = 2018-01-31 16:04:56 where `stocks`.`deleted_at` is null and `id` = 469232)' in /var/www/w3package_v2/shared/vendor/laravel/framework/src/Illuminate/Database/Connection.php:624
と記録されている。
・15:50ごろにロックが発生した。
・RDS側で処理が詰まった。
・16:04にようやくログとして記録された。
という状況だと思われる。
その間にもどんどんアクセスが来るので、nginxのアクセス数上限に達して503エラーが返された?
それがもとでロードバランサーから外されてしまった?
設定ファイルでは以下のように設定されているので、「worker_processes * worker_connections」でnginxは1024の接続数を捌けるみたい。
/etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
2台のWebサーバがダウンしたことにより、アクセス元が無くなってロックが解除されたか。
もともと10分程度ロックし続ける処理で、それが終わったからロックが解除されたか。
…だと思われる。
根本解決は難しいが、いったん
「どうしても長く処理すべき処理以外は、タイムアウトの時間を短くする」
で対応できるか検討する。
・ロックした状態でPHPからSELECTするとどんな挙動になるか。
・500番台のエラーになるのか、200番台で処理を返せるのか。
・ロックを検知して強制解除はできるのか。
などは要検証。
MySQLのプロセス確認と強制終了の方法は、
Command.txt の「MySQLでプロセスを確認&強制終了」を参照。
デッドロックおじさん戦記 - Mercari Engineering Blog
http://tech.mercari.com/entry/2017/12/18/deadlock
MySQLのデッドロックを意図的に発生させる
http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E3%83%87%E3%83%83%E3%8...
MySQLのデッドロックを解除
http://fukuchiharuki.me/wiki/index.php?MySQL/%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E8%A7%A3%E9%99%A4%...
MySQLの障害解析方法。ロックについても触れられている
https://qiita.com/muran001/items/14f19959d4723ffc29cc
Advertisement