前言
服务器性能问题往往不是单一原因造成的。CPU、内存、IO、网络任何一个环节出问题,都可能影响整体性能。Linux提供了丰富的内核参数和工具,可以针对性地优化系统性能。
但调优不是盲目改参数,需要先定位瓶颈,再针对性优化。这篇文章从性能分析到内核参数调优,系统性地讲解如何提升Linux系统性能。
一、性能分析:先定位瓶颈
1.1 性能分析工具
top/htop:实时查看系统资源使用
# top查看top# 按CPU排序:P# 按内存排序:M# 按时间排序:T# htop(更友好)htopvmstat:系统整体性能统计
# 每秒输出一次,共10次vmstat110# 关键指标:# r: 运行队列长度(>CPU核心数说明CPU不足)# b: 阻塞进程数(>0说明IO阻塞)# swpd: swap使用量(>0说明内存不足)# si/so: swap in/out(>0说明内存紧张)# us/sy/id/wa: CPU使用率(用户态/系统态/空闲/IO等待)iostat:IO性能统计
# 查看IO统计iostat -x1# 关键指标:# %util: 设备利用率(>80%说明IO饱和)# await: 平均等待时间(包括队列等待+服务时间)# svctm: 平均服务时间(纯IO时间)sar:系统活动报告
# 安装sysstatyuminstallsysstat# CentOSaptinstallsysstat# Ubuntu# CPU统计sar -u110# 内存统计sar -r110# IO统计sar -b110# 网络统计sar -n DEV1101.2 性能瓶颈识别
| 现象 | 可能原因 | 排查工具 |
|---|---|---|
| CPU使用率高 | CPU密集型任务、进程过多 | top, pidstat |
| 内存使用率高 | 内存不足、内存泄漏 | free, vmstat |
| IO等待高(%wa) | 磁盘IO瓶颈 | iostat, iotop |
| 网络延迟高 | 网络拥塞、带宽不足 | ping, traceroute, ss |
| 系统负载高 | CPU/IO/内存任一瓶颈 | uptime, top |
二、CPU性能调优
2.1 CPU调度器优化
查看当前调度器:
# 查看CPU调度器cat/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor# 常见调度器:# performance: 高性能模式(最高频率)# powersave: 省电模式(最低频率)# ondemand: 按需调整(默认)# conservative: 保守调整设置调度器:
# 临时设置(需要安装cpufrequtils)cpupower frequency-set -g performance# 永久设置(CentOS/RHEL)# 在 /etc/default/grub 添加:GRUB_CMDLINE_LINUX="intel_pstate=disable"# 然后 update-grub 和 reboot# 或使用cpupowercpupowerset-b0# 0=performance, 15=powersave生产环境建议:
- Web服务器:
performance(追求性能) - 数据库服务器:
performance(稳定性能) - 桌面系统:
ondemand(平衡性能和功耗)
2.2 CPU亲和性优化
绑定进程到特定CPU核心:
# 使用taskset绑定进程taskset -cp0,1<PID># 启动时绑定taskset -c0,1./app# 查看进程CPU亲和性taskset -p<PID>应用场景:
- 数据库:绑定到固定CPU核心,避免上下文切换
- 关键服务:隔离到独立CPU核心
2.3 中断均衡
查看中断分布:
# 查看中断统计cat/proc/interrupts# 查看软中断watch-n1'cat /proc/softirqs'均衡中断:
# 安装irqbalanceyuminstallirqbalance systemctlenableirqbalance systemctl start irqbalance# 手动绑定中断到CPU核心echo2>/proc/irq/24/smp_affinity# 绑定到CPU 1(二进制掩码)三、内存性能调优
3.1 内存参数优化
swappiness:控制swap使用倾向
# 查看当前值(0-100,默认60)cat/proc/sys/vm/swappiness# 临时修改(越小越不爱用swap)echo10>/proc/sys/vm/swappiness# 永久修改echo"vm.swappiness = 10">>/etc/sysctl.conf sysctl -p建议值:
- 数据库服务器:
10或更低(避免swap影响性能) - Web服务器:
30-60(平衡内存和性能) - 桌面系统:
60(默认值)
overcommit_memory:内存申请策略
# 查看当前值cat/proc/sys/vm/overcommit_memory# 0: 默认,内核自己判断# 1: 总是允许申请(可能OOM)# 2: 不允许超过物理内存+swap# 修改echo0>/proc/sys/vm/overcommit_memorydirty_ratio/dirty_background_ratio:控制脏页刷新
# 查看当前值cat/proc/sys/vm/dirty_ratio# 默认20%cat/proc/sys/vm/dirty_background_ratio# 默认10%# 调整(减少写回延迟)echo15>/proc/sys/vm/dirty_ratioecho5>/proc/sys/vm/dirty_background_ratio3.2 透明大页(THP)
问题:某些应用(如数据库)使用THP可能导致性能下降
禁用THP:
# 查看状态cat/sys/kernel/mm/transparent_hugepage/enabled# 临时禁用echonever>/sys/kernel/mm/transparent_hugepage/enabledechonever>/sys/kernel/mm/transparent_hugepage/defrag# 永久禁用(CentOS/RHEL)# 在 /etc/default/grub 添加:GRUB_CMDLINE_LINUX="transparent_hugepage=never"# 然后 update-grub 和 reboot建议:
- 数据库服务器:禁用THP
- 通用服务器:可以启用(默认)
3.3 内存回收优化
min_free_kbytes:保留最小空闲内存
# 查看当前值cat/proc/sys/vm/min_free_kbytes# 调整(根据内存大小,建议内存的1-3%)# 8GB内存:8192KB ~ 24576KBecho16384>/proc/sys/vm/min_free_kbytes四、IO性能调优
4.1 IO调度器优化
查看当前调度器:
cat/sys/block/sda/queue/scheduler# 常见调度器:# noop: 简单FIFO(适合SSD)# deadline: 按截止时间排序(适合数据库)# cfq: 公平队列(适合桌面系统)# mq-deadline: deadline的多队列版本(现代SSD)切换调度器:
# 临时切换echodeadline>/sys/block/sda/queue/scheduler# 永久切换(CentOS/RHEL)# 在 /etc/udev/rules.d/60-io-scheduler.rules 添加:ACTION=="add|change",KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"建议:
- SSD:
noop或mq-deadline - 数据库:
deadline - 虚拟化:
noop
4.2 文件系统优化
挂载选项优化:
# ext4优化挂载选项mount-o noatime,nodiratime,data=ordered /dev/sda1 /data# 写入 /etc/fstab/dev/sda1 /data ext4 noatime,nodiratime,data=ordered02参数说明:
noatime:不更新访问时间(减少写IO)nodiratime:目录不更新访问时间data=ordered:先写数据再写元数据(平衡性能和安全性)
4.3 文件描述符限制
# 查看当前限制ulimit-n# 临时修改ulimit-n1000000# 永久修改(/etc/security/limits.conf)* soft nofile1000000* hard nofile1000000# 系统级限制(/etc/sysctl.conf)fs.file-max=1000000五、网络性能调优
5.1 TCP参数优化
连接队列:
# SYN队列大小echo8192>/proc/sys/net/ipv4/tcp_max_syn_backlog# ACCEPT队列大小echo4096>/proc/sys/net/core/somaxconn缓冲区大小:
# 接收缓冲区(根据带宽延迟积调整)echo"4096 87380 16777216">/proc/sys/net/ipv4/tcp_rmem# 发送缓冲区echo"4096 16384 16777216">/proc/sys/net/ipv4/tcp_wmem# 自动调整echo1>/proc/sys/net/ipv4/tcp_moderate_rcvbufTIME_WAIT优化:
# TIME_WAIT重用echo1>/proc/sys/net/ipv4/tcp_tw_reuseecho1>/proc/sys/net/ipv4/tcp_timestamps# TIME_WAIT超时echo30>/proc/sys/net/ipv4/tcp_fin_timeout拥塞控制:
# 查看可用算法cat/proc/sys/net/ipv4/tcp_available_congestion_control# 设置算法(BBR适合高带宽低延迟)echo"tcp_bbr">/proc/sys/net/ipv4/tcp_congestion_control5.2 网络连接跟踪
conntrack表大小:
# 查看当前大小cat/proc/sys/net/netfilter/nf_conntrack_max# 调整(根据连接数调整)echo2000000>/proc/sys/net/netfilter/nf_conntrack_max连接跟踪超时:
# 查看超时设置cat/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established# 调整(默认432000秒=5天)echo3600>/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established5.3 网络设备优化
网卡队列:
# 查看队列数ethtool-l eth0# 调整队列数(需要网卡支持)ethtool-L eth0 combined8网卡offload:
# 查看offload功能ethtool-k eth0# 启用TSO(TCP Segmentation Offload)ethtool-K eth0 tso on# 启用GRO(Generic Receive Offload)ethtool-K eth0 gro on六、综合优化配置
6.1 生产环境推荐配置
/etc/sysctl.conf:
# 网络优化net.ipv4.tcp_max_syn_backlog=8192net.core.somaxconn=4096net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_timestamps=1net.ipv4.tcp_fin_timeout=30net.ipv4.tcp_rmem=40968738016777216net.ipv4.tcp_wmem=40961638416777216net.ipv4.tcp_moderate_rcvbuf=1net.ipv4.tcp_congestion_control=bbr# 内存优化vm.swappiness=10vm.overcommit_memory=0vm.dirty_ratio=15vm.dirty_background_ratio=5vm.min_free_kbytes=16384# 文件系统fs.file-max=1000000fs.nr_open=1000000# 网络连接跟踪net.netfilter.nf_conntrack_max=2000000net.netfilter.nf_conntrack_tcp_timeout_established=3600应用配置:
sysctl -p6.2 不同场景的优化重点
| 场景 | 优化重点 | 关键参数 |
|---|---|---|
| Web服务器 | 网络、连接数 | somaxconn, tcp_max_syn_backlog, file-max |
| 数据库服务器 | 内存、IO | swappiness, THP, IO调度器 |
| 缓存服务器 | 内存、网络 | swappiness, tcp_rmem/wmem |
| API网关 | 网络、连接跟踪 | conntrack_max, tcp参数 |
| 批处理任务 | CPU、IO | CPU调度器, IO调度器 |
七、应用层优化
7.1 进程优先级
# 设置进程优先级(-20到19,越小优先级越高)nice-n -10 ./app# 修改运行中进程优先级renice-10<PID>7.2 内存锁定
mlock:锁定内存,防止swap
// C示例#include<sys/mman.h>mlock(ptr,size);// 锁定内存munlock(ptr,size);// 解锁应用场景:
- 数据库缓存
- 关键数据结构
7.3 CPU亲和性(应用层)
// Go示例:设置CPU亲和性import"github.com/shirou/gopsutil/cpu"cpu.SetCPUAffinity([]int{0,1})// 绑定到CPU 0和1八、性能监控与告警
8.1 关键指标监控
# 脚本:监控系统性能#!/bin/bashwhiletrue;do# CPU使用率cpu=$(top-bn1|grep"Cpu(s)"|awk'{print $2}'|cut-d'%'-f1)# 内存使用率mem=$(free|grepMem|awk'{printf "%.2f", $3/$2 * 100}')# IO等待iowait=$(vmstat12|tail-1|awk'{print $16}')echo"$(date)CPU:${cpu}% MEM:${mem}% IO:${iowait}%"# 告警逻辑if(($(echo "$cpu>80"|bc-l)));thenecho"CPU使用率过高:${cpu}%"fisleep60done8.2 Prometheus监控
node_exporter指标:
# prometheus.ymlscrape_configs:-job_name:'node'static_configs:-targets:['localhost:9100']关键指标:
node_cpu_seconds_total:CPU使用时间node_memory_MemTotal_bytes:总内存node_memory_MemAvailable_bytes:可用内存node_disk_io_time_seconds_total:磁盘IO时间node_network_receive_bytes_total:网络接收
告警规则:
groups:-name:system_alertsrules:-alert:HighCPUUsageexpr:100-(avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)>80for:5mlabels:severity:warning-alert:HighMemoryUsageexpr:(1-(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100>90for:5mlabels:severity:warning-alert:HighIOWaitexpr:rate(node_cpu_seconds_total{mode="iowait"}[5m]) * 100>50for:5mlabels:severity:warning九、跨网络性能优化
9.1 场景:多机房性能调优
如果服务器分布在不同的网络环境(不同机房、不同云),网络延迟和丢包率可能较高,需要特殊优化。
解决方案:
- VPN/专线:稳定但部署周期长
- 组网工具:WireGuard、ZeroTier、星空组网等,快速组建虚拟内网
使用组网工具后,不同网络的服务器可以通过虚拟IP直接通信,TCP优化参数同样适用:
# 统一网络后,可以用Ansible批量配置优化参数ansible all -m shell -a"sysctl -w net.ipv4.tcp_congestion_control=bbr"ansible all -m shell -a"sysctl -w net.ipv4.tcp_rmem='4096 87380 33554432'"优势:
- 统一网络后,性能调优配置简单
- 可以用Ansible批量应用优化参数
- 支持服务发现,动态添加节点
9.2 批量性能调优
# 使用Ansible批量应用sysctl配置ansible all -m copy -a"src=sysctl.conf dest=/etc/sysctl.d/99-performance.conf"ansible all -m shell -a"sysctl -p /etc/sysctl.d/99-performance.conf"十、常见问题与注意事项
10.1 参数调优的风险
- 缓冲区过大:占用内存,可能导致OOM
- TIME_WAIT重用:可能影响NAT设备
- BBR算法:可能与其他流量不公平
- 参数冲突:某些参数组合可能不兼容
建议:
- 先在测试环境验证
- 逐步调整,观察效果
- 保留回滚方案
10.2 不同场景的参数选择
| 场景 | 关键参数 | 推荐值 |
|---|---|---|
| 高并发Web服务 | somaxconn, tcp_max_syn_backlog | 4096, 8192 |
| 低延迟RPC | tcp_nodelay, BBR | 启用, bbr |
| 跨网络传输 | tcp_rmem/wmem, BBR | 增大, bbr |
| 数据库服务器 | swappiness, THP | 10, 禁用 |
10.3 监控告警
# 关键指标监控脚本#!/bin/bashCPU=$(top-bn1|grep"Cpu(s)"|awk'{print $2}'|cut-d'%'-f1)MEM=$(free|grepMem|awk'{printf "%.0f", $3/$2 * 100}')IO=$(vmstat12|tail-1|awk'{print $16}')if(($(echo "$CPU>80"|bc-l)));thenecho"CPU告警:${CPU}%"fi总结
| 优化方向 | 关键参数/方法 | 预期效果 | 注意事项 |
|---|---|---|---|
| CPU | 调度器、亲和性、中断均衡 | 提升CPU利用率 | 避免过度绑定 |
| 内存 | swappiness, THP, dirty_ratio | 减少swap、提升性能 | 数据库禁用THP |
| IO | 调度器、文件系统选项 | 提升IO性能 | 根据存储类型选择 |
| 网络 | TCP参数、拥塞控制、连接跟踪 | 提升网络性能 | BBR需要内核支持 |
| 应用层 | 进程优先级、内存锁定 | 优化应用性能 | 需要应用支持 |
| 监控 | Prometheus、自定义脚本 | 及时发现瓶颈 | 设置合理告警阈值 |
| 跨网络 | 组网工具统一网络 | 简化批量优化 | 需要安全审计 |
核心思路:
- 先分析性能瓶颈(CPU、内存、IO、网络)
- 针对性优化内核参数
- 应用层配合优化(进程优先级、内存锁定)
- 监控关键指标,及时调整
- 跨网络场景用组网工具统一优化
注意事项:
- 参数调优需要结合应用特性
- 生产环境谨慎调整,先测试再上线
- 跨网络场景可以用组网工具简化批量优化
- 保留回滚方案,避免影响生产