资源争用
死锁问题
系统配置问题
外部依赖问题
ps aux | grep <进程名>
top -H -p <PID>
观察进程状态是否为: - D (不可中断睡眠) - T (停止状态) - Z (僵尸进程)
# CPU使用情况
mpstat -P ALL 1 5
# 内存使用情况
free -m
vmstat 1 5
# I/O情况
iostat -x 1 5
iotop
# 获取进程的线程信息
ps -T -p <PID>
# 获取线程调用栈
gdb -p <PID>
thread apply all bt
# 或者使用更简单的方式
pstack <PID>
dmesg | tail -50
journalctl -xe --no-pager | tail -100
grep -i error /var/log/messages
CPU不足:
taskset
或cgroups
限制CPU使用内存不足:
# 临时释放缓存
echo 3 > /proc/sys/vm/drop_caches
I/O瓶颈:
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 临时修改为deadline
echo deadline > /sys/block/sda/queue/scheduler
strace
跟踪系统调用:
bash
strace -p <PID> -f -T -tt -o /tmp/strace.log
valgrind --tool=helgrind
检测线程问题调整文件描述符限制:
ulimit -n 65535
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
内核参数调整:
# 增加PID最大值
echo "kernel.pid_max=4194303" >> /etc/sysctl.conf
# 增加线程栈大小
echo "kernel.threads-max=1200000" >> /etc/sysctl.conf
sysctl -p
发送SIGTERM信号优雅终止:
kill -15 <PID>
强制终止进程:
kill -9 <PID>
批量清理僵尸进程:
ps -A -ostat,ppid | grep -e '[zZ]' | awk '{ print $2 }' | xargs kill -9
监控系统:
性能测试:
代码优化:
定期维护:
通过以上方法,可以有效地诊断和解决Linux系统中进程卡住的问题,并建立预防机制减少类似问题的发生。