文章总结: 本文档是一份全面的Linux性能调优指南,涵盖CPU、内存、磁盘IO和网络四大核心子系统的优化策略。文章提供了监控分析与优化配置的Bash脚本,介绍了性能调优方法论及工具矩阵。核心内容包括调整内核参数、优化进程优先级、配置IO调度器及TCP协议栈等操作建议,旨在帮助运维人员定位瓶颈并提升系统性能。 综合评分: 90 文章分类: 其他
Linux 性能调优全面指南
原创
刘军军
运维星火燎原
2026年1月11日 00:00 河北
一、性能调优方法论
1.1 性能优化流程
flowchart TD
A[性能问题反馈]--> B[问题定位与分析]
B--> C{确定瓶颈类型?}
C-->|CPU瓶颈| D[CPU优化策略]
C-->|内存瓶颈| E[内存优化策略]
C-->|IO瓶颈| F[磁盘IO优化]
C-->|网络瓶颈| G[网络优化]
D--> H[实施优化措施]
E--> H
F--> H
G--> H
H--> I[效果验证]
I--> J{性能达标?}
J-->|是| K[优化完成]
J-->|否| B
styleAfill:#e1f5fe
styleKfill:#c8e6c9
1.2 性能分析工具矩阵
| | | | | | — | — | — | — | | 资源类型 | 监控工具 | 分析工具 | 优化工具 | | CPU | top, vmstat | perf, strace | taskset, nice | | 内存 | free, vmstat | pmap, valgrind | sysctl, hugepages | | 磁盘IO | iostat, iotop | blktrace, btrace | ionice, elevator | | 网络 | netstat, ss | tcpdump, wireshark | ethtool, sysctl | | 系统级 | sar, dstat | systemtap, ftrace | tuned, cpupower |
二、CPU性能调优
2.1 CPU监控与分析
#!/bin/bash
# cpu-performance-analysis.sh
echo"=== CPU性能分析 $(date) ==="
# 1. 总体CPU使用率
echo"1. CPU总体使用率:"
mpstat 1 3 | awk '/Average/ {printf "用户: %.1f%%, 系统: %.1f%%, 空闲: %.1f%%\n", $4, $6, $13}'
# 2. CPU负载
echo -e "\n2. 系统负载:"
echo"1分钟: $(cat /proc/loadavg | awk '{print $1}')"
echo"5分钟: $(cat /proc/loadavg | awk '{print $2}')"
echo"15分钟: $(cat /proc/loadavg | awk '{print $3}')"
echo"CPU核心数: $(nproc)"
# 3. 进程CPU使用排名
echo -e "\n3. CPU使用前10进程:"
ps aux --sort=-%cpu | head -11 | awk '{if(NR>1) printf "%-10s %-6s %s\n", $11, $3, $1}'
# 4. 上下文切换和中断
echo -e "\n4. 上下文切换和中断:"
vmstat 1 3 | tail -1 | awk '{printf "上下文切换: %d/s, 中断: %d/s\n", $12, $11}'
# 5. CPU频率和状态
echo -e "\n5. CPU频率信息:"
ifcommand -v cpupower &>/dev/null; then
cpupower frequency-info | grep -E "(current CPU|governor)"
else
cat /proc/cpuinfo | grep -E "(cpu MHz|model name)" | head -2
fi
2.2 CPU优化策略
#!/bin/bash
# cpu-optimization.sh
echo"=== CPU性能优化配置 ==="
# 1. 调整CPU调度器
echo"1. 调整CPU调度策略..."
# 对于桌面系统使用ondemand,服务器使用performance
cpupower frequency-set -g performance
# 2. 中断平衡配置
echo"2. 配置中断平衡..."
ifcommand -v irqbalance &>/dev/null; then
systemctl enable irqbalance
systemctl start irqbalance
fi
# 3. 进程优先级调整
echo"3. 优化进程优先级..."
# 降低后台进程优先级
echo'*/5 * * * * renice +5 $(pgrep -f "backup\|cron")' > /etc/cron.d/process-priority
# 4. CPU亲和性设置
echo"4. 设置CPU亲和性..."
# 将网络中断绑定到特定CPU
IRQ=$(grep eth0 /proc/interrupts | awk -F: '{print $1}')
echo"将中断 $IRQ 绑定到CPU0"
echo 1 > /proc/irq/$IRQ/smp_affinity
# 5. 内核参数优化
echo"5. 优化内核CPU参数..."
cat >> /etc/sysctl.conf << EOF
# CPU性能优化
kernel.sched_autogroup_enabled = 0
kernel.sched_migration_cost = 5000000
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
EOF
sysctl -p
echo "CPU优化配置完成!"
三、内存性能调优
3.1 内存监控与分析
#!/bin/bash
# memory-performance-analysis.sh
echo"=== 内存性能分析 $(date) ==="
# 1. 内存总体使用情况
echo"1. 内存使用概况:"
free -h | awk '
/Mem:/ {printf "总内存: %s, 已用: %s, 可用: %s, 使用率: %.1f%%\n", $2, $3, $7, $3/$2*100}
/Swap:/ {printf "交换分区: %s, 已用: %s, 空闲: %s\n", $2, $3, $4}'
# 2. 详细内存统计
echo -e "\n2. 详细内存信息:"
cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree)"
# 3. 内存使用前10进程
echo -e "\n3. 内存使用前10进程:"
ps aux --sort=-%mem | head -11 | awk '{if(NR>1) printf "%-10s %-6s %s\n", $11, $4, $1}'
# 4. Slab缓存信息
echo -e "\n4. Slab缓存:"
slabtop -o | head -10
# 5. 页面错误统计
echo -e "\n5. 页面错误统计:"
vmstat -s | grep -E "(page|swap)"
# 6. 检查内存泄漏
echo -e "\n6. 内存泄漏检查:"
ifcommand -v valgrind &>/dev/null; then
echo"Valgrind可用,可用于内存泄漏检测"
else
echo"安装valgrind进行内存泄漏检测: apt install valgrind"
fi
3.2 内存优化策略
#!/bin/bash
# memory-optimization.sh
echo"=== 内存性能优化配置 ==="
# 1. 配置交换分区策略
echo"1. 优化交换分区使用..."
# 降低swappiness值,减少交换频率
echo'vm.swappiness = 10' >> /etc/sysctl.conf
# 2. 配置大页内存
echo"2. 配置透明大页(THP)..."
# 对于数据库等内存密集型应用建议使用madvise
echo'madvise' > /sys/kernel/mm/transparent_hugepage/enabled
echo'madvise' > /sys/kernel/mm/transparent_hugepage/defrag
# 3. 配置overcommit策略
echo"3. 设置内存overcommit策略..."
echo'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo'vm.overcommit_ratio = 80' >> /etc/sysctl.conf
# 4. 调整缓存参数
echo"4. 优化内存缓存..."
cat >> /etc/sysctl.conf << EOF
# 内存缓存优化
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 3000
vm.vfs_cache_pressure = 50
EOF
# 5. 配置OOM killer
echo"5. 配置OOM killer策略..."
# 保护重要进程不被OOM killer杀死
echo'-1000' > /proc/$(pgrep sshd)/oom_score_adj
# 6. 启用内存压缩
echo"6. 启用zswap内存压缩..."
if grep -q zswap /etc/default/grub; then
echo"zswap已启用"
else
echo'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT zswap.enabled=1 zswap.compressor=lz4"' >> /etc/default/grub
update-grub
fi
sysctl -p
echo "内存优化配置完成!"
四、磁盘I/O性能调优
4.1 磁盘I/O监控与分析
#!/bin/bash
# disk-io-analysis.sh
echo"=== 磁盘I/O性能分析 $(date) ==="
# 1. 总体磁盘使用情况
echo"1. 磁盘空间使用:"
df -h | grep -E '(/dev/sd|/dev/xvd|/dev/nvme)'
# 2. I/O统计信息
echo -e "\n2. 磁盘I/O统计:"
iostat -x 1 3 | awk '
NR==3 {print "总体I/O统计:"}
NR>=4 && NR<=6 {printf "设备: %s, 读: %.1fMB/s, 写: %.1fMB/s, 利用率: %.1f%%\n", $1, $3, $4, $14}'
# 3. 等待I/O的进程
echo -e "\n3. I/O等待进程:"
iotop -o -b -n 3 | head -10
# 4. 文件系统类型和挂载参数
echo -e "\n4. 文件系统配置:"
mount | grep -E '(/dev/sd|/dev/xvd|/dev/nvme)' | awk '{print "设备: "$1", 类型: "$5", 参数: "$6}'
# 5. 磁盘调度器
echo -e "\n5. 磁盘调度器:"
for disk in /sys/block/sd*; do
echo"设备: $(basename $disk), 调度器: $(cat $disk/queue/scheduler)"
done
# 6. RAID状态检查
echo -e "\n6. RAID状态检查:"
if [ -f /proc/mdstat ]; then
cat /proc/mdstat
else
echo"未检测到软件RAID"
fi
4.2 磁盘I/O优化策略
#!/bin/bash
# disk-io-optimization.sh
echo"=== 磁盘I/O性能优化配置 ==="
# 1. 调整I/O调度器
echo"1. 优化磁盘调度器..."
# 对于SSD使用noop或deadline,HDD使用deadline或cfq
for disk in /sys/block/sd*; do
if [ $(cat $disk/queue/rotational) -eq 0 ]; then
echo"SSD设备: $(basename $disk),设置调度器为deadline"
echo deadline > $disk/queue/scheduler
else
echo"HDD设备: $(basename $disk),设置调度器为cfq"
echo cfq > $disk/queue/scheduler
fi
done
# 2. 调整I/O队列深度
echo"2. 优化队列深度..."
for disk in /sys/block/sd*; do
echo 256 > $disk/queue/nr_requests
echo 128 > $disk/queue/read_ahead_kb
done
# 3. 文件系统优化
echo"3. 优化文件系统挂载参数..."
# 修改/etc/fstab,添加noatime,nodiratime等参数
sed -i 's/defaults/defaults,noatime,nodiratime,barrier=0/' /etc/fstab
# 4. 调整虚拟内存参数
echo"4. 优化虚拟内存I/O..."
cat >> /etc/sysctl.conf << EOF
# 磁盘I/O优化
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
vm.swappiness = 10
EOF
# 5. 使用ionice调整进程I/O优先级
echo"5. 设置进程I/O优先级..."
# 将备份进程设置为低I/O优先级
echo'0 2 * * * ionice -c 3 /usr/bin/backup-script' >> /etc/crontab
# 6. 启用TRIM(SSD优化)
echo"6. 启用SSD TRIM支持..."
ifcommand -v fstrim &>/dev/null; then
echo'0 0 * * 0 /sbin/fstrim -a' >> /etc/crontab
echo"TRIM已启用,每周执行一次"
fi
sysctl -p
mount -o remount /
echo "磁盘I/O优化配置完成!"
五、网络性能调优
5.1 网络性能监控
#!/bin/bash
# network-performance-analysis.sh
echo"=== 网络性能分析 $(date) ==="
# 1. 网络接口统计
echo"1. 网络接口统计:"
ip -s link show | awk '
/^[0-9]:/ {iface=$2; getline; getline; rx=$1; getline; tx=$1; printf "接口: %s, 接收: %s, 发送: %s\n", iface, rx, tx}'
# 2. TCP连接状态
echo -e "\n2. TCP连接状态:"
ss -s | head -3
# 3. 网络错误统计
echo -e "\n3. 网络错误统计:"
netstat -i | awk 'NR>2 {printf "接口: %s, 错误: %s/%s\n", $1, $5, $6}'
# 4. 带宽使用情况
echo -e "\n4. 带宽使用监控:"
ifcommand -v iftop &>/dev/null; then
echo"使用 iftop -i eth0 -n -P 查看实时带宽"
else
sar -n DEV 1 3 | awk '/Average/ && $2 != "lo" {printf "接口: %s, 接收: %.1fKB/s, 发送: %.1fKB/s\n", $2, $5, $6}'
fi
# 5. 网络延迟测试
echo -e "\n5. 网络延迟检查:"
ping -c 4 8.8.8.8 | awk '/packet loss/ {print "丢包率: "$6} /rtt/ {print "延迟: "$4}'
# 6. 路由和MTU检查
echo -e "\n6. 路由和MTU配置:"
ip route | head -3
ip link show | grep mtu
5.2 网络性能优化
#!/bin/bash
# network-optimization.sh
echo"=== 网络性能优化配置 ==="
# 1. 调整TCP内核参数
echo"1. 优化TCP协议栈..."
cat >> /etc/sysctl.conf << EOF
# 网络性能优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.netdev_max_backlog = 30000
net.core.somaxconn = 32768
# TCP参数优化
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_max_syn_backlog = 32768
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
EOF
# 2. 调整网络接口参数
echo"2. 优化网络接口..."
INTERFACE=$(ip route | awk '/default/ {print $5}')
if [ -n "$INTERFACE" ]; then
# 调整队列长度
ethtool -G $INTERFACE rx 4096 tx 4096 2>/dev/null
# 启用GRO和LRO
ethtool -K $INTERFACE gro on lro on 2>/dev/null
# 调整中断合并
ethtool -C $INTERFACE rx-usecs 8 2>/dev/null
fi
# 3. 优化DNS解析
echo"3. 优化DNS配置..."
echo'options timeout:1 attempts:2 rotate' > /etc/resolv.conf
# 4. 调整连接跟踪
echo"4. 优化连接跟踪表..."
echo'net.netfilter.nf_conntrack_max = 524288' >> /etc/sysctl.conf
echo'net.netfilter.nf_conntrack_tcp_timeout_established = 3600' >> /etc/sysctl.conf
# 5. 启用TCP Fast Open
echo"5. 启用TCP Fast Open..."
echo 'net.ipv4.tcp_fastopen = 3
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:运维星火燎原 刘军军《Linux 性能调优全面指南》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论