Too Many Open Files错误导致VNC灰屏问题

问题

VNCserver启动数量过大,约53个时;vncviewer会出现灰屏现象;新起vncserver起不来;提示无法启动dbus-daemon,版本过低。

原因分析

vncviewer灰屏大概率是vncserver没得到视频数据;dbus负责进程间的消息传递;问题原因可能出在dbus上;

top查看到dbus-daemon CPU 一直是90%多;
strace -f -F -p dbusPid;
可以看到日志刷屏;

关键错误信息:Too many open files;
lsof | grep “ dbus “ (查看应用打开的文件)
可以看到dbus-daemon打开了1037个socket;问题原因应该是打开socket过多,超过了系统的限制;
执行ulimit -a 可以看到nofile 是1024;(注意切换用户)
所以之前vncserver无法启动,提示dbus-daemon版本过低的问题是一个错误的提示;根本原因socket无法建立,导致vncserver无法fork dbus-daemon。

解决方法

问题定位后,解决方法也就应运而生。修改nofile的limits

修改/etc/security/limits.conf; 在文件末尾追加如下语句:
soft nofile 65534
hard nofile 65534
如果应用仅属于某个用户,可以仅修改该用户的limit。

修改用户的max user process
修改 /etc/security/limits.d/90-nproc.conf里面的nproc。
修改完成后,需重启当前的问题进程;
service messagebus restart;
在查看strace -f -F -p dbusPid;;日志正常;灰屏信息解决。

修改limits时,nofile不要设置过大以防占用太多资源。
Too many open files是linux的一大类错误:打开文件过多;在Linux系统中一切皆文件,这里的“文件”包括
目录、字符设备、块设备、套接字、打印机、进程、线程、管道、套接字等;Linux对用户及程序所能打开的文件数都有限制;
一般默认用户打开最大文件数是1024;