Too many open filesの理由検索

3084 ワード

現在、ネット上の複数のマシンにToomany open filesというエラーが発生し、アプリケーションにアクセスできません.
原因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の理由