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 监控工具分类 实时监控工具:
top、htop:实时显示系统进程信息
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 top -o %CPU top -o %MEM top -u username top -b -n 1 > system_status.txt top -p 1234,5678
top命令交互操作:
2.2 htop增强版监控 1 2 3 4 5 6 7 8 9 sudo yum install htop sudo apt install 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 LOG_FILE="/var/log/system_monitor.log" DATE=$(date '+%Y-%m-%d %H:%M:%S' ) 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 ps -u username ps -p 1234 ps aux | grep nginx pgrep nginx cat /proc/1234/statuscat /proc/1234/cmdline
3.2 进程控制和信号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 kill PIDkill -9 PID kill -15 PID killall nginx pkill nginx kill -HUP PID kill -USR1 PID kill -USR2 PID kill -l
常用信号说明:
1 2 3 4 5 6 7 SIGTERM (15) SIGKILL (9) SIGHUP (1) SIGUSR1 (10) SIGUSR2 (12) 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 r
优先级说明:
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 fg %1Ctrl+Z bg %1 screen -S session_name screen -ls screen -r session_name 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 lscpu cat /proc/cpuinfosar -u 1 10 sar -u -f /var/log/sa/sa01 uptime w cat /proc/loadavgwatch -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 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 cat /proc/meminfosar -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 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_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 -hdf -i iostat -x 1 10 iostat -d 2 iotop iotop -o sar -d 1 10 dd if =/dev/zero of=testfile bs=1M count=1024dd 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 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 " - 警告:使用率过高!"}' 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 -tuln ss -an ss -s iftop -i eth0 nload eth0 sar -n DEV 1 10 sar -n TCP 1 10
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 nslookup domain.com dig domain.com
六、日志监控 6.1 系统日志分析 1 2 3 4 5 6 7 8 9 10 11 12 tail -f /var/log/messagestail -f /var/log/syslogjournalctl -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_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 * * * * /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.timersudo 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 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/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_exportersudo systemctl start node_exporter
8.2 Zabbix Agent配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo yum install zabbix-agentsudo nano /etc/zabbix/zabbix_agentd.confServer=zabbix_server_ip ServerActive=zabbix_server_ip Hostname=your_hostname sudo systemctl enable zabbix-agentsudo 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 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 -10echo -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 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/swapsswapon -s echo -e "\n=== 内存碎片情况 ===" cat /proc/buddyinfo
十、最佳实践和建议 10.1 监控策略
分层监控 :
基础设施层:CPU、内存、磁盘、网络
应用层:服务状态、响应时间、错误率
业务层:关键业务指标
告警策略 :
数据保留 :
实时数据:保留1-7天
历史数据:保留30-90天
趋势数据:保留1年以上
10.2 性能优化建议
CPU优化 :
合理设置进程优先级
避免CPU密集型任务同时运行
使用CPU亲和性绑定
内存优化 :
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系统监控和进程管理是运维工作的核心技能,需要掌握:
监控工具的使用 :熟练使用top、htop、sar、iostat等工具
进程管理技巧 :掌握进程查看、控制、优先级调整等操作
性能分析方法 :能够分析CPU、内存、磁盘、网络性能
自动化监控 :建立完善的监控体系和告警机制
故障排查能力 :快速定位和解决系统性能问题
通过系统性的学习和实践,可以有效提升Linux系统运维能力,确保系统稳定高效运行。建议在实际工作中结合具体业务场景,制定适合的监控策略和优化方案。