はじめに
メモ
ファイルディスクリプターには 2種類リミット、ソフトリミットとハードリミットがある。ソフトリミットは物理的なリミットではない。Ruby ではリミットをこえると例外が起きる。ソフトリミットの最大値は変更可能。ハードリミットはスーパーユーザの権限があれば変更可能。リミットの get/set は Process.getrlimit/setrlimit。
リミットを変更する機会としては、負荷テストで httperf をつかって 5000 コネクションをはろうとしてリソースが不足してしまう場合はソフトリミットを増やせば解決する。
見つからなかった Process::RLIMIT_INFINITY
リミットを取得する定数として本では Process::RLIMIT_INFINITY と書いてあったけど見つからなかった。Process::RLIM_INFINITY がたぶんそれ。Ruby のバージョンで変わったのかな…? 昔の Ruby のバージョンまでは追ってないです。
試したこと
Process.setrlimit はユーザ権限では設定されている値より多くはできない。ルートではできた。また Process.setrlimit(:NOFILE, 4096, 4095) のようにハードリミットをソフトリミットより少なくしたらエラーが起きた。
ハードリミットを自分の環境で見てみたら 922京でした。でかい! 922京個もファイルを開いたらスペックをオーバーしちゃいますね。
分からなかったフレーズ
- imposed: 課す。limits which is imposed で ”制約がかけられている” というニュアンスだと思う
- bumping the soft limit: ソフトリミットを上げる。bump って ”押す” という意味しか知らなかったのでへーって思った