性能调优前:先定位瓶颈
调优的前提是找到真正的瓶颈。盲目优化往往事倍功半。常用的诊断命令:
# 查看CPU和内存整体使用率
top -bn1 | head -20
# 查看CPU详细信息(每核利用率)
mpstat -P ALL 1 3
# 查看内存使用详情
free -h && cat /proc/meminfo | grep -E "Cached|Buffer|Swap"
# 查看磁盘I/O
iostat -xz 1 3
# 查看网络流量
sar -n DEV 1 3
通过以上命令,可以快速判断瓶颈是 CPU、内存、磁盘还是网络。
CPU优化
1. 调整CPU调度策略
对于Web服务器,将 CPU 调度器设置为 performance 模式(而非默认的 powersave):
# 查看当前调度模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 设置为performance模式(需要root)
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
2. 进程优先级调整
使用 nice 和 renice 调整关键进程的优先级,给 Nginx/MySQL 更高的调度优先级:
# 降低非关键进程的优先级(nice值越大优先级越低)
renice +10 -p [非关键进程PID]
# 提升关键进程优先级
renice -5 -p [Nginx/MySQL的PID]
内存优化
1. 调整Swappiness参数
默认 swappiness=60 表示系统会较早使用 Swap,对于内存充足的服务器应降低此值:
# 临时修改(重启失效)
sysctl vm.swappiness=10
# 永久修改
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
2. 定期清理Page Cache
当服务器内存持续高位,可以释放页缓存(不影响运行中的进程):
# 释放page cache
sync && echo 1 > /proc/sys/vm/drop_caches
# 释放dentries和inodes
sync && echo 2 > /proc/sys/vm/drop_caches
# 全部释放
sync && echo 3 > /proc/sys/vm/drop_caches
3. 优化MySQL/MariaDB内存配置
MySQL 是内存消耗大户,合理配置可大幅提升性能:
[mysqld]
# InnoDB缓冲池,建议设为可用内存的50-70%
innodb_buffer_pool_size = 1G
# 查询缓存(MySQL 5.x有效,8.0已移除)
query_cache_size = 64M
query_cache_type = 1
磁盘I/O优化
1. 选择合适的I/O调度器
云服务器通常使用 SSD,应将 I/O 调度器设置为 none 或 mq-deadline:
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 修改为none(SSD推荐)
echo none > /sys/block/sda/queue/scheduler
2. 启用noatime挂载选项
默认每次文件访问都会更新 atime,对高并发场景有一定I/O压力。在 /etc/fstab 中添加 noatime:
/dev/sda1 / ext4 defaults,noatime 0 1
网络参数优化
针对高并发Web服务,优化内核网络参数:
# /etc/sysctl.conf 中添加
# 增大TCP连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 开启TCP Fast Open
net.ipv4.tcp_fastopen = 3
# 优化TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 扩大端口范围
net.ipv4.ip_local_port_range = 1024 65535
sysctl -p
总结:调优是持续过程
服务器性能调优没有一劳永逸的方案,需要根据业务特点和流量变化持续调整。建议:
- 建立性能基准(Baseline),记录调优前后的关键指标
- 每次只改一个参数,观察效果后再改下一个
- 使用监控系统(Prometheus+Grafana)持续观测
- 定期Review,结合业务增长及时扩容