💽

MySQLをDockerでたくさん立ち上げると `Cannot initialize AIO sub-system` が出る

2021/04/22に公開

あるEC2インスタンスの中でdocker-composeを使って100個強のコンテナを立ち上げてます。そのうち20数個はMySQLのコンテナなのですが、20個くらいになったタイミングでAIOコンテキスト(非同期I/Oコンテキスト)が作成できないというエラーが起きてある一つのコンテナだけが立ち上がらなかった。

2021-04-14T18:02:25.591496Z 0 [ERROR] InnoDB: io_setup() failed with EAGAIN after 5 attempts.
2021-04-14T18:02:25.591587Z 0 [Note] InnoDB: You can disable Linux Native AIO by setting innodb_use_native_aio = 0 in my.cnf
2021-04-14T18:02:25.591649Z 0 [ERROR] InnoDB: Cannot initialize AIO sub-system
2021-04-14T18:02:25.591747Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2021-04-14T18:02:25.591790Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2021-04-14T18:02:25.591857Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2021-04-14T18:02:25.591883Z 0 [ERROR] Failed to initialize builtin plugins.
2021-04-14T18:02:25.591961Z 0 [ERROR] Aborting
2021-04-14T18:02:25.591987Z 0 [Note] Binlog end
2021-04-14T18:02:25.592067Z 0 [Note] Shutting down plugin 'CSV'
2021-04-14T18:02:25.594377Z 0 [Note] mysqld: Shutdown complete

最初のエラーメッセージは 2021-04-14T18:02:25.591496Z 0 [ERROR] InnoDB: io_setup() failed with EAGAIN after 5 attempts. でio_setup()実行時にEAGAINが返ってきたというものなのだが、これを調べてみるとMySQLコンテナを立ち上げる時にlibaioを使ってAIOが作成されていて、作成されるAIOの数がある上限に達するとシステムコールの戻り値にEAGAINが返される、というものだった。

AIOの上限値は変更できるということだったので下記で変更し、その後 docker-compose up を再実行すると無事すべてのコンテナが立ち上がった。

$ cat /proc/sys/fs/aio-max-nr 
65536
$ sudo sysctl -w fs.aio-max-nr=100000
$ cat /proc/sys/fs/aio-max-nr
100000

参考資料

https://yohei-a.hatenablog.jp/entry/20140407/1396893637

Discussion