压测Nginx时对Linux内核参数优化,以支持更高的并发

Linux内核参数优化

编辑/etc/sysctl.conf文件

fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024  61000
net.ipv4.tcp_rmem = 4096  32768  262142
net.ipv4.tcp_wmem = 4096  32768  262142
net.core.netdev_max_backlog = 8096
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024

保存上述配置并执行 sysctl -p 使其生效。

参数意义解析

  • fs.file-max:单个进程可以同时打开的最大句柄数,这将直接影响最大并发连接数。
  • net.ipv4.tcp_tw_reuse:设置为1,表示允许将TIME-WAIT状态的socket重新用于新的TCP连接。
  • net.ipv4.tcp_keepalive_time:表示当keepalive启用时,TCP发送keepalive消息的频率。默认是2小时。设置小一些可以更快的清理无效的连接。
  • net.ipv4.tcp_fin_timeout:表示当FIN-WAIT-2状态的最大时间。
  • net.ipv4.tcp_max_tw_buckets:表示操作系统允许TIME_WAIT套接字数量的最大值。该参数的默认值是180000。
  • net.ipv4.ip_local_port_range:表示本地使用UDP和TCP端口的取值范围。
  • net.ipv4.tcp_rmem:表示TCP接受缓存的最小值、默认值、最大值。(是一个TCP的recv滑动窗口)
  • net.ipv4.tcp_wmem:表示TCP发送缓存的最小值、默认值、最大值。(是一个TCP的send滑动窗口)
  • net.core.netdev_max_backlog:当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。该参数表示队列的最大值。
  • net.core.rmem_default:表示内核socket接受缓存区的默认大小。
  • net.core.wmem_default:表示内核socket发送缓存区的默认大小。
  • net.core.rmem_max:表示内核socket接受缓存区的最大大小。
  • net.core.wmem_max:表示内核socket发送缓存区的默认大小。
  • net.ipv4.tcp_syncookies:用于解决TCP的SYN攻击。
  • net.ipv4.tcp_max_syn_backlog:该参数表示TCP三次握手建立连接时接受SYN请求队列的最大长度,默认为1024,若值设置过大可能导致Nginx繁忙来不及accept新的连接。

注意事项

  • 滑动窗口的大小与socket缓存区会在一定程度上影响并发连接数。每个TCP连接都会为维护TCP滑动窗口而消耗内存,这个窗口会根据服务器的处理速度收缩或扩张。
  • 参数net.core.wmem_max的设置,需要平衡物理内存的总大小、Nginx并发处理的最大连接数量确定的。(最大连接数由nginx.conf中的worker_processes和worker_connections参数决定)
  • 提高并发量服务器必然会出现内存不足(out of memory)的问题,此时不建议使用降低滑动窗口大小的方式来缓解内存问题,因为滑动窗口过小会导致大量数据的传输速度变慢。
  • rmem_default、wmem_default、rmem_max、wmem_max这四个参数的设置需要根据业务特性以及实际的硬件成本来综合考虑。

相关推荐

  1. 并发linux优化

    2024-04-02 05:28:09       47 阅读
  2. nginx 概念、并发处理及详细参数配置

    2024-04-02 05:28:09       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 05:28:09       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 05:28:09       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 05:28:09       87 阅读
  4. Python语言-面向对象

    2024-04-02 05:28:09       96 阅读

热门阅读

  1. 为您的行业选择最合适的服务器

    2024-04-02 05:28:09       40 阅读
  2. 竞赛常考的知识点大总结(七)图论

    2024-04-02 05:28:09       36 阅读
  3. .NET Framework 3.5框架如何使用RSA加密

    2024-04-02 05:28:09       39 阅读
  4. 洛伦兹系统ODE方程-MATLAB

    2024-04-02 05:28:09       30 阅读
  5. 软件测试-第四章课后作业

    2024-04-02 05:28:09       41 阅读
  6. 在保存原容器的情况下重新安装docker

    2024-04-02 05:28:09       40 阅读
  7. http协议中的“队头阻塞”问题

    2024-04-02 05:28:09       37 阅读
  8. 在CentOS 7上如何添加交换空间

    2024-04-02 05:28:09       39 阅读
  9. 告别PCA,开始玩高阶的PLS-DA

    2024-04-02 05:28:09       38 阅读
  10. 如何在Bash中连接字符串变量

    2024-04-02 05:28:09       31 阅读
  11. 「PHP系列」数组详解

    2024-04-02 05:28:09       39 阅读
  12. C#WPF自定义控件-继承Button的圆角按钮

    2024-04-02 05:28:09       31 阅读