奋斗
努力

Nginx + PHP/Python高并发场景下,Linux服务器内核参数如何优化?

云计算

在高并发场景下(如 Nginx + PHP-FPM 或 Nginx + uWSGI/Gunicorn),Linux 内核参数的优化是提升服务器吞吐量、降低延迟和防止资源耗尽的关键。以下是一份系统化的内核参数优化指南,涵盖网络、文件描述符、内存、进程调度等核心领域。


一、核心优化目标

  1. 提高连接处理能力:支持更多同时在线用户。
  2. 减少上下文切换与锁竞争。
  3. 避免文件描述符/端口耗尽。
  4. 优化 TCP 协议栈性能。
  5. 合理分配内存,避免 OOM 或 Swap 抖动。

二、关键内核参数详解(/etc/sysctl.conf)

⚠️ 修改后执行 sysctl -p 生效,建议备份原配置。

1. 文件描述符限制(File Descriptors)

Nginx 和 PHP-FPM/uWSGI 每个连接都占用一个文件描述符。高并发下极易触及默认上限(通常为 1024)。

# 系统级最大文件描述符数
fs.file-max = 655350

# 每个进程的最大文件描述符数(需在 /etc/security/limits.conf 中同步设置)
fs.nr_open = 655350

✅ 配套操作:在 /etc/security/limits.conf 中添加:

* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

2. TCP 网络栈优化

a. 启用 TCP 快速回收与 TIME_WAIT 管理

# 允许重用 TIME-WAIT sockets
net.ipv4.tcp_tw_reuse = 1

# 缩短 TIME-WAIT socket 等待时间(秒)
net.ipv4.tcp_fin_timeout = 30

# 禁用 TCP 时间戳(若不需要,可提升性能;但建议保留以支持 PAWS)
# net.ipv4.tcp_timestamps = 0

# 启用 TCP 快速打开(TFO),提速三次握手
net.ipv4.tcp_fastopen = 3

# 启用 SYN Cookie 防御 SYN Flood
net.ipv4.tcp_syncookies = 1

# 增加半连接队列和全连接队列长度
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535

📌 注意:somaxconn 必须 ≥ Nginx 的 listen backlog 值,否则 Nginx 会忽略 backlog 设置。

b. 调整 TCP 窗口缩放与拥塞控制

# 启用 TCP 窗口缩放
net.ipv4.tcp_window_scaling = 1

# 使用 BBR 拥塞控制算法(推荐 Linux 4.9+)
net.core.default_qdisc = fq
net.ipv4.congestion_control = bbr

# 增加 TCP 接收/发送缓冲区自动调优范围
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 增加最大套接字缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

3. 内存管理优化

a. 虚拟内存与交换策略

# 降低 swappiness(默认 60),减少不必要的 swap
vm.swappiness = 10

# 提高 inode 缓存效率
vm.vfs_cache_pressure = 50

# 减少透明大页(THP)对低延迟应用的负面影响(可选)
# echo never > /sys/kernel/mm/transparent_hugepage/enabled

b. 内存过载保护

# 当内存不足时,更积极地回收页面而非触发 OOM
vm.overcommit_memory = 1
vm.overcommit_ratio = 90

4. 进程与调度优化

a. 增加最大进程数

# 系统级最大进程数
kernel.pid_max = 65535

# 确保 ulimit -u 足够大(通过 limits.conf 设置)

b. 禁用 NUMA 平衡(单 NUMA 节点服务器)

# 如果服务器是单 NUMA 节点,可禁用 NUMA 平衡以提升局部性
numa_balancing = 0

5. 其他实用参数

# 启用 IP 转发(如需作为网关)
net.ipv4.ip_forward = 0

# 禁用 ICMP 重定向(安全加固)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 启用反向路径过滤(严格模式)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

三、应用层配合优化

仅调优内核不够,还需与应用协同:

1. Nginx 配置要点

worker_processes auto;          # 匹配 CPU 核心数
worker_rlimit_nofile 65535;     # 与 sysctl fs.nr_open 一致

events {
    worker_connections 65535;   # 单个 worker 最大连接数
    use epoll;                  # Linux 下使用 epoll
    multi_accept on;            # 一次接受多个新连接
}

http {
    keepalive_timeout 65;
    keepalive_requests 10000;   # 长连接复用
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 上传大小限制
    client_max_body_size 10m;
}

2. PHP-FPM 优化

pm = dynamic                    ; 动态子进程管理
pm.max_children = 50            ; 根据内存和负载调整
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500           ; 防止内存泄漏
request_terminate_timeout = 30s ; 超时杀死僵死进程

3. Python(uWSGI/Gunicorn)优化

  • Gunicorn:
    gunicorn app:app --workers 4 --threads 2 --timeout 30
  • uWSGI:
    processes = 4
    threads = 2
    master = true
    vacuum = true
    max-requests = 5000

四、监控与验证

  1. 检查当前参数:

    sysctl -a | grep tcp
    cat /proc/sys/fs/file-nr
    ulimit -n
    ss -s
  2. 监控关键指标:

    • netstat -an | grep TIME_WAIT | wc -l
    • ss -s 查看连接状态分布
    • dmesg | grep -i oom 检查是否发生 OOM
    • 使用 htop、iotop、nethogs 监控资源
  3. 压测验证:
    使用 wrk、ab 或 hey 进行压力测试,观察 QPS、延迟、错误率变化。


五、注意事项

  • 渐进式调整:不要一次性修改所有参数,逐步调整并观察效果。
  • 硬件依赖:CPU 核心数、内存大小、磁盘 I/O 都会影响最优参数。
  • 版本兼容:BBR 需要 Linux 内核 ≥ 4.9,TCP Fast Open 需要内核 ≥ 3.7。
  • 安全考量:某些参数(如 tcp_tw_reuse)在特定网络环境下可能带来风险,需结合实际业务评估。
  • 重启服务:部分参数需重启 Nginx/PHP-FPM 才能完全生效。

六、完整 sysctl.conf 示例片段

# File descriptors
fs.file-max = 655350
fs.nr_open = 655350

# Network optimization
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.default_qdisc = fq
net.ipv4.congestion_control = bbr

# Memory management
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.overcommit_memory = 1

# Process limits
kernel.pid_max = 65535

通过以上优化,Nginx + PHP/Python 架构在高并发场景下的稳定性、吞吐量和响应速度将得到显著提升。务必结合具体业务负载、硬件资源和监控数据进行持续调优。

未经允许不得转载:云服务器 » Nginx + PHP/Python高并发场景下,Linux服务器内核参数如何优化?