個人的に良く修正しているもの
ファイルディスクリプタが足りないとき
SocketもFDに含まれるのだがつい見過ごされる。大体最初にこの手のエラーが発生する。
NginxのToo many open filesエラーなど。
ulimit -n
で確認するが、当該エラーが発生したユーザで実施することに注意。rootだと異なる設定の場合がある。
[anyuser]$ ulimit -n
1024
この場合は、1024個しかFDが利用できない。
対応策
limits.confを修正する。場合にもよるが、rootだけFDが設定されていることも多く、何も設定されていない場合、デフォルトが1024になることに注意すること。
ソフトリミットもハードリミットも変更しておく。
値は、適宜決める。
以下は、anyuserのFDを変更する場合。
* soft core unlimited
* hard core unlimited
root soft nofile 65536
root hard nofile 65536
anyuser soft nofile 65536 ←ここを追加
anyuser hard nofile 65536 ←ここを追加
確認方法
/etc/security/limits.confに記述しても反映されていないことがある。
サーバへSSHして、当該プロセスのプロセスIDを確認し、cat /proc//limitsで確認すること。
port枯渇やらなんやら
リソースネックになっていないにもかかわらず、スループットが出ないような場合、any port枯渇に陥っている場合がある。
だいたいこういう場合当該サーバをnetstatで調べてみるとTIME_WAITが大量発生し、any portを使い切っている可能性がある。
割とよくある。
https://qiita.com/kuni-nakaji/items/c07004c7d9e5bb683bc2
これは以下のコマンドで確認することができる。
[root@]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 1/systemd
tcp 0 0 127.0.0.1:25 0.0.0.0: LISTEN 1211/master
tcp 0 0 0.0.0.0:12127 0.0.0.0: LISTEN 8689/sshd
tcp 0 0 10.140.180.223:12127 10.140.50.217:61738 ESTABLISHED 14604/sshd: appladm
tcp6 0 0 :::40042 ::: LISTEN 12232/java
tcp6 0 0 :::111 ::: LISTEN 1/systemd
tcp6 0 0 :::8080 ::: LISTEN 12232/java
tcp6 0 0 :::34710 ::: LISTEN 12232/java
tcp6 0 0 :::12120 ::: LISTEN 12232/java
tcp6 0 0 ::1:25 ::: LISTEN 1211/master
tcp6 0 0 :::12127 ::: LISTEN 8689/sshd
tcp6 0 0 10.140.180.223:42881 10.140.197.150:3306 ESTABLISHED 12232/java
対応策
以下のip_local_port_rangeを修正し、tcp_tw_reuseを1に修正すること。(tcp_tw_reuseのエントリがない場合は追記すること。)他パラメータの修正はあまりお勧めしない。
net.ipv4.ip_local_port_range = 30000 65500
net.ipv4.tcp_tw_reuse = 0
完了したらsysctl -p
で反映。