性能·CPU / 命令文档
Linux进程与线程管理
概述
快速导航 基础概念 进程管理 线程管理 监控技巧 性能优化 故障排查
Linux系统运维工程师必备技能
进程(Process)的本质
定义:进程是操作系统中运行程序的实例,是系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间、文件描述符表和执行上下文。
线程(Thread)的本质
定义:线程是进程内的执行单元,多个线程共享同一进程的内存空间和资源,是CPU调度的基本单位。
存在价值分析
| 概念 | 核心价值 | 运维意义 |
|---|---|---|
| 进程隔离 | 提供安全的执行环境,进程间相互独立 | 故障隔离,一个进程崩溃不影响其他进程 |
| 资源管理 | 精确控制CPU、内存、I/O资源分配 | 防止资源滥用,确保系统稳定性 |
| 并发执行 | 同时处理多个任务,提高系统吞吐量 | 支撑高并发业务场景 |
| 线程共享 | 高效的数据交换和协作机制 | 优化应用性能,减少资源开销 |
进程状态详解
R - Running S - Sleeping D - Disk Sleep T - Stopped Z - Zombie
关键命令掌握
# 查看所有进程详细信息
ps aux | head -10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 43560 3944 ? Ss 8月10 0:17 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 8月10 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 8月10 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 8月10 0:01 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 8月10 0:01 [migration/0]
root 8 0.0 0.0 0 0 ? S 8月10 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 8月10 0:35 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 8月10 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 8月10 0:00 [watchdog/0]
# 实时监控Nginx进程资源使用
top -p $(pgrep nginx | tr '\n' ',' | sed 's/,$//')
# 查看进程树结构
pstree -p | head -200
# 查看我本地指定进程32496(nginx)的详细信息
cat /proc/32496/status进程优先级管理
# 查看进程优先级 ps -eo pid,ni,pri,comm | head -10 # 调整运行中进程的nice值 renice -10 -p 1234 # 启动程序时设置nice值 nice -n 10 ./cpu_intensive_app # 使用ionice调整I/O优先级 ionice -c 2 -n 4 -p 1234
Nice值范围是-20到19,数值越小优先级越高。普通用户只能增加nice值(降低优先级),root用户可以设置任意nice值。
线程查看技巧
# 查看mysql进程(我的系统你的需要替换PID)的所有线程 ps -T -p 2328 PID SPID TTY TIME CMD 2328 2328 ? 00:00:00 mysqld 2328 2351 ? 00:00:08 mysqld 2328 2352 ? 00:00:08 mysqld 2328 2353 ? 00:00:08 mysqld 2328 2354 ? 00:00:08 mysqld 2328 2355 ? 00:00:08 mysqld 2328 2356 ? 00:00:08 mysqld 2328 2357 ? 00:00:08 mysqld 2328 2358 ? 00:00:08 mysqld 2328 2359 ? 00:00:08 mysqld 2328 2360 ? 00:00:07 mysqld 2328 2363 ? 00:00:05 mysqld 2328 2364 ? 00:00:43 mysqld 2328 2365 ? 00:00:43 mysqld 2328 2366 ? 00:00:44 mysqld 2328 2367 ? 00:00:46 mysqld 2328 2368 ? 00:06:15 mysqld 2328 2391 ? 00:00:05 mysqld 2328 2392 ? 00:00:05 mysqld 2328 2393 ? 00:00:00 mysqld 2328 2400 ? 00:00:00 mysqld 2328 2401 ? 00:00:14 mysqld 2328 2402 ? 00:00:00 mysqld 2328 2403 ? 00:00:01 mysqld 2328 2411 ? 00:00:00 mysqld 2328 2412 ? 00:00:00 mysqld 2328 2429 ? 00:00:00 mysqld 2328 2430 ? 00:00:52 mysqld 2328 2431 ? 00:00:00 mysqld 2328 2442 ? 00:00:00 mysqld 2328 2443 ? 00:00:00 mysqld 2328 2444 ? 00:00:07 mysqld 2328 2445 ? 00:00:00 mysqld 2328 2446 ? 00:00:00 mysqld # 查看系统中所有线程 ps -eLf # 使用top查看mysql(2328)的线程信息 top -H -p 2328 # 查看mysql(2328)线程详细状态 cat /proc/2328/task/*/stat
线程数量监控
# 统计mysql(2328)进程的线程数量
ls /proc/2328/task | wc -l
# 查看系统线程总数
ps -eo nlwp | tail -n +2 | awk '{sum+=$1} END {print sum}'
# 找出线程数最多的进程
ps -eo pid,nlwp,comm | sort -k2 -nr | head -10线程数过多会导致上下文切换开销增加,一般建议线程数不超过CPU核心数的2-4倍。
关键性能指标
# CPU使用率分析
vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 8 88436 187720 1286464 0 0 1 32 11 2 1 0 99 0 0
0 0 8 88436 187720 1286468 0 0 0 28 913 1766 0 0 100 0 0
0 0 8 88452 187720 1286468 0 0 0 0 810 1475 1 1 99 0 0
0 0 8 88452 187720 1286468 0 0 0 0 905 1512 2 0 98 0 0
0 0 8 88576 187720 1286468 0 0 0 0 853 1586 1 1 99 0 0
# 内存使用详情
free -h && echo "---详细内存统计---" && cat /proc/meminfo | head -10
total used free shared buff/cache available
Mem: 2.0G 474M 148M 620K 1.3G 1.3G
Swap: 2.0G 8K 2.0G
---详细内存统计---
MemTotal: 2046500 kB
MemFree: 151768 kB
MemAvailable: 1373900 kB
Buffers: 187720 kB
Cached: 1129900 kB
SwapCached: 0 kB
Active: 987432 kB
Inactive: 734016 kB
Active(anon): 394320 kB
Inactive(anon): 18796 kB
# I/O性能监控
iostat -x 1 3
# 网络连接状态
ss -tuln | head -10高级监控脚本
# 创建进程监控脚本
cat process_monitor.sh
#!/bin/bash
echo "===sys loadaverage infos==="
uptime
echo -e "\n===Use mem infos==="
free -h
echo -e "\n===Use CPU top10 process==="
ps aux --sort=-%cpu | head -11
echo -e "\n===Use Mem top10 process==="
ps aux --sort=-%mem | head -11
echo -e "\n===Zombie Process check==="
ps aux | awk '$8 ~ /^Z/ {print$0}'进程优化技巧
1. 合理设置进程数量 根据CPU核心数和应用特性调整worker进程数。对于CPU密集型应用,进程数=CPU核心数;对于I/O密集型应用,可以适当增加。
2. 内存优化 • 监控进程内存泄漏 • 合理设置swap使用策略 • 使用内存映射减少数据复制
# 优化系统参数 echo 'vm.swappiness = 10' >> /etc/sysctl.conf echo 'kernel.sched_migration_cost_ns = 5000000' >> /etc/sysctl.conf sysctl -p # 设置进程资源限制 ulimit -n 65536 # 文件描述符数量 ulimit -u 32768 # 最大进程数 ulimit -s 8192 # 栈大小 # 使用cgroups限制资源 cgcreate -g cpu,memory:/myapp echo "50" > /sys/fs/cgroup/cpu/myapp/cpu.shares echo "1G" > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
线程池优化
对于高并发应用,合理设计线程池大小: • CPU密集型任务:线程数 = CPU核心数 + 1 • I/O密集型任务:线程数 = CPU核心数 × (1 + 平均等待时间/平均工作时间)
常见问题诊断
# 1. 查找消耗CPU最多的进程
ps aux --sort=-%cpu | head -5
# 2. 查找消耗内存最多的进程
ps aux --sort=-%mem | head -5
# 3. 查找僵尸进程
ps aux | awk '$8 ~ /^Z/ { print $2,$11 }' | while read pid cmd; do
echo "僵尸进程: PID=$pid CMD=$cmd"
echo "父进程: $(ps -o ppid= -p $pid)"
done
# 4. 检查进程文件句柄使用情况
lsof -p 1234 | wc -l
echo "/proc/sys/fs/file-max: $(cat /proc/sys/fs/file-max)"
# 5. 分析进程系统调用
strace -p 1234 -f -e trace=all -o /tmp/strace.log
性能瓶颈定位
# 使用perf工具分析性能热点
perf record -g ./your_application
perf report
# 分析进程等待状态
cat /proc/1234/wchan
cat /proc/1234/stack
# 检查进程调度信息
cat /proc/1234/sched
# 监控上下文切换
pidstat -w 1 5
发现问题时的处理原则:
1. 先记录现状,保存故障现场
2. 分析根本原因,避免头痛医头
3. 制定恢复计划,确保业务连续性
4. 实施修复措施,密切监控效果
5. 总结经验教训,完善监控告警
应急响应脚本
# 创建应急处理脚本
cat << 'EOF' > emergency_response.sh
#!/bin/bash
echo "=== 应急系统检查 $(date) ==="
# 检查系统负载
load=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | xargs)
echo "当前负载: $load"
# 检查内存使用
mem_usage=$(free | awk 'NR==2{printf "%.0f", $3*100/($3+$7)}')
echo "内存使用率: ${mem_usage}%"
# 检查磁盘使用
df -h | awk '$5+0 > 80 {print "磁盘告警: " $0}'
# 检查僵尸进程
zombie_count=$(ps aux | awk '$8 ~ /^Z/' | wc -l)
echo "僵尸进程数量: $zombie_count"
# 检查高负载进程
echo "=== TOP 5 CPU使用进程 ==="
ps aux --sort=-%cpu | head -6
EOF
chmod +x emergency_response.sh
运维最佳实践总结
日常监控要点
1. 建立监控体系
• 设置CPU、内存、磁盘使用率告警阈值
• 监控关键进程的存活状态
• 定期检查系统日志和应用日志
• 建立性能基线,及时发现异常
2. 预防性维护
• 定期清理僵尸进程
• 监控内存泄漏趋势
• 优化系统参数配置
• 制定资源使用规范
3. 应急响应准备
• 准备故障处理脚本
• 建立问题排查流程
• 维护系统恢复手册
• 定期演练应急预案
作为Linux运维专家,掌握进程和线程管理不仅仅是技术技能,更是保障系统稳定运行的核心能力。持续学习、实践和总结是成长的关键!