@Konboi memo

主に技術に関してつらつらと。

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.cnfinnodb_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 を調節して並列数もあげられるといいんですが…

まとめ

入門Jenkins―実践「継続的インテグレーション」

入門Jenkins―実践「継続的インテグレーション」

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl