银河麒麟系统卡顿时,应先用lsof定位高句柄数进程(>5000即异常),再通过ps查看详情;对systemd服务需用systemd-cgtop查cgroup句柄泄漏;最后用ulimit和/proc/PID/fd验证用户级限制与实际占用是否匹配。

银河麒麟系统出现卡顿、文件无法删除、新建文件失败或提示“Too many open files”时,往往是因为某个进程打开了过多文件句柄却未释放,导致系统级或用户级句柄数耗尽。此时必须精准定位并处置该异常进程,而非盲目调高限制值。
用lsof定位打开句柄最多的进程
在终端中执行:lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head -10。
这条命令统计每个PID打开的文件数,并按降序列出前10名。输出第一列为句柄数量,第二列为PID——数值若超过5000,基本可判定为异常源头。
注意:若提示command not found: lsof,先运行sudo apt install lsof安装工具。
确认PID后,用ps -p PID -o pid,ppid,comm,user,%mem,%cpu,args查看该进程完整信息,重点核对comm(命令名)和args(启动参数),避免误杀父进程或系统服务。
用systemd-cgtop观察cgroup级句柄累积
适用于容器化应用、Java微服务或通过systemd启动的长期服务——这类进程常在子cgroup中持续泄漏句柄,但主PID本身不显眼。
第一步:执行systemd-cgtop -P,按Ctrl+C停止自动刷新,获得当前快照;
第二步:观察IO>READ和IO>WRITE列数值极高的cgroup路径(如/system.slice/tomcat9.service);
第三步:进入对应路径目录:cd /sys/fs/cgroup/pids/system.slice/tomcat9.service;
第四步:读取当前句柄上限与已用值:cat pids.max 和 cat pids.current;若pids.current接近或等于pids.max,且该服务无重启记录,则高度可疑。
这一步操作起来很简单,直接在终端里敲命令就行,但必须确保你已切换到root权限,否则/sys/fs/cgroup/下多数文件不可读。
检查用户级ulimit与进程实际句柄占用是否匹配
方法一:查当前登录用户的软硬限制
执行ulimit -Sn(软限制)和ulimit -Hn(硬限制)。若两者均为1024,而某进程lsof -p PID | wc -l返回值达3000,则说明该进程早已突破用户级限制——它必是通过systemd服务或root身份启动,绕过了shell会话限制。
方法二:查目标进程实际句柄数
执行ls /proc/PID/fd | wc -l(将PID替换为真实值)。该数值即该进程当前打开的全部句柄总数,包括文件、socket、eventfd、timerfd等。若超过65535,【请勿直接kill -9,先检查其是否为数据库主进程或消息队列消费者】。
方法三:对比同一用户下其他进程
执行for pid in $(pgrep -u $USER); do echo "$(ls /proc/$pid/fd 2>/dev/null | wc -l) $pid"; done | sort -nr | head -5,快速筛出本用户下句柄最贪婪的5个进程。
















