场景:游戏玩家不能登录游戏,自己尝试登录发现 确实登不上,整个区服都被限制了。
查看login日志,发现 报错:too many open files
何为文件句柄数:
files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。-
修改服务器限制:
ulimit -a 查看当前 open files 值:
修改:
1) 仅当前终端生效:
ulimit -HSn 102400
2)修改配置文件(需重启服务器后生效):
添加以下语句进 /etc/security/limits.conf
- soft nofile 102400
- hard nofile 102400
- soft core unlimited
- hard core unlimited
3)修改 启动脚本文件,如/etc/profile(每次打开终端都会生效):
添加如下内容:
sudo ulimit -HSn 102400
附: 有个内核参数也会限制open files
/proc/sys/fs/file-max 文件
怕以后还会出现这种状况,就做了个监控。
- 截取最新的login 日志,如果 出现 errno=Too many open files 字段则zabbix 报警
/etc/zabbix/zabbix_agentd.conf 里加如下字段:
UserParameter=open_file,grep "errno=Too many open files" /xxx/loginserver.log| wc -l
重启客户端 再配置 zabbix 网页端即可
2.利用 lsof
lsof(list open files)是一个列出当前系统打开文件的工具。
计算当前 打开文件数总和:
lsof | awk '{print $2}' | wc -l
本来想把上面命令的数值直接输出到 zabbix监控,
但是由于条目过多 ,运算时间超过30 s,
zabbix timeout默认值是3秒,最大也只能设置成30秒
所以不可行 。
但其实可以 运行一个 计划任务 , 把执行输入 到文件里,利用zabbix 读取就可以了