线上服务报文件打开过多报错, Caused by: java.net.SocketException: Too many open files
Caused by: java.net.SocketException: Too many open files
at java.net.Socket.createImpl(Socket.java:460)
at java.net.Socket.<init>(Socket.java:431)
at java.net.Socket.<init>(Socket.java:244)
at org.apache.flink.streaming.experimental.CollectSink.open(CollectSink.java:80)
... 7 more
这是一个常见的异常,一般是系统设置 open files
过小,或者进程打开文件过多导致的。
首先检查系统参数
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 128544
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 655350
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 128544
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
发现 open files
设置正常,接下来需要排查是哪个进程出现文件打开过多或者句柄未释放问题
lsof -n |awk '{print$2}'|sort |uniq -c |sort -k 1 -n -r |head -n 10
652 23817
620 22936
388 22961
308 8843
132 31762
120 3578
116 9108
第一列为文件句柄数,第二列为进程id,通过发现句柄数并没有超多多大限制,到底是哪里出了问题呢……
谜底揭晓:
一般线上机器账号只会开放相应应用的权限,不能查看所有的进程,需要通过root权限查看多有进程的状况。通过root账号果然发现出问题的进程。
sudo lsof -n |awk '{print$2}'|sort |uniq -c |sort -k 1 -n -r |head -n 10