Nginx on Fargate で発生した Resource temporarily unavailable エラーを調査した
Nginx を Fargate で起動しているが、検証中にすぐにリクエストが詰まってしまう事象に悩まされました。
その際に調査したことをまとめます。
エラーログレベルを debug に設定
元々 info にしていたが、それらしいログが確認できなかった為、
nginx の設定ファイルでエラーログレベルを debug に設定しログを確認してみます。
1 | error_log stderr debug; |
すると以下ログが確認されました。
1 | accept() not ready (11: Resource temporarily unavailable) |
accept()
が一時的なリソース不足で準備できてない、とのこと。
Nginx の通信の仕組み上、 accept()
が担当している箇所は以下図がわかりやすいです。
net.core.somaxconn を調べてみる
net.core.somaxconn は TCP ソケットが受け付けたリクエストを格納する、キューの最大長です。
受け入れ可能なリクエスト数が小さいのでは?という仮説を立てました。
Nginx コンテナに入って以下実行します。
1 | sysctl net.core.somaxconn |
非常に少ない!
ここの設定を変えたい!
Dockerfile で変更できるか試してみる
1 | RUN sysctl -w net.core.somaxconn=1024 |
エラーになった (T へ T)
1 | #21 0.370 sysctl: error setting key 'net.core.somaxconn': Read-only file system |
Fargate でできないものか?
1 | docker run --sysctl net.core.somaxconn=65535 ... |
Fargate の設定でできないものか?
【週刊 Ask An Expert #04】AWS Loft Tokyo で受けた質問まとめ #AWSLoft
Q: Fargate で net.core.somaxconn を変更したい
現時点では Fargate では変更できないので、タスクを多く起動して頂くことで解決して下さい。
結論
現状、Nginx で発生する Resource temporarily unavailable
の解決は、素直にタスク数を増やすことで対応するしかない!
AWS のコンテナロードマップには issue として上がっている。
いずれ Fargate でも対応される日は近い… はず!
Nginx on Fargate で発生した Resource temporarily unavailable エラーを調査した
https://kenzo0107.github.io/2021/04/15/2021-04-16-nginx-on-fargate-somaxconn/