温馨提示×

centos lnmp如何优化内存

小樊
36
2025-12-17 17:37:03
栏目: 智能运维

CentOS LNMP 内存优化实操指南

一 基线评估与监控

  • 明确总内存与角色分工:例如 4C/8G 的小站,建议将 MySQL InnoDB 缓冲池控制在约 4–6G,为 PHP-FPM 工作进程Nginx、系统与其他服务预留充足余量。
  • 建立监控基线:
    • 系统层:free -mtop/htopvmstat 1iostat -x 1 观察可用内存、缓存/缓冲、swap、I/O 等待。
    • Nginx:启用 stub_status 观察 Active/Reading/Writing/Waiting 连接数,确认是否连接数触顶。
    • PHP-FPM:观察进程数、请求排队与慢请求。
    • MySQL:关注 Threads_connected、慢查询、临时表与缓冲池命中率。
  • 压测定位瓶颈:使用 wrk 进行不同并发与连接数的压测,例如 wrk -t12 -c100 -d30s --latency http://your-domain/,对比 RPS、P95/P99 延迟、超时/错误 等指标,验证优化成效。

二 Nginx 内存优化

  • 进程与连接:
    • worker_processes 设为 CPU 核心数
    • worker_connections 结合业务并发与文件句柄上限设置;
    • 启用 keepalive_timeoutkeepalive_requests 复用连接,降低连接建立开销。
  • 传输与压缩:启用 sendfile on,按需开启 gzip 压缩减少传输体积。
  • 文件句柄:提升 worker_rlimit_nofile(如 65535)以避免 “too many open files”。
  • 内核网络配合:提高 net.core.somaxconnnet.ipv4.ip_local_port_rangenet.ipv4.tcp_fin_timeout 等,缓解高并发下的连接排队与端口耗尽。

三 PHP-FPM 内存优化

  • 进程模型与内存上限:
    • 采用 动态(dynamic)按需(ondemand) 模式,避免静态模式下常驻进程过多;
    • 计算单进程常驻内存(RSS)后,设置 pm.max_children,确保大致满足:max_children × 单进程RSS < 可用内存 × 安全系数(如 0.7)
    • 合理设置 pm.start_serverspm.min_spare_serverspm.max_spare_servers,避免频繁启停与空闲过多。
  • 脚本与缓存:
    • memory_limit 设为业务所需上限,避免无限制;
    • 启用并调优 OPcache(如 opcache.memory_consumptionopcache.max_accelerated_files),减少重复编译开销;
    • 禁用不必要的 PHP 扩展,降低常驻内存占用。

四 MySQL 内存优化

  • 缓冲池:将 innodb_buffer_pool_size 设为物理内存的 50%–70%(数据库专用机可更高,但需预留系统与其他服务内存)。
  • 连接与会话:
    • 合理设置 max_connections,避免过大导致内存与上下文切换激增;
    • 结合业务将 tmp_table_sizemax_heap_table_size 设为 64M 或更高(但需控制总量,避免把内存吃满)。
  • 持久性与刷盘策略:
    • innodb_flush_log_at_trx_commit:主库设为 1(安全优先),从库可设为 2(吞吐优先);
  • 查询与索引:
    • 避免 SELECT *,使用覆盖索引与合适的 JOIN
    • 启用并定期分析 慢查询日志,优化高成本 SQL。

五 操作系统与压测闭环

  • 内核与虚拟内存:
    • 适度降低 vm.swappiness(如 10–30),减少换页;
    • 调整 vm.dirty_background_ratiovm.dirty_ratio,平衡写回与抖动。
  • 文件句柄与网络栈:
    • 提升进程可打开文件数(如 ulimit -n 65535 或 systemd 服务 LimitNOFILE);
    • 优化 net.core.somaxconnnet.ipv4.tcp_tw_reusenet.ipv4.tcp_fin_timeout 等,提升连接复用与回收效率。
  • 存储与文件系统:优先 SSD,文件系统可用 XFS,并结合 noatime 等挂载选项减少不必要写放大。
  • 监控与持续迭代:
    • 使用 Prometheus + Grafana 等监控内存、连接、查询、I/O 等关键指标;
    • 以压测数据驱动参数微调,遵循“小步变更—回归验证—保留基线”的流程。

0