Too many open filesの理由検索
3084 ワード
現在、ネット上の複数のマシンにToomany open filesというエラーが発生し、アプリケーションにアクセスできません.
原因1:Linuxのopen files数が足りない
原因2:TCPパラメータの配置が間違っている
よく使われる3つの状態は、ESTABLISHEDが通信中であることを示し、TIME_WAITはアクティブクローズ、CLOSE_WAITは受動的にサーバーを閉じて大量のTIMEを維持したことを示している.WAIT状態
設定が有効になったら、結果を見て、TIME_WAITは著しく減少した.
理由3:Tomcatの構成が間違っている
connectionTimeout-ネットワーク接続タイムアウト、単位:ミリ秒.0に設定すると、タイムアウトしないことを示します.これにより、設定に危険があります.通常は30000ミリ秒に設定できます.現在の構成connectionTimeout=0
式によると、サーバ側最適スレッド数=(スレッド待ち時間+スレッドcpu時間)/スレッドcpu時間)*cpu数
テスト対象の検証
理由4:プログラムは多くのファイルを開いたが、接続を閉じなかった.
これまでずっとプログラムのどこかでファイルを開けたのに接続を閉じていなかったが、結果は出なかった.接続が開いてから、どのくらいで閉じることができるかを考えました.
解決すべき問題は,1)プログラムコードのどこにファイルが開かれているかをどのように位置づけるかである.2)開いているこれらのファイルはすべて必要ですか?3)can't identify protocolの理由
原因1:Linuxのopen files数が足りない
[root@chances125 ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 78454
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
# , open files 1024
lsof -p $java_pid | wc -l
#
ulimit -n 2048
#
# 。
#
cat /proc/sys/fs/file-max
# /etc/sysctl.conf
fs.file-max=2048
#
sysctl -p
原因2:TCPパラメータの配置が間違っている
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 7091
CLOSE_WAIT 2
ESTABLISHED 716
LISTEN 10
よく使われる3つの状態は、ESTABLISHEDが通信中であることを示し、TIME_WAITはアクティブクローズ、CLOSE_WAITは受動的にサーバーを閉じて大量のTIMEを維持したことを示している.WAIT状態
#
# , FIN-WAIT-2
net.ipv4.tcp_fin_timeout = 30
# keepalive ,TCP keepalive 。 2 , 300 , : ,
net.ipv4.tcp_keepalive_time = 300
# SYN Cookies。 SYN , cookies , SYN , 0,
net.ipv4.tcp_syncookies = 1
# , FIN-WAIT-2
net.ipv4.tcp_tw_reuse = 1
# TCP TIME-WAIT sockets , 0, , TIME-WAIT ,
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
設定が有効になったら、結果を見て、TIME_WAITは著しく減少した.
TIME_WAIT 2492
CLOSE_WAIT 10
ESTABLISHED 730
LISTEN 10
理由3:Tomcatの構成が間違っている
connectionTimeout-ネットワーク接続タイムアウト、単位:ミリ秒.0に設定すると、タイムアウトしないことを示します.これにより、設定に危険があります.通常は30000ミリ秒に設定できます.現在の構成connectionTimeout=0
式によると、サーバ側最適スレッド数=(スレッド待ち時間+スレッドcpu時間)/スレッドcpu時間)*cpu数
テスト対象の検証
理由4:プログラムは多くのファイルを開いたが、接続を閉じなかった.
これまでずっとプログラムのどこかでファイルを開けたのに接続を閉じていなかったが、結果は出なかった.接続が開いてから、どのくらいで閉じることができるかを考えました.
lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 3011 root 837u IPv6 3513129 0t0 TCP sc-epg-app15:8085->10.223.52.16:38494 (ESTABLISHED)
java 3011 root 838u IPv6 31731 0t0 TCP sc-epg-app15:8085->10.230.160.147:38903 (ESTABLISHED)
java 3011 root 839u IPv6 3667505 0t0 TCP sc-epg-app15:8085->10.251.207.71:35411 (ESTABLISHED)
#NODE TCP
#PID 3011, 。
解決すべき問題は,1)プログラムコードのどこにファイルが開かれているかをどのように位置づけるかである.2)開いているこれらのファイルはすべて必要ですか?3)can't identify protocolの理由