Linux too many open files
后端往浏览器推送设备告警事件,使用server sent event(服务器向浏览器发生消息),
代码是从网上copy的,发生程序卡死没反应,浏览器一直在加载转圈圈。登录服务器查看日志,一直在报"too many open files",
解决方法从网上找的,增加程序允许打开的文件数,没卵用,多存活一段时间罢了。
ulimit -a
cat /proc/sys/fs/file-max
cat /proc/进程PID/limit
# 查看某一进程的打开文件数量
lsof -p 进程PID | wc -l
例:lsof -p 1234 | wc -l
TCP localhost:webcache->localhost:46910 (CLOSE_WAIT)
服务器出现大量TCP处于CLOSE_WAIT状态,而且在一直缓慢增加,达到程序最大打开文件数后,程序会卡死无反应
服务器存在大量sock句柄,而且在一直缓慢增加,达到程序最大打开文件数后,程序会卡死无反应
。
。
。
。
总结原因:检查了两天发现是server sent event(服务器向浏览器发生消息),按照网上教程写的(copy),超时设置成不过期,导致一直存在。nginx又设置成10分钟过期,变成10分钟永久+1条了。
经过测试程序在打开文件数达到1W条左右时就卡死了,打开网站的人多了很快就没反应了。
// 设置超时时间,0表示不过期。默认30秒,超过时间未完成会抛出异常:AsyncRequestTimeoutException
SseEmitter sseEmitter = new SseEmitter(0L);
解决方法:将SseEmitter设置成超过10分钟主动断开(时间自己定,就是要主动关了,让它重新连接),然后客户端会重新发起连接。这样就基本连接的有几个人就只有几条sse连接了,不会再出现异常增加没关掉的情况。
SseEmitter sseEmitter = new SseEmitter(600000L);