当Linux系统频繁出现进程资源耗尽问题时,首先需要确定具体是哪种资源耗尽:
# 查看系统整体资源使用情况
top
htop
# 内存相关
free -h
vmstat 1 5
# 进程数限制
ulimit -u
cat /proc/sys/kernel/pid_max
# 文件描述符限制
ulimit -n
cat /proc/sys/fs/file-max
lsof | wc -l
# 查看OOM日志
dmesg | grep -i oom
journalctl -k | grep -i oom
临时解决方案:
# 查找内存占用高的进程
ps aux --sort=-%mem | head
# 终止问题进程
kill -9 [PID]
# 清理缓存(谨慎使用)
echo 3 > /proc/sys/vm/drop_caches
长期解决方案:
- 增加物理内存或配置交换分区(Swap)
- 优化应用程序内存使用
- 配置OOM killer策略:
bash
# 调整OOM killer行为(值越高越容易被kill)
echo 100 > /proc/[PID]/oom_score_adj
- 限制进程内存使用:
bash
# 使用cgroups限制内存
cgcreate -g memory:/my_group
cgset -r memory.limit_in_bytes=500M my_group
临时解决方案:
# 查找CPU占用高的进程
ps aux --sort=-%cpu | head
# 调整进程优先级
renice +10 [PID]
长期解决方案:
- 优化应用程序代码
- 使用cgroups限制CPU使用:
bash
cgcreate -g cpu:/my_group
cgset -r cpu.shares=512 my_group
- 考虑使用taskset绑定进程到特定CPU核心
- 升级硬件或增加CPU核心
解决方案:
# 查看当前进程数
ps -eLf | wc -l
# 临时增加限制(需root)
sysctl -w kernel.pid_max=65536
# 永久修改(添加到/etc/sysctl.conf)
echo "kernel.pid_max=65536" >> /etc/sysctl.conf
sysctl -p
# 修改用户级限制(编辑/etc/security/limits.conf)
* soft nproc 4096
* hard nproc 8192
解决方案:
# 查看当前打开文件数
lsof | wc -l
# 临时增加系统级限制
sysctl -w fs.file-max=65536
# 永久修改
echo "fs.file-max=65536" >> /etc/sysctl.conf
sysctl -p
# 修改用户级限制(编辑/etc/security/limits.conf)
* soft nofile 4096
* hard nofile 8192
Systemd资源控制:
# 在service文件中添加
[Service]
MemoryLimit=500M
CPUQuota=50%
使用cgroups v2:更精细的资源控制
容器化解决方案:使用Docker/Kubernetes内置的资源限制功能
通过以上方法,您可以有效诊断和解决Linux系统中的进程资源耗尽问题,并建立预防机制避免问题再次发生。