今天dus服务并发量稍高,然后程序内部不停地报错 too many open files ,linux 系统对打开文件数是有限制的。介绍这个的文章很多。查看服务器上系统设置的最大限制,运维设置的是 102400,列出所有进程的打开文件数目 lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more ,服务程序打开文件数最大时也才1w多,所有进程打开文件最大值加起来也才五六万,远远没有达到 102400,一直不解为何报这个错误,最后查看程序进程的限制 cat /proc/32523/limits ,发现限定值居然是 1024
Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 31170 31170 processes Max open files 1024 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 31170 31170 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
服务是通过 systemd 启动的,原来在 service 中有个设置项可以设置程序能打开的最大文件数,可是我的 service 文件中没有设置,于是默认限定为 1024,很容易就超了。修改添加配置项
[Service] LimitCORE=infinity LimitNOFILE=102400 LimitNPROC=102400
重启服务,再次查看 cat /proc/32523/limits ,Max open files 成功变为 102400,再也没有报这个错,解决。