服务器性能优化通用方案
适用环境:Ubuntu 24.04 + Nginx + PHP-FPM + MySQL
版本要求:Nginx 1.18+,PHP 7.4+,MySQL 8.0+
一、系统层优化
1.1 内核参数调优 (/etc/sysctl.conf
)
# 网络优化(通用所有配置)
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 65535
# 内存管理(按内存调整)
vm.swappiness = 10 # 内存<16G时设为5
vm.dirty_ratio = 10 # 内存>32G时可增至15
vm.dirty_background_ratio = 5
# 文件系统(通用)
fs.file-max = 500000
fs.inotify.max_user_watches = 524288
1.2 资源限制 (/etc/security/limits.conf
)
* soft nofile 100000
* hard nofile 150000
www-data soft nofile 100000 # Nginx/PHP用户
mysql hard nofile 65535 # MySQL用户
1.3 Swap配置策略
内存大小 |
Swap建议 |
创建命令 |
≤16GB |
内存的1.5倍 |
fallocate -l 24G /swapfile |
16-32GB |
8GB |
fallocate -l 8G /swapfile |
≥64GB |
4GB |
fallocate -l 4G /swapfile |
二、Nginx优化
2.1 基础配置 (/etc/nginx/nginx.conf
)
worker_processes auto; # 自动匹配CPU核心
worker_rlimit_nofile 100000; # 文件描述符限制
events {
worker_connections 8192; # 计算公式:worker_connections ≤ (worker_rlimit_nofile) / worker_processes
use epoll; # Linux高性能模式
multi_accept on;
}
http {
keepalive_timeout 15;
keepalive_requests 1000;
sendfile on;
tcp_nopush on;
# Gzip压缩(通用)
gzip on;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript;
# 静态资源缓存(通用)
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
}
2.2 进程连接数优化表
CPU核心数 |
worker_processes |
worker_rlimit_nofile |
worker_connections |
最大并发连接数 |
2核 |
2 |
20000 |
4096 |
8192 |
4核 |
4 |
40000 |
8192 |
32768 |
8核 |
8 |
80000 |
8192 |
65536 |
16核 |
16 |
160000 |
8192 |
131072 |
三、PHP-FPM优化
3.1 进程管理策略 (/etc/php/7.4/fpm/pool.d/www.conf
)
pm = dynamic
; 计算公式:pm.max_children = (内存GB × 0.8) / PHP进程平均内存MB
pm.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.max_requests = 1000
request_terminate_timeout = 30
3.2 内存分配参考表
内存总量 |
pm.max_children |
内存范围 |
4GB |
40-50 |
70-100MB/进程 |
8GB |
80-100 |
70-100MB/进程 |
16GB |
160-200 |
70-100MB/进程 |
32GB |
300-400 |
70-100MB/进程 |
64GB |
600-800 |
70-100MB/进程 |
3.3 OpCache配置 (/etc/php/7.4/fpm/php.ini
)
opcache.enable=1
; 内存分配建议:
; 内存≤16G:128M
; 内存32G:192M
; 内存≥64G:256M
opcache.memory_consumption=192
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
四、MySQL优化
4.1 核心配置 (/etc/mysql/my.cnf
)
[mysqld]
# 缓冲池大小(关键参数)
innodb_buffer_pool_size = 总内存 × 缓冲池比例
# 日志文件大小(SSD建议)
innodb_log_file_size = 缓冲池大小 / 8
# 通用优化
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = ON
innodb_flush_method = O_DIRECT
skip_name_resolve = ON
4.2 缓冲池分配策略
总内存 |
缓冲池比例 |
计算示例 |
≤4GB |
50% |
2GB |
4-16GB |
60% |
8GB内存 → 4.8GB |
16-64GB |
70% |
32GB内存 → 22.4GB |
≥64GB |
80% |
128GB内存 → 102GB |
4.3 连接数配置
max_connections = 基础值 × CPU核心数
; 基础值:
; - 内存<8G: 50
; - 内存8-32G: 75
; - 内存>32G: 100
# 示例:8核32G内存
max_connections = 75 * 8 # 计算结果为600
thread_cache_size = max_connections × 0.1
五、监控与维护方案
sudo apt install htop iotop iftop netdata
sudo apt install mytop percona-toolkit
5.2 关键指标报警阈值
指标 |
警告阈值 |
危险阈值 |
检查命令 |
CPU使用率 |
70% |
90% |
top -1 |
内存使用 |
80% |
90% |
free -h |
Swap使用 |
>0 |
>100MB |
swapon -s |
MySQL缓冲命中率 |
<95% |
<90% |
SHOW STATUS LIKE 'Innodb_buffer_pool_read%' |
PHP进程内存 |
>120MB |
>150MB |
ps -o rss,cmd -C php-fpm |
5.3 自动化维护脚本
#!/bin/bash
mysql -e "SET GLOBAL innodb_max_dirty_pages_pct_lwm=10; SET GLOBAL innodb_max_dirty_pages_pct=90;"
mysqlcheck --optimize --all-databases
find /var/log/nginx -type f -mtime +7 -delete
systemctl reload php7.4-fpm
六、硬件资源分配矩阵
资源规格 |
Nginx重点 |
PHP重点 |
MySQL重点 |
预期并发 |
2核4G |
静态缓存 Gzip压缩 |
降级OpCache 限制进程数 |
小缓冲池 关闭性能模式 |
500-1,000 |
4核8G |
FastCGI缓存 连接复用 |
进程池优化 APCu缓存 |
缓冲池4GB 线程缓存 |
1,000-3,000 |
8核32G |
负载均衡 HTTP/2 |
JIT编译 OPcache优化 |
缓冲池22GB 读写分离 |
5,000-10,000 |
16核64G+ |
四层代理 动态扩容 |
Swoole协程 内存数据库 |
多缓冲实例 分库分表 |
20,000+ |
七、调优验证流程
压力测试工具
ab -n 10000 -c 500 http://yourdomain.com/
wrk -t8 -c1000 -d30s --latency http://yourdomain.com/
瓶颈诊断步骤
graph TD
A[响应变慢] --> B{监控指标}
B -->|CPU高| C[优化代码/升级CPU]
B -->|内存满| D[调整进程/增加内存]
B -->|磁盘IO高| E[SSD/缓存优化]
B -->|MySQL慢| F[索引优化/查询缓存]
调优黄金法则
- ✨ 每次只改一个参数
- 📊 修改前后记录性能指标
- 🔄 生产环境先灰度再全量
- 💾 配置文件必须备份