Linux下LNMP性能怎样优化
小樊
31
2025-12-12 02:25:49
Linux下LNMP性能优化实战指南
一 优化总览与瓶颈定位
- 明确目标:优先提升并发连接数、P95/P99 延迟与吞吐,在保证稳定性的前提下做配置迭代。
- 建立基线:用 ab、wrk、k6 等做压测,记录QPS、RPS、错误率、CPU/内存/磁盘IO、TCP重传等指标,作为调优前后对比依据。
- 分层排查:按网络 → Nginx → PHP-FPM → MySQL → 应用SQL/代码 → 存储链路定位瓶颈,避免一次性改动过多参数。
- 变更原则:一次只改一处,小步迭代并回放压测,观察指标是否改善且无明显副作用。
二 Nginx层优化
- 进程与连接
- 设置worker_processes auto(通常等于CPU核心数);必要时启用worker_cpu_affinity auto做亲和性。
- 提升worker_connections(如 4096/8192,视内存与文件句柄而定);设置worker_rlimit_nofile 65535放宽句柄上限。
- 开启sendfile on与tcp_nopush on提升静态文件与小包传输效率;按需开启tcp_nodelay。
- 长连接与头部
- 客户端长连接:keepalive_timeout 65、keepalive_requests 100000,减少握手与TIME_WAIT。
- 上游长连接:在 upstream 配置中启用keepalive N(如 32/64),并配合proxy_http_version 1.1; proxy_set_header Connection “”。
- 日志与静态资源
- 访问日志使用缓冲:access_log /var/log/nginx/access.log main buffer=16k flush=1m;高并发可临时关闭访问日志以排除干扰。
- 静态资源缓存:对图片/CSS/JS设置expires 30d; add_header Cache-Control “public”。
- 压缩与缓存
- 启用gzip on压缩文本类资源(注意避免对已压缩格式再压缩);对带宽敏感场景收益明显。
- 反向代理/内容缓存:配置proxy_cache_path与proxy_cache,显著降低后端负载与时延。
三 PHP与PHP-FPM优化
- OPcache(必开)
- 建议启用并合理分配内存与文件数:
- opcache.enable=1
- opcache.memory_consumption=128–256M
- opcache.interned_strings_buffer=8–64M
- opcache.max_accelerated_files=10000–40000
- opcache.validate_timestamps=1(开发)/ 0(生产,配合部署刷新)
- opcache.jit=on(PHP 8+),opcache.jit_buffer_size=128M
- PHP-FPM进程模型
- 动态模式(pm=dynamic)常用参数:
- pm.max_children:按内存与单进程RSS估算,保证峰值不OOM
- pm.start_servers / pm.min_spare_servers / pm.max_spare_servers:平滑应对流量波动
- pm.max_requests:如1000–5000,用于回收潜在内存泄漏进程
- 请求与资源
- 合理设置memory_limit(如128–512M)、max_execution_time(如30–60s),避免长时阻塞。
- 使用持久连接(如 mysqli ‘p:’ 前缀)降低连接开销;对外部服务尽量异步或队列化。
四 MySQL与存储层优化
- InnoDB关键参数
- innodb_buffer_pool_size:常设为物理内存的50%–70%(留出系统与其他进程余量)。
- innodb_log_file_size:适当增大(如256M–1G)以减少检查点抖动(变更需按流程重启)。
- innodb_flush_log_at_trx_commit:1(最安全)/ 2(性能更高,允许秒级丢失)/ 0(更高吞吐,风险更大)。
- sync_binlog:1(最安全)/ 1000(折中)/ 0(更高吞吐,风险更大)。
- max_connections:按应用连接池与内存评估,避免过高导致上下文切换与内存膨胀。
- 查询缓存:在MySQL 8.0+ 已移除,低版本高并发下建议关闭(query_cache_type=0)。
- 索引与SQL
- 使用EXPLAIN分析执行计划,避免全表扫描;为高频WHERE/JOIN/ORDER BY建立复合索引与覆盖索引。
- 避免**SELECT ***、在WHERE中对列使用函数、前导通配符LIKE;分页与统计类查询尽量走索引或物化中间结果。
- 操作系统与存储
- vm.swappiness=10(数据库尽量不交换);vm.dirty_ratio=15–20%、**vm.dirty_background_ratio=5–10%**平滑回写。
- I/O调度器:SSD优先noop/deadline;文件系统用XFS/Ext4并挂载noatime。
- 硬件与架构:优先SSD、合理RAID10;读写分离、主从复制/组复制分担读负载。
五 Linux内核网络与系统资源
- 文件句柄与队列
- 提高系统/用户级句柄:sys.fs.file_max与nofile(limits.conf),并设worker_rlimit_nofile 65535。
- 提升连接排队能力:net.core.somaxconn=65535;必要时增大net.core.netdev_max_backlog。
- 端口与TIME_WAIT
- 扩大临时端口范围:net.ipv4.ip_local_port_range=“1024 65535”。
- 加速回收:net.ipv4.tcp_fin_timeout=30;在负载均衡/短连接场景可启用net.ipv4.tcp_tw_reuse=1(注意与业务兼容)。
- 其他网络参数
- 按需启用net.ipv4.tcp_fastopen=3、net.ipv4.tcp_slow_start_after_idle=0、net.ipv4.tcp_syncookies=1;若使用连接跟踪(如NAT/iptables),适当提升nf_conntrack_max与相关超时。
- 监控与压测
- 监控:Prometheus + Grafana观测连接、QPS、延迟、慢查询等;日志用ELK或等效方案聚合分析。
- 压测:用ab/wrk/k6复现实测流量,逐步加压,验证配置收益与稳定性。