我有一个最简单/常见的网络架构。
Web 服务器位于本地网络上的路由器后面。此路由器执行 iptables DNAT,因此可实现到 Web 服务器的端口转发。
因此,我能够通过互联网将文件从服务器 1 下载到我的计算机。
我的问题
怎样的内核调优才能确保路由器充分发挥其潜力(大约 2000 个连接和最高吞吐量)?我在 ORANGE 中遇到了问题
服务器 1 上的内核参数看起来正常吗?
您能解释一下为什么我的服务器 1 的 CPU 和 RAM 都没有超载,但速度却只有 3mbps 吗?那么除了 Linux 内核、CPU 和 RAM 之外,您还能发现其他问题吗?您能列出这些可能的问题以供探讨吗?1gbps 网络接口、端口等?2x1.5ghz ARM 路由速度慢吗?iptables 版本?
操作系统和资源
计算机 - Mac OS 8 x86 CPU 核心,16G/32G 可用 RAM
路由器 - Linux DD-WRT 2 ARM CPU 核心,270M/512M 可用 RAM
服务器 1 - Linux Ubuntu 18.04 4 x86 CPU 核心,240M/32G 可用 RAM(500M 交换至 SSD)
服务器 2 - Linux Raspbian 1 ARM CPU 核心,95M/512M 可用 RAM
最大传输单元
无处不在 1500
发送队列长度
无处不在的 1000
协议
UDP 速度很好
TCP 速度受到影响,任何端口
Iptables 版本
路由器 - 1.3.7
服务器 1 - 1.8.4
服务器 2 - 1.6.0
Linux 版本
路由器 - 4.9.207
服务器 1 - 5.4.0-67-通用
服务器 2 - 4.14.79+
理论链接速度
从我的电脑到路由器 - 30mbps / 3.75 MB/s
从路由器到 Web 服务器 1 - 1gbps
从路由器到 Web 服务器 2 - 1gbps
从网络服务器下载速度(文件托管在 RAM 中)
测试 1:服务器 2 -> 路由器 = 800mbps
测试 2:服务器 2 -> 计算机 = 30mbps
测试 3:服务器 1 -> 路由器 = 800mbps
测试 4:服务器 1 -> 计算机使用 15 个连接 = 15mbps
测试 5:服务器 1 -> 计算机 = 3mbps(问题!)
任何设备上的 CPU 使用率都在百分之几左右。所有设备上的 CPU 平均负载都是 0.0x,但服务器 1 的平均负载为 4.6。服务器 1 还处理大约 500-1000 个测试之外的其他连接,但速度约为 1mbps,因此它不会显著影响测试吞吐量(除非这些连接以某种方式间接使情况变得更糟)。
尽管负载更高,测试 3 的表现仍然很好。因此,仍然很难责怪服务器 1。
dmesg
任何设备均没有问题。
我的想法
问题仅在路由器上进行 DNAT 时出现,并且仅当服务器 1 具有大量其他连接时才会出现(但这些连接几乎处于空闲状态,因此不会对一切造成严重影响?)。
最后想法中要描述的最有趣的测试
当我进行多线程网页下载(测试 4)时,服务器 1 的性能要好得多。因此它能够达到更高的下载速度。但是为什么 1 个连接无法达到与多个连接相同的速度?
我探索的参数
您是否看到一些没有针对 Linux 路由器进行很好优化的东西?
net.core.wmem_max
- 最大 TCP 套接字发送缓冲区内存大小(以字节为单位)。增加 TCP 读/写缓冲区以启用扩展到更大的窗口大小。更大的窗口会增加在需要确认 (ACK) 之前要传输的数据量。这减少了总体延迟并提高了吞吐量。
此设置通常设置为非常保守的值 262,144 字节。建议将此值设置为内核允许的最大值。此处使用的值为 4,136,960 字节。但是,4.x 内核接受超过 16MB 的值。
路由器 - 180224
服务器 1 - 212992
服务器 2 - 163840
其他地方使用 - 83886080
net.core.wmem_default
路由器 - 180224
服务器 1 - 212992
服务器 2 - 163840
其他地方使用 - 83886080
net.ipv4.rmem_max
- 最大 TCP 套接字接收缓冲内存大小(以字节为单位)
路由器 - 180224
服务器 1 - 212992
服务器 2 - 163840
其他地方使用 - 335544320
net.core.rmem_default
路由器 - 180224
服务器 1 - 212992
服务器 2 - 163840
其他地方使用 - 335544320
net.ipv4.tcp_rmem
- 包含三个值,分别表示 TCP 套接字接收缓冲区的最小、默认和最大大小。建议使用最大值 16M 字节或更高(取决于内核级别),尤其是对于 10 千兆位适配器。
路由器 - 4096 87380 3776288
服务器 1 - 4096 131072 6291456
服务器 2 - 4096 87380 3515840
其他地方使用 - 4096 87380 4136960 (IBM)
net.ipv4.tcp_wmem
- 与 net.ipv4.tcp_rmem 类似,此参数由 3 个值组成:最小值、默认值和最大值。建议使用最大值 16M 字节或更高(取决于内核级别),尤其是对于 10 Gigabit 适配器。
路由器 - 4096 16384 3776288
服务器 1 - 4096 16384 4194304
服务器 2 - 4096 16384 3515840
其他地方使用 - 4096 87380 4136960 (IBM)
net.ipv4.tcp_tw_reuse
- 在高流量环境中,套接字的创建和销毁频率非常高。设置此参数后,允许将不再需要和即将销毁的套接字用于新连接。启用后,此参数可以绕过通常与套接字创建相关的分配和初始化开销,从而节省 CPU 周期、系统负载和时间。
默认值为 0(关闭)。建议值为 1(开启)。
路由器 - 0
服务器 1 - 2
服务器 2 – 0
其他地方使用 - 1
net.ipv4.tcp_tw_reuse
路由器 - 0
服务器 1 - 2
服务器 2 – 0
其他地方使用 - 1
net.ipv4.tcp_max_tw_buckets
- 指定允许在任意时间存在的处于“时间等待”状态的套接字的最大数量。如果超过最大值,处于“时间等待”状态的套接字将立即被销毁并显示警告。此设置用于阻止某些类型的拒绝服务攻击。降低此值之前应谨慎行事。更改后,应增加其值,尤其是当系统添加了更多内存或网络需求较高且环境较少受到外部威胁时。
路由器 - 2048
服务器 1 - 131072
服务器 2 - 2048
其他地方使用 - 65536、262144 (IBM)、45000 (IBM)
net.ipv4.tcp_tw_reuse
路由器 - 0
服务器 1 - 2
服务器 2 – 0
其他地方使用 - 1
net.ipv4.tcp_fin_timeout
路由器 - 60
服务器 1 - 60
服务器 2 – 60
其他地方使用 - 15
net.ipv4.tcp_max_syn_backlog
路由器 - 128
服务器 1 - 2048
服务器 2 – 128
其他地方使用 - 65536
net.ipv4.ip_local_port_range
- 用于传出 TCP 连接的端口范围(如果主机有大量传出连接,则更改它很有用)
路由器 - 32768 60999
服务器 1 - 32768 60999
服务器 2 - 32768 60999
其他地方使用 - 1024 65535
net.core.netdev_max_backlog
- 接收器环形缓冲区中用于接收到达数据包的插槽数(如果 CPU 无法处理数据包(例如由应用程序处理),则内核将数据包放入此队列)
路由器 - 120
服务器 1 - 1000
服务器 2 – 1000
其他地方使用 - 100000、1000 (IBM)、25000 (IBM)
net.ipv4.neigh.default.gc_thresh1
路由器 - 1
服务器 1 - 128
服务器 2 – 128
其他地方使用 - 128
net.ipv4.neigh.default.gc_thresh2
路由器 - 512
服务器 1 - 512
服务器 2 – 512
其他地方使用 - 512
net.ipv4.neigh.default.gc_thresh3
路由器 - 1024
服务器 1 - 1024
服务器 2 – 1024
其他地方使用 - 1024
net.ipv4.neigh.default.gc_thresh3
路由器 - 1024
服务器 1 - 1024
服务器 2 – 1024
其他地方使用 - 1024
net.core.somaxconn
- 套接字的最大侦听队列大小(对于负载均衡器、Web 服务器和应用程序服务器(如 unicorn、php-fpm)来说,这是一个有用但经常被忽视的设置。如果所有服务器进程/线程都处于繁忙状态,则传入的客户端连接将处于“积压”状态,等待服务)。积压已满会导致客户端连接立即被拒绝,从而导致客户端错误。
路由器 - 128
服务器 1 - 4096
服务器 2 – 128
net.ipv4.tcp_mem
- TCP 缓冲区内存使用阈值,用于自动调整,以内存页面为单位(1 页 = 4kb)
路由器 - 5529 7375 11058
服务器 1 - 381144 508193 762288
服务器 2 - 5148 6866 10296
net.nf_conntrack_max
- 最大连接数
路由器 - 32768
服务器 1 - 262144
服务器 2 - 没有信息
net.netfilter.nf_conntrack_max
- 最大连接数?如果这是正确的参数,那么 1560 是不够的
路由器 - 1560
服务器 1 - 262144
服务器 2 - 没有信息
/proc/sys/net/ipv4/tcp_congestion_control
- 数据网络中的网络拥塞 [...] 是指当网络节点承载的数据量超过其处理能力时,服务质量下降的情况。典型影响包括排队延迟、数据包丢失或新连接阻塞。网络使用拥塞控制和拥塞避免技术来避免拥塞崩溃。1
路由器 - westwood
服务器 1 - 立方体
服务器 2 - 立方体
net.ipv4.tcp_syn_retries
- 指定在主动 TCP 连接尝试中尝试重新传输初始 SYN 数据包的次数。当前设置为 20,这意味着在连接超时之前可以进行 20 次重新传输尝试。这可能需要几分钟,具体取决于重新传输尝试的长度。
路由器 - 6
服务器 1 - 6
服务器 2 - 6
net.ipv4.tcp_low_latency
- 默认值为 0(关闭)。对于延迟优先级较高的工作负载或环境,建议值为 1(开启)。
路由器 - 0
服务器 1 - 0
服务器 2 – 0
net.ipv4.tcp_limit_output_bytes
- 使用此参数,TCP 可控制每个 TCP 套接字的小队列限制。TCP 倾向于增加传输中的数据,直到收到丢失通知。借助 TCP 发送自动调整功能,大量数据可能会在本地机器上的设备上排队,这可能会对其他流的延迟产生不利影响。tcp_limit_output_bytes 限制设备上的字节数,以减少较大队列大小造成的延迟影响。
路由器 - 262144
服务器 1 - 1048576
服务器 2 - 262144
其他地方使用 - 262,144 (IBM)、131,072 (IBM)