Jenkinsのプロジェクトを増やしたらテストがこけるようになってつらかった。
はじめに
※Jenkinsが悪いわけじゃないです。
現在携わっているプロジェクトではテストの際に Test::mysqld を使用して並列にテストを回してました。
ただ、マスターデータのテストと機能系のテストが t/
にまとまっていて、マスターデータのテストだけをチェックしたいのに、時間がかかるな~ いう理由から
マスターデータのテストと機能系のテストを分け、Jenkinでそれぞれプロジェクトを作成回しはじめました。
最初はそれぞれのテストが早くなって、万々歳やーって喜んでいましたが、時々テストが落ちる用になりました。
原因
ログを見ると
InnoDB: Warning: io_setup() failed with EAGAIN. Will make 5 attempts before giving up. InnoDB: Warning: io_setup() attempt 1 failed. InnoDB: Warning: io_setup() attempt 2 failed. InnoDB: Warning: io_setup() attempt 3 failed. InnoDB: Warning: io_setup() attempt 4 failed. InnoDB: Warning: io_setup() attempt 5 failed. InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts. InnoDB: You can disable Linux Native AIO by setting innodb_use_native_aio = 0 in my.cnf
というmysqld
のプロセスが上手く立ち上がらずエラーになるという事が頻発して起きるようになりました。
エラーにあるとおり etc/my.cnf
に innodb_use_native_aio = 0
を追記してみましたが
変わらず。
なので色々と調べてみると
こちらのサイトに色々と書いてありました。
要約すると
aio-max-nr
という I/Oサブシステムの障害を防ぐために同時未処理リクエストを制限の設定をするためのもので、並列に回しすぎたがゆえに、その閾値を超えてしまい、
mysqlのプロセスがたたず、テストがこけるというものでした。
/etc/sysctl.conf
というカーネルの値を設定するファイルで fs.aio-max-nr
の閾値をあげてあげるといけるそうです。
手元の環境でためしてみました。 確かに mysql のプロセスが立ち上がるようになりました。
ただ、開発環境のvagrant/centos のload average が 20 とかになって調整は必要だと思います。
テストの方は並列数を調整して、mysql のプロセスがちゃんと立つように調整して事なきを得ました。
本当は、いい感じに fs.aio-max-nr
を調節して並列数もあげられるといいんですが…
まとめ
- 並列数の調節は難しいですね。
- この辺の話も含めて、 YAPC 2014 心穏やかなを運用するために ~人の褌で運用する~ で話せたらと思っているのでブクマ、tweet,いいね よろしくお願いします。
- 作者: 末広尚義,竹内一成,太田健一郎,西川茂伸
- 出版社/メーカー: 秀和システム
- 発売日: 2012/09
- メディア: 単行本
- 購入: 5人 クリック: 138回
- この商品を含むブログ (9件) を見る
- 作者: 深沢千尋
- 出版社/メーカー: 技術評論社
- 発売日: 2008/06/20
- メディア: 大型本
- 購入: 12人 クリック: 195回
- この商品を含むブログ (35件) を見る