Linux系のChromeで大量のGETリクエストが保留中でスタックする問題

ものすごく久しぶりのエントリ

とあるWebアプリの開発でdevモードで動かした場合にいろんなモジュールを引っ張ってる都合上、アプリケーション起動時に1000リクエスト以上のGETが走るようなアプリケーションを作っていたのだが

ある日を境にアプリケーションが起動しなくなる

とても困った。

諸事情により開発マシンをMacからUbuntuに移行してしばらく開発していたのだが、とあるひ急にアプリケーションが立ち上がらなくなった

立ち上がらない原因に関しては、表題にもあるとおりアプリケーション起動時のリソース取得リクエストが一部「保留中」のステータスのまま返ってこずスタックしているような状態になっている

Webサーバー側のログを見ても該当リソースを200番で返してるし、実際のリソースに直接アクセスすればちゃんと表示される

FFでは再現せず、Chrome(とEdge)で起きるのでWebkit絡みのなんかなのかなぁと思いとりあえずググる

同じ事象起きてる人おった

viteのモジュール大量に読み込んだ場合にLinux環境のChromeで発生しているっぽく、思いっきり同じ事象

原因

ホスト環境の一度に開けるファイル数制限に引っかかりスタックしているとのこと
Chromeとかに関しては特別なにかしてないと並行して一気に取得しにいくっぽいので、その際に制限に引っかかるとスタックするっぽい

事象が再現する環境で試しにdevツール上のスロットリング設定で低速とかにしてファイル取得を極端に遅らせたりすると正常に開けたりした

FFで再現しないのは単純に並行して取得しに行く本数が少ないとかな気がするので、ほっとけばそのうちFFでも発生しそうな気はした

修正方法

ホストOS(今回の場合はUbuntu)の同時に開けるファイル数の設定値を増やす

対象ファイル(元ファイル)

/etc/systemd/system.conf /etc/systemd/user.conf

上記対象ファイルに以下設定値を追加
※コメントアウトされている場合はコメント外して値追記でも可
※設定値については元記事の値を一旦そのまま引用

DefaultLimitNOFILE=65536

元ファイルを直接編集したくない場合は、差分で適用することも可

対象ファイル(差分ファイル)

/etc/systemd/system.conf.d/custom.conf

confファイルがなければ作成して以下追記
※ 既にあるなら DefaultLimitNOFILE を追記

[Manager] DefaultLimitNOFILE=65536

ファイル追記が完了したら、ログオフしてログインし直せば反映されてるはず
※されないケースもあるみたいなのでその場合は再起動

DefaultLimitNOFILE について

設定値の内容自体は最大ファイルオープン数
コロンで区切って書けばソフトリミットとハードリミットで分けて定義できるっぽい

DefaultLimitNOFILE=[ソフトリミット数]:[ハードリミット数]

今回は開発環境なのでざっくり指定

いじょーう