AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

行き先を失ったプロセスを kill して平和を取り戻す

アプリケーション側で実行流量の制御をしておらず、人力で大量にアクセスすると死ぬ機能がリリースされてしまい、無事に死亡する事案に遭遇していた。

タイムアウト時間を超えた MySQL 内プロセスを kill する

対象を抽出する

以下のようにすると、カンマ区切りで kill すべき ID が取れる。

time >= 60 で、60 秒以上経過しているプロセスを状態問わず絞り込んでいるので、例えば前面の ALB だったり httpd, Nginx なりのタイムアウトが 120 秒だったりする場合は、ここを time >= 120 とすればいい。

mysql> SELECT GROUP_CONCAT(id) FROM information_schema.PROCESSLIST WHERE time >= 60 and user != 'rdsadmin';
+------------------+
| GROUP_CONCAT(id) |
+------------------+
| 1, 2, 3, 4       |
+------------------+
1 row in set (0.00 sec)

これを kill する。

対象を kill する

一件ずつならそのまま MySQL CLI から kill ${id}; のようにして消せるが、今回はまとめて消したいので mysqladmin を使う。

# example.1145148101919.ap-northeast-1.rds.amazonaws.com こんなエンドポイントは実際に存在しないので例です、存在してたまるか
❯ mysqladmin kill 1, 2,3,4  -u example -p -h example.1145148101919.ap-northeast-1.rds.amazonaws.com

これでよい。

ちなみに同時に 70 くらい id 指定して mysqladmin から kill 投げたりしているけど、コマンドが壊れたりはしていないので、ある程度多い場合はこちらで消しましょう。

参考

qiita.com