服务器性能优化通用方案
适用环境: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_processesuse 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 TDA[响应变慢] --> B{监控指标}B -->|CPU高| C[优化代码/升级CPU]B -->|内存满| D[调整进程/增加内存]B -->|磁盘IO高| E[SSD/缓存优化]B -->|MySQL慢| F[索引优化/查询缓存]
-
调优黄金法则
- ✨ 每次只改一个参数
- 📊 修改前后记录性能指标
- 🔄 生产环境先灰度再全量
- 💾 配置文件必须备份