性能·CPU / 命令文档

Linux进程与线程管理

$ process 14 个章节 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运维专家,掌握进程和线程管理不仅仅是技术技能,更是保障系统稳定运行的核心能力。持续学习、实践和总结是成长的关键!

同分类 · 其他命令文档