了解更多银河麒麟操作系统全新产品,请点击访问
麒麟软件产品专区:https://product.kylinos.cn
开发者专区:https://developer.kylinos.cn
文档中心:https://documentkylinos.cn
服务器环境以及配置
物理机 | |
外网/私有网络/无网络 | 私有网络 |
处理器: | HUAWEI Kunpeng 920 5220 |
内存: | 512 GiB |
整机类型/架构: | Huawei S920S00 |
BIOS版本: | Huawei Corp. 1.79 08/21/2021 |
具体操作系统版本 | 银河麒麟高级服务器操作系统 Kylin Linux Advanced Server V10 (Tercel) V10 (Tercel) |
内核版本 | 4.19.90-23.8.v2101.ky10.aarch64 |
现象描述
重点系统投产,TCP的连接数猛增,现在已经到15000个网络连接,需要评估下操作系统的瓶颈,如何优化可保证业务不会出行例如somaxconn,backlog等问题。
环境分析
nic0和nic1配置mode 4组成bond0。
nic网卡的驱动为mlx5_core,网卡的ring buffer为1024。
从sosreport可见,当时的tcp连接,查看./proc/net/sockstat文件提供了关于Linux系统中套接字使用情况的统计信息。
sockets: used 14462:表示系统当前正在使用的套接字总数为14462个。
TCP: inuse 9030 orphan 0 tw 106 alloc 14155 mem 363:
inuse 9030:表示当前有9030个TCP套接字处于使用状态。
orphan 0:孤立的TCP套接字数量为0。孤立套接字是那些没有应用程序引用但仍在TCP协议栈中的套接字。
tw 106:表示处于TIME_WAIT状态的TCP套接字数量为106。TIME_WAIT是TCP连接正常关闭后的一个临时状态。
alloc 14155:表示已分配的TCP套接字总数为14155个,包括所有状态的套接字。
mem 363:表示TCP套接字使用的内存量(以页为单位),这里为363页。
相关建议
1、增加最大文件描述符数:每个TCP连接都需要一个文件描述符。可以通过增加系统允许的最大文件描述符数来确保有足够的资源处理大量的连接。
修改 /etc/security/limits.conf 文件,增加 nofile 的限制,例如:
* soft nofile 131072 * hard nofile 131072 |
2、内核参数优化建议
内核参数 | 解释 | 建议 |
fs.aio-max-nr | 这个参数定义了系统能够分配的最大异步 I/O 操作数。这是一个系统范围的限制,意味着所有进程的异步 I/O 操作总数不能超过这个值。如果异步 I/O 请求(aio)的数量达到这个上限,进一步的 aio 请求可能会失败,或者变为同步操作。 /proc/sys/fs/aio-max-nr 的默认值可能因内核版本和发行版而异,但通常是 65536。这个默认值对于大多数系统来说是足够的,但对于高负荷的服务器或者大量使用异步 I/O 的应用程序,可能需要增加这个值。 | 如果应用程序大量依赖异步 I/O,性能瓶颈或者 aio-nr 接近 aio-max-nr 的情况,可以尝试增加 aio-max-nr 的值。一个常见的做法是将其设置为 1048576(这是默认值的大约16倍)或者更高,具体取决于系统和应用需求。 如果无法确认,建议设置为 1048576 |
net.core.somaxconn | net.core.somaxconn 是一个 Linux 内核参数,它控制了 socket 监听队列的最大长度。这个参数对于网络服务器尤其重要,因为它影响了服务器能够接受的等待接受的TCP连接请求的数量。 当一个应用程序调用 listen() 函数时,它需要指定一个参数来决定能够排队等待接受的尚未建立连接的客户端数量。net.core.somaxconn 定义了这个队列的最大长度限制。如果应用程序尝试设置比 net.core.somaxconn 更大的值,实际的队列长度将被限制在 net.core.somaxconn 的值。 | 对于需要处理大量并发连接的服务器,增加 net.core.somaxconn 的值可以提高服务器的接受新连接的能力。例如,对于高并发的 Web 服务器,可能需要将其设置到更高的值,如 1024 或更高。 增加监听队列长度可能会增加系统对资源的消耗(尤其是内存),因此在进行调整时需要根据服务器的实际负载和资源情况做出合理的配置。 某些应用程序可能有自己的设置或限制,也需要检查并确保应用程序能够充分利用更大的监听队列。 |
net.ipv4.tcp_max_syn_backlog | 指定了系统用于保存半连接状态(SYN_RECEIVED)的SYN请求队列的最大长度。这个队列存储的是已经接收到SYN包,但还未完成三次握手的连接请求。 当系统开启SYN Cookies功能时(通过/proc/sys/net/ipv4/tcp_syncookies参数控制),系统能够在SYN队列满时仍然接受新的连接请求,因为SYN Cookies机制不依赖于维护状态信息。它通过一种特殊的方式计算序列号来避免使用SYN队列。因此,当SYN Cookies开启时,tcp_max_syn_backlog的设置对系统的行为影响较小。 | 可以保持原来的2048或者调大为4096。 |
net.ipv4.ip_local_port_range | 此内核参数用于定义本地端口范围。该参数指定了在本地发起的网络连接所使用的可用 端口范围。 TCP/IP 协议使用端口来标识不同的网络应用程序或服务。在客户端发起与服务器的连接时,客户端会随机选择一个未被占用的本地端口来发送数据。这个本地端口是临时的,仅在连接的生命周期内使用,并在连接关闭后释放。 net.ipv4.ip_local_port_range 参数定义了可供系统使用的本地端口范围的起始端口和结束端口。它的默认值通常是从 32768 到 60999。 | 建议值为 30000 65500。在如在高并发的网络应用中,如果可用的本地端口数目较少,可能会导致端口耗尽和端口竞争, 从而影响应用程序的性能。通过扩大可用的本地端口范围,减少端口耗尽的可能性,并提高应用程序的并发性能。 |
net.ipv4.tcp_tw_reuse | 此内核参数用于控制 TIME-WAIT 状态的 TCP 连接是否可以被复用。在 TCP 连接正常关闭后,套接字会进入 TIME_WAIT 状态,通常持续 2 倍的 MSL(Maximum Segment Lifetime,最大报文段生存时间)。这个状态确保了在网络上迷失的最后数据包能被正确处理,防止旧连接的数据干扰新连接。 设置 net.ipv4.tcp_tw_reuse 参数为 1(启用)可以使系统允许在 TIME-WAIT 状态的连接上进行地址重用。这意味着,当一个新的连接尝试使用一个已经处于 TIME-WAIT 状态的地址和端口组合时,内核可以复用该地址和端口,从而允许新连接立即建立,而不必等待 TIME-WAIT 状态的连接完全释放。 设置 net.ipv4.tcp_tw_reuse 参数为 0(禁用,通常默认值)则表示不允许地址重用,新连接必须等待 TIME-WAIT 状态的连接彻底释放之后才能使用相同的地址和端口组合。 | 建议值为 1。启用 net.ipv4.tcp_tw_reuse 可以在例如面对大量短暂连接的情况时 提高系统性能。 |
net.ipv4.tcp_max_tw_buckets | 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值,TIME_WAIT套接字将立刻被清除并打印警告信息。对于Apache、Nginx等服务器来说可以将其调低一点,如改为5000~30000,不同业务的服务器也可以给大一点,比如LVS、Squid。 此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。 如果系统有大量的 TIME_WAIT 状态连接,并且你观察到日志中出现警告说 "time wait bucket table overflow",这表明当前的 tcp_max_tw_buckets 值过小。这时可以考虑增加该值。 | 建议设置为32768 或更高。 |
修改/etc/sysctl.conf文件,而后执行sysctl -p
fs.aio-max-nr=1048576 net.core.somaxconn=1024 net.ipv4.ip_local_port_range=30000 65500 # net.ipv4.tcp_tw_reuse默认为1 # net.ipv4.tcp_max_tw_buckets=32768,当前环境已经是262144,可能用户已调整过 |
3、建议升级最新的SP1内核,以消除已知问题,使环境更加稳定。
4、网卡调整
ethtool -G nic0 tx 4096 rx 4096 |