关于 performance-tuning
面向 Linux 管理员的性能调优技能,介绍如何分析 CPU、内存、磁盘 I/O 和网络瓶颈,并通过基准测试验证系统参数调整效果。
主要功能
- 01按基线、定位、调整和复测迭代
- 02监控 CPU、内存、磁盘与网络
- 03调整 sysctl 内核参数
- 04配置 I/O 调度器和 CPU 调速器
- 05使用工具进行性能基准测试
- 06提供 Web 和数据库调优参考
适用场景
- 01排查服务器延迟或吞吐瓶颈
- 02为高流量活动准备基础设施
- 03优化数据库、Web 或应用主机
- 04比较系统调整前后的性能
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill performance-tuning安装后在 Claude Code 中输入/performance-tuning确认已加载。
详细介绍
性能调优
通过调整内核参数、选择 I/O 调度器、管理内存、配置 CPU 调控器和进行基准测试,优化 Linux 系统性能。涵盖调优方法、实际的 sysctl 设置,以及基于工具的验证。
适用场景
- 服务器出现高延迟、吞吐量瓶颈或资源耗尽
- 为高流量活动或负载测试准备基础设施
- 为生产环境调优数据库服务器、Web 服务器或应用程序主机
- 排查瓶颈究竟来自 CPU、内存、磁盘 I/O 还是网络
- 在更改前后建立性能基线指标
- 为容器、虚拟机或裸机主机配置内核参数
前提条件
- 拥有目标系统的 root 或 sudo 访问权限
- 已安装
sysstat软件包(提供sar、iostat、mpstat) - 已安装用于 CPU 分析的
linux-tools或perf软件包 - 基准测试工具:
fio(磁盘)、sysbench(CPU/内存)、iperf3(网络) - 在进行任何更改前收集基线指标
性能分析方法
始终按以下顺序进行:
- 收集基线 -- 使用工具测量当前性能
- 识别瓶颈 -- 确定瓶颈来自 CPU、内存、I/O 还是网络
- 更改一个参数 -- 应用单项调优更改
- 测量影响 -- 重新运行相同的基准测试
- 记录 -- 记录更改及其效果
- 迭代或回退 -- 如果有益则保留更改,否则回退
系统监控工具
# CPU and process monitoring
top # Interactive process viewer
htop # Enhanced interactive viewer
mpstat -P ALL 2 # Per-CPU utilization every 2 seconds
pidstat -u 2 # Per-process CPU usage
# Memory monitoring
free -h # Memory summary
vmstat 2 # Virtual memory stats every 2 seconds
# Columns: r=runnable, b=blocked, si/so=swap in/out, bi/bo=block I/O
# Disk I/O monitoring
iostat -xz 2 # Extended disk stats every 2 seconds
# Key columns: %util, await (latency), r/s, w/s
iotop -oP # Show processes doing I/O
# Network monitoring
sar -n DEV 2 # Network interface stats
ss -s # Socket summary
nstat # Network counters
# CPU profiling (requires perf)
perf top # Real-time function-level CPU profiling
perf stat -a sleep 10 # System-wide counters for 10 seconds
perf record -g -a sleep 30 # Record 30 seconds of call stacks
perf report # Analyze recorded data
# One-liner: check all major resources
echo "=== CPU ===" && mpstat 1 1 && echo "=== MEM ===" && free -h && echo "=== DISK ===" && iostat -x 1 1 && echo "=== NET ===" && ss -s
Sysctl 内核参数调优
网络调优
# /etc/sysctl.d/60-network-performance.conf
# Increase the maximum socket receive/send buffer sizes
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
# TCP buffer auto-tuning (min, default, max in bytes)
net.ipv4.tcp_rmem = 4096 1048576 134217728
net.ipv4.tcp_wmem = 4096 1048576 134217728
# Increase connection backlog for high-traffic servers
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
# Enable TCP fast open (client and server)
net.ipv4.tcp_fastopen = 3
# Reuse TIME_WAIT sockets for new connections
net.ipv4.tcp_tw_reuse = 1
# Increase the range of ephemeral ports
net.ipv4.ip_local_port_range = 1024 65535
# TCP keepalive tuning (detect dead connections faster)
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# Disable slow start after idle (keeps congestion window open)
net.ipv4.tcp_slow_start_after_idle = 0
# Enable BBR congestion control (requires kernel 4.9+)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
内存调优
# /etc/sysctl.d/60-memory-performance.conf
# Reduce swappiness (0-100, lower = less swap usage)
# 10 for general servers, 1 for database servers
vm.swappiness = 10
# Dirty page ratios (controls when dirty data is flushed to disk)
# Lower values = more frequent, smaller writes (better for SSDs)
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
# For large-memory systems writing to fast storage
# vm.dirty_ratio = 40
# vm.dirty_background_ratio = 10
# Increase inotify limits (for apps watching many files)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 1024
# Maximum number of open file descriptors system-wide
fs.file-max = 2097152
# Virtual memory overcommit
# 0 = heuristic (default), 1 = always overcommit, 2 = never overcommit
vm.overcommit_memory = 0
# For Redis or similar in-memory stores, use:
# vm.overcommit_memory = 1
# Disable Transparent Huge Pages if it causes latency spikes (common with databases)
# Done via boot parameter or runtime:
# echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
应用 Sysctl 更改
# Apply all sysctl files
sysctl --system
# Apply a specific file
sysctl -p /etc/sysctl.d/60-network-performance.conf
# Set a parameter temporarily (lost on reboot)
sysctl -w vm.swappiness=10
# Verify a parameter
sysctl vm.swappiness
sysctl net.ipv4.tcp_congestion_control
I/O 调度器配置
# Check the current scheduler for a device
cat /sys/block/sda/queue/scheduler
# Output example: [mq-deadline] none kyber bfq
# Set the scheduler temporarily
echo mq-deadline > /sys/block/sda/queue/scheduler # Good for databases
echo none > /sys/block/nvme0n1/queue/scheduler # Best for NVMe SSDs
echo bfq > /sys/block/sda/queue/scheduler # Good for interactive desktop
# Scheduler recommendations:
# NVMe SSD: none (noop) -- minimal overhead, hardware handles scheduling
# SATA SSD: mq-deadline -- provides fairness with low latency
# HDD: mq-deadline -- prevents starvation, good for databases
# Desktop: bfq -- prioritizes interactive I/O
# Make persistent via udev rule
cat <<'EOF' > /etc/udev/rules.d/60-io-scheduler.rules
# Set mq-deadline for rotational (HDD) devices
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"
# Set none for non-rotational (SSD/NVMe) devices
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
EOF
udevadm control --reload-rules
# Tune read-ahead for sequential workloads (database sequential scans)
blockdev --setrahead 4096 /dev/sda # 4096 sectors = 2 MB
# Enable TRIM for SSDs (weekly via systemd timer)
systemctl enable --now fstrim.timer
fstrim -av # Manual run
CPU 调控器配置
# Check available governors
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# Output: performance powersave schedutil
# Check current governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# Set all CPUs to performance mode (maximum frequency)
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo performance > "$cpu"
done
# Set using cpupower (if installed)
cpupower frequency-set -g performance
# Governor recommendations:
# Server (production): performance -- max frequency, lowest latency
# Server (general): schedutil -- kernel-driven dynamic scaling
# Laptop / idle server: powersave -- minimize power consumption
# Make persistent via systemd service
cat <<'EOF' > /etc/systemd/system/cpu-governor.service
[Unit]
Description=Set CPU governor to performance
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set -g performance
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now cpu-governor
# Disable CPU boost (turbo) if consistent latency is needed
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
基准测试工具
fio -- 磁盘 I/O 基准测试
# Install fio
apt install -y fio # Debian/Ubuntu
dnf install -y fio # RHEL/CentOS
# Sequential read test (simulates backup reads)
fio --name=seq-read --ioengine=libaio --direct=1 --rw=read \
--bs=1M --numjobs=4 --size=1G --runtime=60 --time_based --group_reporting
# Sequential write test
fio --name=seq-write --ioengine=libaio --direct=1 --rw=write \
--bs=1M --numjobs=4 --size=1G --runtime=60 --time_based --group_reporting
# Random read (4K blocks -- simulates database IOPS)
fio --name=rand-read --ioengine=libaio --direct=1 --rw=randread \
--bs=4k --numjobs=16 --iodepth=64 --size=1G --runtime=60 --time_based --group_reporting
# Random write (4K blocks)
fio --name=rand-write --ioengine=libaio --direct=1 --rw=randwrite \
--bs=4k --numjobs=16 --iodepth=64 --size=1G --runtime=60 --time_based --group_reporting
# Mixed random read/write (70/30 -- typical database workload)
fio --name=mixed --ioengine=libaio --direct=1 --rw=randrw --rwmixread=70 \
--bs=4k --numjobs=8 --iodepth=32 --size=1G --runtime=60 --time_based --group_reporting
sysbench -- CPU 和内存基准测试
# Install: apt install -y sysbench (Debian) / dnf install -y sysbench (RHEL)
# CPU benchmark
sysbench cpu --threads=4 --time=30 run
# Memory benchmark
sysbench memory --threads=4 --time=30 --memory-block-size=1K --memory-total-size=100G run
iperf3 -- 网络基准测试
# Install iperf3
apt install -y iperf3
# Start server on one host
iperf3 -s
# Run client test from another host
iperf3 -c <server-ip> -t 30 -P 4 # 30 seconds, 4 parallel streams
# Test with UDP (measure packet loss)
iperf3 -c <server-ip> -u -b 1G -t 30
# Reverse mode (server sends to client)
iperf3 -c <server-ip> -R -t 30
调优配置快速参考
Web 服务器(nginx/Apache)
# /etc/sysctl.d/60-webserver.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.ip_local_port_range = 1024 65535
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
fs.file-max = 2097152
vm.swappiness = 10
数据库服务器(PostgreSQL/MySQL)
# /etc/sysctl.d/60-database.conf
vm.swappiness = 1
vm.dirty_ratio = 15
vm.dirty_background_ratio = 3
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
net.core.somaxconn = 4096
fs.file-max = 2097152
# Disable THP for databases
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
故障排查
| 症状 | 诊断命令 | 常见修复方法 |
|---|---|---|
| CPU 使用率高,但没有明显的进程 | perf top、mpstat -P ALL 2 | 检查内核级问题:软中断、硬件中断 |
| 负载平均值高,CPU 使用率低 | vmstat 2(检查 b 列) | I/O 瓶颈:调优调度器,检查磁盘健康状况 |
| 系统频繁进行交换 | free -h、vmstat 2(检查 si/so) | 降低 vm.swappiness,增加 RAM,查找内存泄漏 |
| 磁盘延迟突增 | iostat -x 2(检查 await) | 切换 I/O 调度器,降低脏数据比例,添加 SSD |
| “打开的文件过多”错误 | cat /proc/sys/fs/file-nr | 增大 fs.file-max 和 LimitNOFILE |
| 网络吞吐量低 | iperf3 -c <server>、ethtool | 增大缓冲区,启用 BBR,检查 MTU |
| 负载下应用程序超时 | ss -s、sysctl net.core.somaxconn | 增大 somaxconn 和 tcp_max_syn_backlog |
| 延迟不稳定 | 检查 CPU 调控器 | 将调控器设为 performance,禁用睿频 |
相关技能
linux-administration-- 通用系统监控与管理systemd-services-- 通过单元文件中的 cgroups 设置资源限制block-storage-- 存储层性能(LVM、RAID、文件系统)nfs-storage-- NFS 专项性能调优
评论
支持 Markdown