
关注「Raymond运维」公众号,并设为「星标」,也可以扫描底部二维码加入群聊,第一时间获取最新内容,不再错过精彩内容。
🚀 3年运维老司机的血泪总结:从菜鸟到专家,这些性能调优技巧让我的系统性能提升300%!
作为一名在一线摸爬滚打多年的运维工程师,我见过太多因为性能问题导致的线上故障。凌晨2点被告警电话吵醒,面对CPU飙升到100%、内存不足、磁盘IO瓶颈等问题时的那种焦虑,相信每个运维人都深有体会。
今天这篇文章,我将毫无保留地分享实战中最有效的Linux性能监控与调优技巧,让你从"救火队员"变身"性能专家"!
在开始任何优化工作之前,我们需要建立完整的监控体系。根据我的实战经验,Linux性能监控主要关注四个维度:
1. CPU性能监控
# 实时查看CPU使用情况
top -p $(pgrep -d',' your_process_name)
# 查看CPU详细统计信息
sar -u 1 10
# 查看特定进程的CPU使用
pidstat -u -p PID 1实战技巧:很多新手只看CPU总体使用率,但真正的专家会关注以下指标:
%usr: 用户空间CPU使用率%sys: 系统空间CPU使用率%iowait: 等待IO的CPU时间百分比%idle: CPU空闲时间百分比当%iowait持续超过20%时,通常意味着存在磁盘IO瓶颈!
2. 内存性能监控
# 查看内存使用详情
free -h
# 实时监控内存变化
watch -n 1 'free -h'
# 查看进程内存使用
ps aux --sort=-%mem | head -10核心监控指标解读:
3. 磁盘IO监控
# 查看磁盘IO统计
iostat -x 1 5
# 实时监控磁盘活动
iotop
# 查看文件系统使用情况
df -h关键指标警戒线:
%util > 80%: 磁盘可能成为瓶颈await > 10ms: IO响应时间过长r/s + w/s > 1000: IOPS过高需要优化4. 网络性能监控
# 查看网络连接状态
ss -tuln
# 监控网络流量
iftop
# 查看网络统计信息
cat /proc/net/dev很多运维工程师忽略了这一点:没有基线的监控是盲目的!
建议为每个关键指标建立正常运行时的基线值:
# 创建性能基线脚本
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BASELINE_DIR="/opt/performance_baseline"
mkdir -p $BASELINE_DIR
# 收集基线数据
{
echo"=== CPU Baseline ==="
sar -u 1 60
echo"=== Memory Baseline ==="
free -h
echo"=== Disk IO Baseline ==="
iostat -x 1 10
echo"=== Network Baseline ==="
ss -s
} > $BASELINE_DIR/baseline_$DATE.log1. 进程优先级调整
很多人知道nice命令,但真正用好的人不多:
# 降低CPU密集型任务的优先级
nice -n 19 your_cpu_intensive_command
# 对已运行的进程调整优先级
renice -n 10 -p PID
# 实时调整进程优先级(推荐)
ionice -c3 -p PID # 设置为空闲IO调度实战案例:某电商网站备份任务导致CPU使用率飙升,影响用户访问。通过将备份进程的nice值设置为19,CPU使用率从90%降至30%,用户响应时间恢复正常。
2. CPU亲和性设置
这是高级运维工程师必备技能:
# 查看进程CPU亲和性
taskset -cp PID
# 绑定进程到特定CPU核心
taskset -cp 0,1 PID
# 启动程序时指定CPU亲和性
taskset -c 0-3 your_program优化策略:
3. 中断优化
这是很多运维工程师容易忽略的高级技巧:
# 查看中断分布
cat /proc/interrupts
# 手动设置网卡中断亲和性
echo 2 > /proc/irq/24/smp_affinity
# 使用irqbalance自动优化
systemctl enable irqbalance
systemctl start irqbalance调优后,使用以下方法验证效果:
# 压力测试
stress-ng --cpu 4 --timeout 60s
# 对比调优前后的性能数据
sar -u 1 10 > after_optimization.log第一步:内存使用分析
# 查看系统内存详细信息
cat /proc/meminfo
# 分析内存使用最多的进程
ps aux --sort=-%mem | head -20
# 查看共享内存使用情况
ipcs -m第二步:Swap优化
Swap优化是性能提升的关键点:
# 查看当前swap使用情况
swapon -s
# 调整swap使用策略(重要!)
echo 10 > /proc/sys/vm/swappiness # 降低swap使用倾向
# 永久设置
echo'vm.swappiness = 10' >> /etc/sysctl.conf实战经验:默认swappiness值为60,这对服务器来说太高了。我建议:
第三步:内存回收策略优化
# 手动释放缓存(紧急情况使用)
echo 3 > /proc/sys/vm/drop_caches
# 优化内存分配策略
echo 0 > /proc/sys/vm/overcommit_memory
echo 50 > /proc/sys/vm/overcommit_ratio
# 永久设置
cat >> /etc/sysctl.conf << EOF
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF第四步:大页内存优化
对于内存密集型应用,大页内存可以显著提升性能:
# 查看大页内存状态
cat /proc/meminfo | grep -i huge
# 设置大页内存
echo 1024 > /proc/sys/vm/nr_hugepages
# 永久设置
echo'vm.nr_hugepages = 1024' >> /etc/sysctl.conf这是高级运维工程师的必备技能:
# 使用valgrind检测内存泄漏
valgrind --tool=memcheck --leak-check=full your_program
# 监控进程内存使用趋势
whiletrue; do
ps -o pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -10
echo"---"
sleep 5
done1. 文件系统选择与优化
不同的文件系统性能差异巨大:
# 推荐的文件系统挂载选项
mount -o noatime,nodiratime,barrier=0 /dev/sdb1 /data
# 永久设置
echo'/dev/sdb1 /data ext4 defaults,noatime,nodiratime,barrier=0 0 0' >> /etc/fstab文件系统性能对比(基于我的实测数据):
2. IO调度器优化
这是很多运维工程师忽略的重要优化点:
# 查看当前IO调度器
cat /sys/block/sda/queue/scheduler
# 设置IO调度器
echo noop > /sys/block/sda/queue/scheduler
# 永久设置
echo'echo noop > /sys/block/sda/queue/scheduler' >> /etc/rc.local调度器选择建议:
3. 磁盘参数优化
# 调整磁盘预读参数
blockdev --setra 4096 /dev/sda
# 优化磁盘队列深度
echo 32 > /sys/block/sda/queue/nr_requests
# 禁用磁盘节能模式
hdparm -B 255 /dev/sda这是我在生产环境中使用的监控脚本:
#!/bin/bash
# IO性能实时监控脚本
whiletrue; do
clear
echo"=== 磁盘IO实时监控 ==="
echo"时间: $(date)"
echo
# 显示磁盘使用率
iostat -x 1 1 | grep -E "(Device|sd)"
echo
# 显示IO最高的进程
echo"=== IO使用率最高的进程 ==="
iotop -b -n1 -a | head -15
echo
sleep 2
done1. TCP参数优化
这些参数调整可以显著提升网络性能:
# 优化TCP连接参数
cat >> /etc/sysctl.conf << EOF
# TCP窗口缩放
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
# TCP缓冲区大小
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# TCP连接复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
EOF
# 应用配置
sysctl -p2. 网络中断优化
# 查看网络中断分布
cat /proc/interrupts | grep eth0
# 设置网络中断CPU亲和性
echo 2 > /proc/irq/24/smp_affinity
# 启用多队列网卡支持
ethtool -L eth0 combined 43. 防火墙优化
# 优化iptables规则顺序(将常用规则放在前面)
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# 使用ipset提高大量IP处理效率
ipset create blacklist hash:ip
ipset add blacklist 192.168.1.100
iptables -A INPUT -m set --match-set blacklist src -j DROP# 实时网络流量监控
#!/bin/bash
INTERFACE="eth0"
whiletrue; do
RX1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
sleep 1
RX2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
RX_RATE=$(((RX2-RX1)/1024))
TX_RATE=$(((TX2-TX1)/1024))
echo"接收速率: ${RX_RATE} KB/s | 发送速率: ${TX_RATE} KB/s"
done背景:某电商网站在促销期间出现严重性能问题:
问题分析过程:
# 1. 系统整体性能分析
top -c
sar -u -r -b 1 10
# 2. 数据库性能分析
mysqladmin processlist
show full processlist;
# 3. 网络连接分析
ss -tuln | wc -l
netstat -an | grep TIME_WAIT | wc -l优化措施与效果:
# 调整MySQL进程优先级
renice -10 $(pgrep mysqld)
# 绑定MySQL到特定CPU核心
taskset -cp 0-3 $(pgrep mysqld)
# 优化Apache进程数量
vim /etc/httpd/conf/httpd.conf
# MaxRequestWorkers 400 → 200效果:CPU使用率从90%降至60%
# 调整MySQL缓冲池
vim /etc/mysql/my.cnf
# innodb_buffer_pool_size = 8G → 12G
# 减少swap使用
echo 5 > /proc/sys/vm/swappiness效果:数据库查询时间减少40%
# 更换IO调度器
echo deadline > /sys/block/sda/queue/scheduler
# 优化文件系统挂载参数
mount -o remount,noatime,nodiratime /dev/sda1 /var/lib/mysql效果:磁盘IO wait从30%降至5%
最终结果:
基于多年实战经验,我开发了这个一键性能检查脚本:
#!/bin/bash
# Linux性能一键检查脚本
# 作者:运维老司机
# 版本:v2.0
echo"================== Linux性能检查报告 =================="
echo"检查时间: $(date)"
echo"主机名: $(hostname)"
echo"内核版本: $(uname -r)"
echo
# 1. CPU性能检查
echo"【CPU性能分析】"
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
CPU_CORES=$(nproc)
LOAD_1MIN=$(uptime | awk -F'load average:''{print $2}' | awk '{print $1}' | tr -d ',')
echo"CPU核心数: $CPU_CORES"
echo"CPU使用率: ${CPU_USAGE}%"
echo"1分钟负载: $LOAD_1MIN"
if (( $(echo "$LOAD_1MIN > $CPU_CORES" | bc -l) )); then
echo"⚠️ 警告:系统负载过高!"
fi
echo
# 2. 内存性能检查
echo"【内存性能分析】"
TOTAL_MEM=$(free -m | awk 'NR==2{print $2}')
USED_MEM=$(free -m | awk 'NR==2{print $3}')
FREE_MEM=$(free -m | awk 'NR==2{print $4}')
AVAILABLE_MEM=$(free -m | awk 'NR==2{print $7}')
MEM_USAGE=$(echo"scale=1; $USED_MEM*100/$TOTAL_MEM" | bc)
echo"总内存: ${TOTAL_MEM}MB"
echo"已使用: ${USED_MEM}MB (${MEM_USAGE}%)"
echo"可用内存: ${AVAILABLE_MEM}MB"
if (( $(echo "$MEM_USAGE > 80" | bc -l) )); then
echo"⚠️ 警告:内存使用率过高!"
fi
echo
# 3. 磁盘性能检查
echo"【磁盘性能分析】"
df -h | grep -E '^/dev/' | whileread line; do
USAGE=$(echo$line | awk '{print $5}' | tr -d '%')
MOUNT=$(echo$line | awk '{print $6}')
echo"$line"
if [ "$USAGE" -gt 85 ]; then
echo"⚠️ 警告:$MOUNT 磁盘使用率过高 ($USAGE%)!"
fi
done
echo
# 4. 网络连接检查
echo"【网络连接分析】"
ESTABLISHED_CONN=$(ss -an | grep ESTAB | wc -l)
TIME_WAIT_CONN=$(ss -an | grep TIME-WAIT | wc -l)
echo"当前连接数: $ESTABLISHED_CONN"
echo"TIME_WAIT连接数: $TIME_WAIT_CONN"
if [ "$TIME_WAIT_CONN" -gt 5000 ]; then
echo"⚠️ 警告:TIME_WAIT连接数过多!"
fi
echo
# 5. 进程资源使用TOP10
echo"【资源使用TOP10进程】"
echo"--- CPU使用率TOP10 ---"
ps aux --sort=-%cpu | head -11 | tail -10
echo
echo"--- 内存使用率TOP10 ---"
ps aux --sort=-%mem | head -11 | tail -10
echo
echo"================== 检查完成 =================="#!/bin/bash
# 性能报告生成器
REPORT_DATE=$(date +%Y%m%d_%H%M%S)
REPORT_FILE="/tmp/performance_report_$REPORT_DATE.html"
# 生成HTML报告
cat > $REPORT_FILE << EOF
<!DOCTYPE html>
<html>
<head>
<title>Linux性能监控报告</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.warning { color: #ff6b6b; font-weight: bold; }
.normal { color: #51cf66; }
.info { color: #339af0; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<h1>🚀 Linux性能监控报告</h1>
<p>生成时间: $(date)</p>
<p>主机名: $(hostname)</p>
<h2>📊 系统概览</h2>
<table>
<tr><th>指标</th><th>当前值</th><th>状态</th></tr>
<tr><td>CPU使用率</td><td>$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')</td><td class="normal">正常</td></tr>
<tr><td>内存使用率</td><td>$(free | awk 'NR==2{printf "%.1f%%", $3*100/$2}')</td><td class="normal">正常</td></tr>
<tr><td>系统负载</td><td>$(uptime | awk -F'load average:' '{print $2}')</td><td class="info">监控中</td></tr>
</table>
<p>💡 <strong>优化建议</strong>:定期执行性能检查,建立监控基线,及时发现性能瓶颈。</p>
</body>
</html>
EOF
echo"性能报告已生成: $REPORT_FILE"1. 内核参数调优
这些是我在生产环境中验证过的最有效的内核参数:
# /etc/sysctl.conf 高性能配置
cat >> /etc/sysctl.conf << 'EOF'
# 网络优化
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_congestion_control = bbr
# 文件系统优化
fs.file-max = 1048576
fs.nr_open = 1048576
# 进程优化
kernel.pid_max = 4194304
# 内存优化
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.overcommit_memory = 1
EOF
sysctl -p2. 进程限制优化
# /etc/security/limits.conf
cat >> /etc/security/limits.conf << 'EOF'
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited
EOF3. 定制监控告警
#!/bin/bash
# 智能告警脚本
# 配置告警阈值
CPU_THRESHOLD=80
MEM_THRESHOLD=85
DISK_THRESHOLD=90
LOAD_THRESHOLD=4
# 检查CPU使用率
check_cpu() {
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
echo"CPU告警: 使用率${CPU_USAGE}%,超过阈值${CPU_THRESHOLD}%" | \
mail -s "服务器CPU告警" admin@company.com
fi
}
# 检查内存使用率
check_memory() {
MEM_USAGE=$(free | awk 'NR==2{printf "%.1f", $3*100/$2}')
if (( $(echo "$MEM_USAGE > $MEM_THRESHOLD" | bc -l) )); then
echo"内存告警: 使用率${MEM_USAGE}%,超过阈值${MEM_THRESHOLD}%" | \
mail -s "服务器内存告警" admin@company.com
fi
}
# 主函数
main() {
check_cpu
check_memory
# 可以添加更多检查函数
}
main基于多年实战经验,我总结出性能优化的"十字真经":
每日检查项目:
每周检查项目:
每月检查项目:
作为一名在运维一线奋战多年的工程师,我深知性能优化的重要性和复杂性。这篇文章浓缩了我多年来在生产环境中积累的宝贵经验,每一个技巧都经过实战验证。
记住这几个关键点:
微
信
群
WeChat group
为了方便大家更好的交流运维等相关技术问题,创建了微信交流群,需要加群的小伙伴们可以扫一扫下面的二维码加我为好友拉您进群(备注:加群)。

代
码
仓
库
| 代码仓库 | 网址 |
| Github | https://github.com/raymond999999 |
| Gitee | https://gitee.com/raymond9 |
博
客
Blog
| 博客 | 网址 |
| https://blog.csdn.net/qq_25599925 | |
| 稀土掘金 | https://juejin.cn/user/4262187909781751 |
| 知识星球 | https://wx.zsxq.com/group/15555885545422 |
| 阿里云社区 | https://developer.aliyun.com/profile/snzh3xpxaf6sg |
| 腾讯云社区 | https://cloud.tencent.com/developer/user/11823619 |
| 华为云社区 | https://developer.huaweicloud.com/usercenter/mycommunity/dynamics |
访问博客网站,查看更多优质原创内容。