centos lnmp资源如何分配
小樊
42
2026-01-10 21:30:24
CentOS 上 LNMP 资源分配实操指南
一、分配原则与容量基线
- 明确业务类型与峰值:静态资源为主、API/动态脚本为主、是否含文件上传/大文件下载,峰值 QPS 与并发连接数目标。
- 预留安全余量:系统与应用总内存预留**20%–30%**给 OS 和其他服务(缓存、日志、监控等),避免 OOM 与抖动。
- 单实例建议起步内存不低于2 GiB,更高并发与数据库负载建议**4–8 GiB+**并考虑拆分组件到多台机器。
二、系统层资源与内核参数
- 文件句柄与进程数:提升可打开文件数与用户进程数,避免“too many open files”。在**/etc/security/limits.conf**设置:
-
-
-
-
- hard nproc 65535
同时可在 systemd 服务单元中设置如:LimitNOFILE=65535。
- TCP/IP 与连接队列:优化端口与连接复用,缓解高并发下的连接瓶颈。
- net.core.somaxconn=262144
- net.ipv4.tcp_max_syn_backlog=262144
- net.ipv4.ip_local_port_range=1024 65000
- net.ipv4.tcp_tw_reuse=1
- net.ipv4.tcp_tw_recycle=0(在 NAT/负载均衡环境建议关闭)
- net.ipv4.tcp_fin_timeout=1
- 可选:net.ipv4.tcp_max_tw_buckets=6000(根据监控调整)
- 说明:Nginx/数据库等作为服务进程,其最大连接能力受 somaxconn 与内核/应用配置共同约束。
三、Nginx 资源分配与并发调优
- 进程与 CPU 绑定:充分利用多核,降低上下文切换与锁争用。
- worker_processes auto
- worker_cpu_affinity auto(或按核显式绑定)
- 文件描述符与连接:
- worker_rlimit_nofile 65535–100000
- events { worker_connections 10240–20480; use epoll; multi_accept on; }
- 理论最大并发连接数 ≈ worker_processes × worker_connections(再受系统限制)
- 长连接与头部/缓冲:
- keepalive_timeout 60–120s;keepalive_requests 500–2000
- client_header_buffer_size 4k;large_client_header_buffers 8 16k
- sendfile on;aio on(Linux 高 I/O 场景收益明显)
- 监控与压测:用 ss/awk 观察连接与错误率,基准测试建议用 wrk/ab 小步迭代验证。
四、PHP-FPM 内存与进程分配
- 进程模型选择(pm):
- static:进程数固定,适合稳定高负载、减少调度开销。
- dynamic:按需增减,适合流量波动,常用且易调。
- ondemand:请求才创建,适合低频访问或资源紧张场景。
- 动态模式关键参数(示例为常见起点,需结合实际压测微调):
- pm = dynamic
- pm.max_children = 50(上限,受内存约束)
- pm.start_servers = 5
- pm.min_spare_servers = 5
- pm.max_spare_servers = 35
- pm.max_requests = 1000(抗内存泄漏,周期性回收)
- 内存估算与上限控制:
- 估算公式:max_children ≤ 可用内存 × 0.8 ÷ 单进程常驻内存
- 经验值:PHP-FPM 单进程常驻约20–30 MB(框架/扩展不同会有差异,以实际监控为准)。例如:可用内存2 GB,按 25 MB/进程估算,max_children 不宜超过约65,再结合压测取安全值。
- 观测与调优:
- 开启 pm.status_path 与 Nginx 状态页,观察 active/queued 与慢请求
- 打开 request_slowlog_timeout(如1s)定位慢脚本,配合 opcache 提升性能。
五、MySQL 内存与连接分配
- 内存关键项(以 InnoDB 为主):
- innodb_buffer_pool_size:建议为可用内存的50%–70%(专用数据库更高,混合部署取中值),是提升性能的首要杠杆。
- max_connections:结合业务并发与连接占用内存评估,避免过大导致内存浪费与争用。
- tmp_table_size / max_heap_table_size:控制内存临时表上限,避免磁盘临时表频繁触发。
- sort_buffer_size / join_buffer_size:会话级,按需适度,避免全局放大。
- CPU 资源控制(MySQL 8.0+):
- 资源组 Resource Groups:将线程绑定到指定 vCPU 并设置优先级(-20…19,系统组高于用户组),用于区分 OLTP/批处理等负载的 CPU 配额与调度。示例:
- CREATE RESOURCE GROUP Batch TYPE=USER VCPU=2–3 THREAD_PRIORITY=10;
- SET RESOURCE GROUP Batch FOR thread_id; 或 /* RESOURCE_GROUP(Batch) */ 提示单语句执行
- 注意:启用线程池插件时资源组不可用;Linux 上需具备 CAP_SYS_NICE 能力。
- 监控与迭代:
- 关注 Threads_connected、Innodb_buffer_pool_usage、慢查询与临时表比例,结合压测逐步调整。