内存泄漏可通过free、top、valgrind等工具检测,关注可用内存下降与进程RES增长;2. 文件描述符泄漏用lsof、/proc/pid/fd和limits检查,防止“Too many open files”;3. 进程/线程泄漏通过ps、pstree查看线程数与进程树,结合系统负载判断;4. 借助vmstat、sar、dmesg及Prometheus+Grafana实现趋势分析与告警;建立正常基线并定期巡检是关键。

系统资源泄漏是导致Linux服务器性能下降甚至崩溃的常见原因,主要包括内存泄漏、文件描述符泄漏、进程/线程泄漏等。及时发现和定位这些问题对保障服务稳定性至关重要。以下是常用的排查方法和工具。
1. 检查内存泄漏
内存泄漏表现为系统可用内存持续减少,而没有合理释放。
- 使用 free -h 查看整体内存使用情况,关注“available”是否持续下降。
- 运行 top 或 htop,按 Shift+M 按内存使用排序,观察哪些进程的RES(常驻内存)不断增长。
- 结合 /proc/
/status 查看具体进程的内存详情,如VmRSS、VmSize字段。 - 对于C/C++程序,可使用 valgrind --leak-check=full ./program 进行内存泄漏检测。
- 长期运行的服务建议启用 systemd 的内存限制(MemoryMax)以便自动保护。
2. 检查文件描述符泄漏
文件描述符(fd)泄漏会导致“Too many open files”错误。
- 使用 lsof | wc -l 查看系统当前打开的文件总数。
- 通过 lsof -p
查看指定进程打开的文件列表,判断是否存在异常增长。 - 查看 /proc/
/fd 目录下的链接数量:ls /proc//fd | wc -l 。 - 检查进程的fd限制:cat /proc/
/limits | grep "open files" 。 - 设置合理的ulimit值,并在服务配置中显式声明(如systemd的LimitNOFILE)。
3. 检查进程与线程泄漏
进程或线程未正常退出会导致系统负载升高。
- 使用 ps aux --sort=-nlwp 按线程数排序,找出线程最多的进程。
- 查看某进程的线程数:ps -T -p
| wc -l 减去表头即为线程数。 - 监控 /proc/loadavg 和 uptime 中的系统负载,异常高负载可能暗示线程爆炸。
- 结合 pstree -p
查看进程树结构,识别异常子进程。
4. 使用系统监控工具辅助分析
借助专业工具可以更高效地发现趋势性问题。
- vmstat 1:观察系统级内存、swap、IO等变化趋势。
- sar(来自sysstat包):记录历史资源使用数据,适合回溯分析。
- dmesg:检查内核日志是否有关于oom-killer的记录,例如“Out of memory: Kill process”。
- 部署Prometheus + Grafana进行长期监控,设置告警规则(如内存使用率 > 90%持续5分钟)。
基本上就这些。关键在于建立基线认知——了解服务正常时的资源占用水平,才能及时发现异常增长。定期巡检和自动化监控结合,能有效防范资源泄漏带来的风险。










