配置内核参数

目的

配置内核参数,包括TCP/IP协议栈、透明大页等相关参数,提升性能。

方法

配置OS内核参数。OS内核参数说明见表1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sysctl -w net.core.netdev_budget=600
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.somaxconn=2048
sysctl -w net.core.optmem_max=40960
sysctl -w net.core.rmem_default=65535
sysctl -w net.core.wmem_default=65535
sysctl -w net.core.wmem_max=8388608
sysctl -w net.ipv4.tcp_rmem="16384 349520 16777216"
sysctl -w net.ipv4.tcp_wmem="16384 349520 16777216"
sysctl -w net.ipv4.tcp_mem="8388608 8388608 8388608"
sysctl -w vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
表1 OS内核参数说明

参数

说明

取值

net.core.netdev_budget

控制每次NAPI轮询循环从单个网卡队列中处理的数据包数量,确保不超过最大限制。

高速网络(尤其是10GbE+)或突发流量巨大的场景下,建议取值600。

net.core.rmem_max

设置单个Socket接收缓冲区的最大字节数

对于高带宽、高延迟(如广域网)或高吞吐量的连接,建议取值16777216/16MB

net.core.somaxconn

设置系统中每个监听端口(Listen Socket)的未完成连接队列(SYN Queue)和已建立连接队列(Accept Queue)的最大长度总和的上限。应用层调用listen()时设置的backlog参数不能超过此值。

对于高并发连接请求的服务,建议取值2048。

net.core.optmem_max

设置单个Socket可分配用于辅助数据(Ancillary Data)和控制信息(如sendmsg/recvmsg使用的控制消息)的最大内存字节数。

对于使用大量socket选项或复杂控制消息的应用,建议取值40960/40KB

net.core.rmem_default

设置新创建Socket的接收缓冲区的默认初始大小(字节)。

对于高带宽、高延迟(如广域网)或高吞吐量的连接,建议取值65535/64KB

net.core.wmem_default

设置新创建Socket的发送缓冲区的默认初始大小(字节)。

rmem_default,建议取值65535/64KB

net.core.wmem_max

设置单个Socket发送缓冲区的最大字节数。

对于需要持续高速发送大量数据的应用,建议取值8388608/8MB

net.ipv4.tcp_rmem

TCP Sockett的接收缓冲区设置三个值:min default max

对于高带宽高延迟网络(BDP大)的应用,建议取值"16384 349520 16777216"

net.ipv4.tcp_wmem

TCP Socket的发送缓冲区设置三个值:min default max(含义同 tcp_rmem)。

允许内核缓存更多应用层写入的待发送数据,建议取值"16384 349520 16777216"

net.ipv4.tcp_mem

控制TCP协议栈全局可使用的总内存页数(通常1页=4KB)。设置三个值:low pressure high

避免TCP在缓冲区增长到很大时(特别是在高并发或BDP大的连接上)被过早地限制,建议取值"8388608 8388608 8388608"

vm.overcommit_memory

控制内核的内存过量提交策略

在高性能服务器场景下,特别是使用大量内存的应用,防止内存分配失败,建议取值1。

transparent_hugepage

通过自动将多个常规内存页合并成大页,减少CPU的页表项数量,从而降低TLB缓存未命中率,提升内存访问效率。

在数据库和低延迟场景中,为了消除由透明大页引发的性能抖动问题,取值never。