Linux性能调优:从内核参数到应用优化
// 目录 · contents
前言 性能分析方法论 USE方法 性能分析工具全景图 CPU调度优化 查看CPU状态 CPU亲和性(CPU Affinity) 调度器参数 内存管理优化 内存状态分析 vm.swappiness Huge Pages(大页内存) 内存回收参数 磁盘I/O优化 I/O状态分析 I/O调度器 预读(Readahead) 文件系统优化 网络调优 TCP缓冲区 连接队列 TIME_WAIT优化 端口范围与连接跟踪 完整的网络调优sysctl配置 perf工具实战 CPU性能分析 火焰图分析 常用perf命令 综合调优示例 高并发Web服务器 数据库服务器 总结
前言
Linux性能调优是一门既需要理论基础又需要实践经验的技术。一个配置不当的系统可能浪费30%-50%的硬件能力。本文将从CPU、内存、磁盘I/O和网络四个维度,系统讲解Linux性能调优方法。
性能分析方法论
USE方法
USE方法(Utilization, Saturation, Errors)适用于分析系统资源:
graph TB
subgraph USE["USE方法"]
U["Utilization 利用率<br>资源繁忙时间占比"]
S["Saturation 饱和度<br>排队等待的工作量"]
E["Errors 错误<br>错误事件计数"]
end
subgraph Resources["系统资源"]
CPU["CPU"]
MEM["Memory"]
DISK["Disk I/O"]
NET["Network"]
end
USE --> Resources
CPU
mpstat -P ALL 1
vmstat的r列
perf stat
Memory
free -m
vmstat的si/so列
dmesg \| grep oom
Disk
iostat -xz 1
iostat的avgqu-sz
smartctl
Network
sar -n DEV 1
ss -s的overflowed
ip -s link
性能分析工具全景图
graph TB
subgraph Observability["观测工具"]
subgraph Basic["基础工具"]
top["top/htop"]
vmstat["vmstat"]
iostat["iostat"]
sar["sar"]
free["free"]
ss["ss/netstat"]
end
subgraph Advanced["高级工具"]
perf["perf"]
bpftrace["bpftrace"]
strace["strace"]
ftrace["ftrace"]
bcc["BCC tools"]
end
subgraph Profiling["剖析工具"]
flamegraph["Flame Graph"]
perfrecord["perf record"]
offcpu["Off-CPU Analysis"]
end
end
CPU调度优化
查看CPU状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 lscpunproc mpstat -P ALL 1 pidstat 1 pidstat -p <pid> -t 1 vmstat 1
CPU亲和性(CPU Affinity)
将进程绑定到特定CPU核心,减少缓存失效和上下文切换:
1 2 3 4 5 6 7 8 9 10 11 12 taskset -p <pid> taskset -c 0-3 ./myapp taskset -p -c 0,1 <pid>echo "0-3" > /sys/fs/cgroup/myapp/cpuset.cpusecho "0" > /sys/fs/cgroup/myapp/cpuset.mems
调度器参数
1 2 3 4 5 6 7 8 9 10 11 12 sysctl kernel.sched_min_granularity_ns=3000000 sysctl kernel.sched_wakeup_granularity_ns=4000000 sysctl kernel.sched_migration_cost_ns=5000000 sysctl kernel.numa_balancing=1
graph LR
subgraph CFS["CFS调度器"]
VRT["虚拟运行时间<br>(vruntime)"]
RBTree["红黑树<br>按vruntime排序"]
Pick["选择vruntime<br>最小的进程"]
end
VRT --> RBTree --> Pick --> |"运行"| Process["进程"]
Process --> |"更新vruntime"| VRT
内存管理优化
内存状态分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 free -hcat /proc/meminfo pmap -x <pid> smem -t -k
vm.swappiness
控制内核使用Swap的倾向(0-200,默认60):
1 2 3 4 5 6 7 8 cat /proc/sys/vm/swappiness sysctl -w vm.swappiness=10echo "vm.swappiness=10" >> /etc/sysctl.d/99-tuning.conf
graph LR
subgraph Swappiness["vm.swappiness"]
Low["swappiness=0~10<br>尽量不使用Swap<br>适合:数据库"]
Mid["swappiness=30~60<br>适度平衡<br>适合:通用服务器"]
High["swappiness=100+<br>积极使用Swap<br>适合:桌面系统"]
end
Huge Pages(大页内存)
大页减少TLB(Translation Lookaside
Buffer)Miss,适用于大内存应用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cat /proc/meminfo | grep Huge sysctl -w vm.nr_hugepages=1024 cat /sys/kernel/mm/transparent_hugepage/enabledecho madvise > /sys/kernel/mm/transparent_hugepage/enabledecho madvise > /sys/kernel/mm/transparent_hugepage/defrag
内存回收参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 sysctl -w vm.dirty_ratio=15 sysctl -w vm.dirty_background_ratio=5 sysctl -w vm.dirty_bytes=1073741824 sysctl -w vm.dirty_background_bytes=536870912 sysctl -w vm.dirty_expire_centisecs=1500 sysctl -w vm.overcommit_memory=0 sysctl -w vm.panic_on_oom=0
磁盘I/O优化
I/O状态分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 iostat -xz 1 iotop -oP pidstat -d 1
I/O调度器
1 2 3 4 5 6 7 8 9 cat /sys/block/sda/queue/schedulerecho "mq-deadline" > /sys/block/sda/queue/schedulerecho "none" > /sys/block/nvme0n1/queue/scheduler
none
不排序,FIFO
NVMe SSD
mq-deadline
保证截止时间
通用SSD/HDD
bfq
公平带宽分配
桌面交互场景
kyber
低延迟优化
高速SSD
预读(Readahead)
1 2 3 4 5 6 7 8 9 10 cat /sys/block/sda/queue/read_ahead_kbecho 2048 > /sys/block/sda/queue/read_ahead_kb blockdev --getra /dev/sda blockdev --setra 4096 /dev/sda
文件系统优化
1 2 3 4 5 6 7 8 9 10 11 mount -o noatime,nodiratime,discard /dev/sda1 /data /dev/sda1 /data ext4 defaults,noatime,nodiratime,discard 0 2 mount -o noatime,inode64,logbufs=8 /dev/sda1 /data
网络调优
TCP缓冲区
1 2 3 4 5 6 7 8 9 10 11 12 sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216" sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216" sysctl -w net.core.rmem_max=16777216 sysctl -w net.core.wmem_max=16777216 sysctl -w net.core.rmem_default=262144 sysctl -w net.core.wmem_default=262144 sysctl -w net.ipv4.tcp_window_scaling=1
连接队列
graph LR
Client["客户端"] --> |"SYN"| SYN_Q["SYN队列<br>(半连接队列)<br>tcp_max_syn_backlog"]
SYN_Q --> |"SYN+ACK"| Client
Client --> |"ACK"| Accept_Q["Accept队列<br>(全连接队列)<br>somaxconn"]
Accept_Q --> |"accept()"| App["应用程序"]
1 2 3 4 5 6 7 8 9 10 11 12 sysctl -w net.ipv4.tcp_max_syn_backlog=65535 sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.tcp_abort_on_overflow=0 sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_max_syn_backlog=65535
TIME_WAIT优化
1 2 3 4 5 6 7 8 sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_max_tw_buckets=262144 sysctl -w net.ipv4.tcp_fin_timeout=15
端口范围与连接跟踪
1 2 3 4 5 6 7 8 9 10 sysctl -w net.ipv4.ip_local_port_range="1024 65535" sysctl -w net.netfilter.nf_conntrack_max=1048576 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600 sysctl -w fs.file-max=2097152ulimit -n 1048576
完整的网络调优sysctl配置
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 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.core.netdev_max_backlog = 65535 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.ip_local_port_range = 1024 65535 fs.file-max = 2097152
perf工具实战
CPU性能分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 perf stat -d ./myapp perf record -g -p <pid> -- sleep 30 perf report perf script | stackcollapse-perf.pl | flamegraph.pl > flamegraph.svg
火焰图分析
graph TB
subgraph FlameGraph["火焰图解读"]
direction TB
Root["全部采样"]
Func1["main() - 100%"]
Func2["handleRequest() - 60%"]
Func3["queryDB() - 35%"]
Func4["parseJSON() - 25%"]
Func5["executeSQL() - 30%"]
Func6["serialize() - 5%"]
Root --> Func1
Func1 --> Func2
Func1 --> Func4
Func2 --> Func3
Func3 --> Func5
Func3 --> Func6
end
1 2 3 4 5 6 7 8 9 10 11 perf record -F 99 -g -p <pid> -- sleep 30 perf script > perf.out ./stackcollapse-perf.pl perf.out | ./flamegraph.pl > oncpu.svg bpftrace -e ' kprobe:finish_task_switch { @[kstack, comm] = count(); } ' > offcpu.out
常用perf命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 perf top -p <pid> perf trace -p <pid> -s perf stat -e cache-references,cache-misses -p <pid> -- sleep 10 perf stat -e branch-instructions,branch-misses -p <pid> -- sleep 10 perf mem record -p <pid> -- sleep 10 perf mem report
综合调优示例
高并发Web服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.core.netdev_max_backlog = 65535 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 15 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 vm.swappiness = 10 vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 fs.file-max = 2097152 fs.inotify.max_user_watches = 524288
1 2 3 4 5 * soft nofile 1048576 * hard nofile 1048576 * soft nproc 65535 * hard nproc 65535
数据库服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 vm.swappiness = 1 vm.dirty_ratio = 40 vm.dirty_background_ratio = 10 vm.dirty_expire_centisecs = 500 net.core.somaxconn = 4096 net.ipv4.tcp_keepalive_time = 600 kernel.shmmax = 68719476736 kernel.shmall = 16777216
总结
Linux性能调优的核心方法:
先测量后优化 :使用USE方法识别瓶颈,避免盲目调参
一次只改一个参数 :确认效果后再调整下一个
CPU :关注上下文切换、调度延迟,合理使用CPU亲和性
内存 :调整swappiness、大页配置,监控OOM事件
磁盘I/O :选择合适的调度器,优化预读和文件系统挂载选项
网络 :调整TCP缓冲区、连接队列、TIME_WAIT参数
持久化配置 :所有优化写入/etc/sysctl.d/,重启后生效
性能调优是一个持续的过程,需要结合监控数据不断迭代。切忌照搬网上的”最优配置”,每个系统的工作负载不同,最优参数也不同。