Linux系统监控与进程管理实战指南:掌握系统运行状态的核心技能
Orion K Lv6

Linux系统监控与进程管理实战指南:掌握系统运行状态的核心技能

在Linux系统运维中,系统监控和进程管理是确保系统稳定运行的核心技能。本文将深入介绍Linux系统监控的各种工具和技术,以及进程管理的实用方法,帮助运维人员更好地掌握系统运行状态。

一、系统监控基础概念

1.1 核心监控指标

系统监控主要关注以下几个核心指标:

监控指标 监控工具 典型阈值 说明
CPU使用率 top, htop, sar >70%(持续5分钟) 处理器负载情况
内存使用率 free, vmstat >80%(可用内存<10%) 内存资源占用
磁盘I/O iostat, iotop >50%(读写延迟>20ms) 磁盘读写性能
网络流量 iftop, nload >1Gbps(持续10分钟) 网络带宽使用
进程数量 ps, systemd >500(异常进程数) 系统进程状态

1.2 监控工具分类

实时监控工具:

  • tophtop:实时显示系统进程信息
  • iotop:实时显示磁盘I/O使用情况
  • iftop:实时显示网络流量
  • glances:综合系统监控工具

历史数据分析工具:

  • sar:系统活动报告器
  • vmstat:虚拟内存统计
  • iostat:I/O统计信息
  • netstat:网络连接统计

二、实时监控工具详解

2.1 top命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 基本使用
top

# 按CPU使用率排序
top -o %CPU

# 按内存使用率排序
top -o %MEM

# 显示指定用户的进程
top -u username

# 批处理模式,输出到文件
top -b -n 1 > system_status.txt

# 实时监控特定进程
top -p 1234,5678

top命令交互操作:

1
2
3
4
5
6
7
8
# 在top运行时的快捷键
P # 按CPU使用率排序
M # 按内存使用率排序
T # 按运行时间排序
k # 终止进程
r # 重新设置进程优先级
q # 退出top
1 # 显示所有CPU核心

2.2 htop增强版监控

1
2
3
4
5
6
7
8
9
# 安装htop
sudo yum install htop # CentOS/RHEL
sudo apt install htop # Ubuntu/Debian

# 启动htop
htop

# htop配置文件
~/.config/htop/htoprc

htop优势特性:

  • 彩色显示,界面更友好
  • 支持鼠标操作
  • 可以横向和纵向滚动
  • 树状显示进程关系
  • 支持多种排序方式

2.3 系统资源监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
# 系统资源监控脚本
# 文件名: system_monitor.sh

LOG_FILE="/var/log/system_monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# 获取CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)

# 获取内存使用率
MEM_TOTAL=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2}')

# 获取磁盘使用率
DISK_USAGE=$(df -h | awk '$NF=="/"{printf "%s", $5}' | sed 's/%//')

# 获取系统负载
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}')

# 记录到日志文件
echo "[$DATE] CPU: ${CPU_USAGE}%, Memory: ${MEM_TOTAL}%, Disk: ${DISK_USAGE}%, Load: ${LOAD_AVG}" >> $LOG_FILE

# 检查阈值并发送告警
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
echo "WARNING: High CPU usage: ${CPU_USAGE}%" | mail -s "CPU Alert" admin@example.com
fi

if (( $(echo "$MEM_TOTAL > 85" | bc -l) )); then
echo "WARNING: High Memory usage: ${MEM_TOTAL}%" | mail -s "Memory Alert" admin@example.com
fi

if [ "$DISK_USAGE" -gt 90 ]; then
echo "WARNING: High Disk usage: ${DISK_USAGE}%" | mail -s "Disk Alert" admin@example.com
fi

三、进程管理详解

3.1 进程查看和管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看所有进程
ps aux
ps -ef

# 查看进程树
pstree
pstree -p # 显示PID

# 查看特定用户的进程
ps -u username

# 查看特定进程
ps -p 1234

# 根据进程名查找
ps aux | grep nginx
pgrep nginx

# 查看进程详细信息
cat /proc/1234/status
cat /proc/1234/cmdline

3.2 进程控制和信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 终止进程
kill PID
kill -9 PID # 强制终止
kill -15 PID # 正常终止(默认)

# 根据进程名终止
killall nginx
pkill nginx

# 发送信号给进程
kill -HUP PID # 重新加载配置
kill -USR1 PID # 用户自定义信号1
kill -USR2 PID # 用户自定义信号2

# 查看可用信号
kill -l

常用信号说明:

1
2
3
4
5
6
7
SIGTERM (15)  # 正常终止信号
SIGKILL (9) # 强制终止信号
SIGHUP (1) # 挂起信号,通常用于重新加载配置
SIGUSR1 (10) # 用户自定义信号1
SIGUSR2 (12) # 用户自定义信号2
SIGSTOP (19) # 停止进程
SIGCONT (18) # 继续进程

3.3 进程优先级管理

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看进程优先级
ps -eo pid,ppid,ni,comm

# 启动时设置优先级
nice -n 10 command
nice -10 command

# 修改运行中进程的优先级
renice 5 -p 1234
renice -5 -u username

# 实时调整优先级(在top中)
r # 然后输入PID和新的nice值

优先级说明:

  • nice值范围:-20到19
  • -20:最高优先级
  • 0:默认优先级
  • 19:最低优先级

3.4 后台进程管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 后台运行进程
command &
nohup command &

# 查看后台任务
jobs
jobs -l # 显示PID

# 将后台任务调到前台
fg %1

# 将前台任务放到后台
Ctrl+Z # 暂停
bg %1 # 后台继续

# 使用screen管理长期任务
screen -S session_name
screen -ls # 列出会话
screen -r session_name # 恢复会话

# 使用tmux管理会话
tmux new -s session_name
tmux ls # 列出会话
tmux attach -t session_name

四、系统性能分析

4.1 CPU性能分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看CPU信息
lscpu
cat /proc/cpuinfo

# CPU使用率统计
sar -u 1 10 # 每秒采样,共10次
sar -u -f /var/log/sa/sa01 # 查看历史数据

# 查看CPU负载
uptime
w
cat /proc/loadavg

# 实时CPU监控
watch -n 1 'cat /proc/loadavg'

CPU性能分析脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# CPU性能分析脚本
# 文件名: cpu_analysis.sh

echo "=== CPU信息 ==="
lscpu | grep -E "CPU\(s\)|Model name|CPU MHz"

echo -e "\n=== CPU使用率(最近1分钟) ==="
sar -u 1 60 | tail -1

echo -e "\n=== 系统负载 ==="
uptime

echo -e "\n=== 高CPU使用率进程(Top 10) ==="
ps aux --sort=-%cpu | head -11

echo -e "\n=== CPU核心使用情况 ==="
mpstat -P ALL 1 1

4.2 内存性能分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 内存使用情况
free -h
free -m -s 5 # 每5秒刷新

# 详细内存信息
cat /proc/meminfo

# 内存使用统计
sar -r 1 10

# 查看内存使用最多的进程
ps aux --sort=-%mem | head -10

# 内存碎片信息
cat /proc/buddyinfo

内存监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
# 内存监控脚本
# 文件名: memory_monitor.sh

# 获取内存使用情况
MEM_INFO=$(free -m)
MEM_TOTAL=$(echo "$MEM_INFO" | awk 'NR==2{print $2}')
MEM_USED=$(echo "$MEM_INFO" | awk 'NR==2{print $3}')
MEM_FREE=$(echo "$MEM_INFO" | awk 'NR==2{print $4}')
MEM_USAGE=$(echo "scale=2; $MEM_USED*100/$MEM_TOTAL" | bc)

echo "内存总量: ${MEM_TOTAL}MB"
echo "已使用: ${MEM_USED}MB (${MEM_USAGE}%)"
echo "可用内存: ${MEM_FREE}MB"

# 检查内存使用率
if (( $(echo "$MEM_USAGE > 80" | bc -l) )); then
echo "警告:内存使用率过高!"
echo "内存使用率最高的进程:"
ps aux --sort=-%mem | head -5
fi

# 检查swap使用情况
SWAP_INFO=$(free -m | grep Swap)
SWAP_USED=$(echo "$SWAP_INFO" | awk '{print $3}')
if [ "$SWAP_USED" -gt 0 ]; then
echo "警告:系统正在使用Swap空间!"
echo "Swap使用情况:"
echo "$SWAP_INFO"
fi

4.3 磁盘I/O性能分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 磁盘使用情况
df -h
df -i # inode使用情况

# 磁盘I/O统计
iostat -x 1 10
iostat -d 2 # 每2秒显示设备统计

# 实时I/O监控
iotop
iotop -o # 只显示有I/O活动的进程

# 查看磁盘I/O等待
sar -d 1 10

# 文件系统读写测试
dd if=/dev/zero of=testfile bs=1M count=1024
dd if=testfile of=/dev/null bs=1M

磁盘监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
# 磁盘监控脚本
# 文件名: disk_monitor.sh

echo "=== 磁盘使用情况 ==="
df -h | grep -vE '^Filesystem|tmpfs|cdrom'

echo -e "\n=== 磁盘I/O统计 ==="
iostat -x 1 1 | grep -A 20 "Device"

echo -e "\n=== 高I/O进程 ==="
iotop -b -n 1 | head -10

# 检查磁盘使用率
echo -e "\n=== 磁盘使用率检查 ==="
df -h | awk 'NR>1 {gsub(/%/,""); if($5 > 80) print $0 " - 警告:使用率过高!"}'

# 检查inode使用情况
echo -e "\n=== Inode使用情况 ==="
df -i | awk 'NR>1 {gsub(/%/,""); if($5 > 80) print $0 " - 警告:Inode使用率过高!"}'

五、网络监控

5.1 网络连接监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看网络连接
netstat -tuln # 监听端口
netstat -an # 所有连接
netstat -i # 网络接口统计

# 使用ss命令(推荐)
ss -tuln # 监听端口
ss -an # 所有连接
ss -s # 统计信息

# 实时网络流量
iftop -i eth0
nload eth0

# 网络统计
sar -n DEV 1 10 # 网络设备统计
sar -n TCP 1 10 # TCP统计

5.2 网络性能测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 网络连通性测试
ping -c 4 google.com
traceroute google.com
mtr google.com

# 端口连通性测试
telnet host port
nc -zv host port

# 带宽测试
iperf3 -s # 服务端
iperf3 -c server_ip # 客户端

# DNS解析测试
nslookup domain.com
dig domain.com

六、日志监控

6.1 系统日志分析

1
2
3
4
5
6
7
8
9
10
11
12
# 查看系统日志
tail -f /var/log/messages
tail -f /var/log/syslog

# 使用journalctl(systemd系统)
journalctl -f # 实时查看
journalctl -u nginx # 查看特定服务
journalctl --since "2024-01-01" --until "2024-01-02"

# 日志统计分析
grep "ERROR" /var/log/messages | wc -l
awk '/ERROR/ {count++} END {print "错误数量:", count}' /var/log/messages

6.2 日志监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
# 日志监控脚本
# 文件名: log_monitor.sh

LOG_FILE="/var/log/messages"
ERROR_LOG="/tmp/error_summary.log"
DATE=$(date '+%Y-%m-%d')

# 统计今日错误日志
echo "=== $DATE 错误日志统计 ===" > $ERROR_LOG
grep "$DATE" $LOG_FILE | grep -i error | wc -l >> $ERROR_LOG

# 统计各类错误
echo "\n=== 错误类型分布 ===" >> $ERROR_LOG
grep "$DATE" $LOG_FILE | grep -i error | awk '{print $5}' | sort | uniq -c | sort -nr >> $ERROR_LOG

# 检查关键服务状态
echo "\n=== 关键服务状态 ===" >> $ERROR_LOG
for service in sshd nginx mysql; do
if systemctl is-active $service >/dev/null 2>&1; then
echo "$service: 运行中" >> $ERROR_LOG
else
echo "$service: 已停止 - 警告!" >> $ERROR_LOG
fi
done

# 发送报告
if [ -s $ERROR_LOG ]; then
mail -s "系统日志监控报告 - $DATE" admin@example.com < $ERROR_LOG
fi

七、自动化监控

7.1 使用crontab定时监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 编辑定时任务
crontab -e

# 添加监控任务
# 每5分钟检查系统资源
*/5 * * * * /usr/local/bin/system_monitor.sh

# 每小时生成性能报告
0 * * * * /usr/local/bin/performance_report.sh

# 每天凌晨清理日志
0 2 * * * /usr/local/bin/log_cleanup.sh

# 查看定时任务
crontab -l

7.2 systemd定时器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建服务文件
sudo nano /etc/systemd/system/system-monitor.service

[Unit]
Description=System Monitor
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/system_monitor.sh

# 创建定时器文件
sudo nano /etc/systemd/system/system-monitor.timer

[Unit]
Description=Run System Monitor every 5 minutes
Requires=system-monitor.service

[Timer]
OnCalendar=*:0/5
Persistent=true

[Install]
WantedBy=timers.target

# 启用定时器
sudo systemctl enable system-monitor.timer
sudo systemctl start system-monitor.timer

八、监控工具集成

8.1 Prometheus + Grafana

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 安装node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz
sudo cp node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/

# 创建systemd服务
sudo nano /etc/systemd/system/node_exporter.service

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

# 启动服务
sudo systemctl enable node_exporter
sudo systemctl start node_exporter

8.2 Zabbix Agent配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装Zabbix Agent
sudo yum install zabbix-agent

# 配置文件
sudo nano /etc/zabbix/zabbix_agentd.conf

# 关键配置项
Server=zabbix_server_ip
ServerActive=zabbix_server_ip
Hostname=your_hostname

# 启动服务
sudo systemctl enable zabbix-agent
sudo systemctl start zabbix-agent

九、故障排查实战

9.1 高CPU使用率排查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 高CPU使用率排查脚本
# 文件名: high_cpu_debug.sh

echo "=== 系统负载情况 ==="
uptime

echo -e "\n=== CPU使用率最高的进程 ==="
ps aux --sort=-%cpu | head -10

echo -e "\n=== 实时CPU使用情况 ==="
top -bn1 | grep "Cpu(s)"

echo -e "\n=== 检查是否有僵尸进程 ==="
ps aux | awk '$8 ~ /^Z/ {print $0}'

echo -e "\n=== 系统中断情况 ==="
cat /proc/interrupts | head -10

echo -e "\n=== 内核线程情况 ==="
ps aux | grep "\[.*\]" | head -10

9.2 内存泄漏排查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# 内存泄漏排查脚本
# 文件名: memory_leak_debug.sh

echo "=== 内存使用情况 ==="
free -h

echo -e "\n=== 内存使用最多的进程 ==="
ps aux --sort=-%mem | head -10

echo -e "\n=== 检查内存映射 ==="
for pid in $(ps aux --sort=-%mem | awk 'NR>1 && NR<=6 {print $2}'); do
echo "PID $pid 内存映射:"
cat /proc/$pid/status | grep -E "VmSize|VmRSS|VmData|VmStk"
echo "---"
done

echo -e "\n=== Swap使用情况 ==="
cat /proc/swaps
swapon -s

echo -e "\n=== 内存碎片情况 ==="
cat /proc/buddyinfo

十、最佳实践和建议

10.1 监控策略

  1. 分层监控

    • 基础设施层:CPU、内存、磁盘、网络
    • 应用层:服务状态、响应时间、错误率
    • 业务层:关键业务指标
  2. 告警策略

    • 设置合理的阈值
    • 避免告警风暴
    • 分级告警处理
  3. 数据保留

    • 实时数据:保留1-7天
    • 历史数据:保留30-90天
    • 趋势数据:保留1年以上

10.2 性能优化建议

  1. CPU优化

    • 合理设置进程优先级
    • 避免CPU密集型任务同时运行
    • 使用CPU亲和性绑定
  2. 内存优化

    • 定期清理缓存
    • 合理配置swap
    • 监控内存泄漏
  3. I/O优化

    • 使用合适的文件系统
    • 调整I/O调度器
    • 监控磁盘健康状态

10.3 常见问题解决

问题1:系统响应缓慢

1
2
3
4
5
6
# 排查步骤
1. 检查系统负载:uptime
2. 查看CPU使用:top
3. 检查内存使用:free -h
4. 查看I/O等待:iostat -x
5. 检查网络状态:netstat -i

问题2:进程无法启动

1
2
3
4
5
6
# 排查步骤
1. 检查进程是否已存在:ps aux | grep process_name
2. 查看系统资源:free -h && df -h
3. 检查端口占用:netstat -tuln | grep port
4. 查看错误日志:journalctl -u service_name
5. 检查文件权限:ls -la /path/to/executable

问题3:网络连接异常

1
2
3
4
5
6
# 排查步骤
1. 检查网络接口:ip addr show
2. 测试网络连通性:ping gateway
3. 查看路由表:ip route show
4. 检查DNS解析:nslookup domain
5. 查看防火墙规则:iptables -L

总结

Linux系统监控和进程管理是运维工作的核心技能,需要掌握:

  1. 监控工具的使用:熟练使用top、htop、sar、iostat等工具
  2. 进程管理技巧:掌握进程查看、控制、优先级调整等操作
  3. 性能分析方法:能够分析CPU、内存、磁盘、网络性能
  4. 自动化监控:建立完善的监控体系和告警机制
  5. 故障排查能力:快速定位和解决系统性能问题

通过系统性的学习和实践,可以有效提升Linux系统运维能力,确保系统稳定高效运行。建议在实际工作中结合具体业务场景,制定适合的监控策略和优化方案。

本站由 提供部署服务