too|too many open files 问题

场景:游戏玩家不能登录游戏,自己尝试登录发现 确实登不上,整个区服都被限制了。
查看login日志,发现 报错:too many open files

  1. 何为文件句柄数:
    files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。
  2. 修改服务器限制:
    ulimit -a 查看当前 open files 值:

    too|too many open files 问题
    文章图片
    图片.png
修改:
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 文件

too|too many open files 问题
文章图片
图片.png 怕以后还会出现这种状况,就做了个监控。
  1. 截取最新的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
【too|too many open files 问题】本来想把上面命令的数值直接输出到 zabbix监控,
但是由于条目过多 ,运算时间超过30 s,
zabbix timeout默认值是3秒,最大也只能设置成30秒
所以不可行 。
但其实可以 运行一个 计划任务 , 把执行输入 到文件里,利用zabbix 读取就可以了

    推荐阅读