Memo

メモ > サーバ > 各論: トラブル対応例 > サーバが重い・サーバに繋がらない 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