如您需要自定义修改内核参数,请在修改之前,请务必确保您已完全理解该内核参数的具体含义和功能。请谨慎操作,错误的参数设置可能导致系统出现意外的错误,影响正常运行。
请特别注意以下两点:
- 确保了解内核参数的含义:需清楚内核参数的作用和影响,这将有助于您正确设置相应的值。
- 填写有效的内核参数值:内核参数值必须有效且符合预期要求,否则修改将不会生效。
您可通过以下方式对Nginx Ingress进行内核参数调优,并可使用initContainers方式设置内核参数。
CCE在2.2.75、2.6.26、3.0.1及以上版本的NGINX Ingress控制器插件中默认为您开启内核参数调优。
- 调高连接队列的大小
在高并发环境下,如果连接队列过小,则可能导致队列溢出,使部分连接无法建立。进程监听socket的连接队列大小受限于内核参数 net.core.somaxconn,调整somaxconn内核参数的值即可增加Nginx Ingress连接队列。
进程调用listen系统监听端口时会传入一个backlog参数,该参数决定socket连接队列大小,且其值不大于somaxconn取值。Go程序标准库在listen时,默认直接读取somaxconn作为队列大小,但Nginx监听socket时并不会读取somaxconn,而是读取nginx.conf。在nginx.conf中的listen端口配置项中,可以通过backlog参数配置连接队列大小,来决定Nginx listen端口的连接队列大小。配置示例如下:
server {
listen 80 backlog=1024;
...
如果未配置backlog值,则该值默认为511。在默认配置下,即便somaxconn的值配置超过511,但Nginx所监听端口的连接队列最大只有511,因此在高并发环境下可能导致连接队列溢出。
而Nginx Ingress Controller会自动读取somaxconn的值作为backlog参数,并写到生成的nginx.conf中,因此Nginx Ingress的连接队列大小只取决于somaxconn的大小,该取值在CCE中默认为4096。在高并发环境下,建议执行以下命令,将 somaxconn 设为65535:
sysctl -w net.core.somaxconn=65535
- 扩大源端口范围
高并发环境将导致 Nginx Ingress 使用大量源端口与 upstream 建立连接,源端口范围从 net.ipv4.ip_local_port_range 内核参数中定义的区间随机选取。在高并发环境下,端口范围小容易导致源端口耗尽,使得部分连接异常。CCE环境创建的 Pod 源端口范围默认为32768 - 60999,建议执行以下命令扩大源端口范围,调整为1024 - 65535:
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
- 调整TIME_WAIT
建议执行以下命令,为Nginx Ingress开启TIME_WAIT复用,即允许将TIME_WAIT连接重新用于新的TCP连接,并且减小FIN_WAIT2状态的参数net.ipv4.tcp_fin_timeout的时间,和减小TIME_WAIT状态的参数net.netfilter.nf_conntrack_tcp_timeout_time_wait的时间 ,让系统尽快释放它们所占用的资源。
sysctl -w net.ipv4.tcp_fin_timeout=15
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
为Nginx Ingress Controller的Pod添加initContainers并设置上述内核参数。可参考以下代码示例:
...
initContainers:
- name: setsysctl
image: ***(cce默认使用社区的nginx-ingress镜像)
securityContext:
runAsUser: 0
runAsGroup: 0
capabilities:
add:
- SYS_ADMIN
drop:
- ALL
command:
- sh
- -c
- |
if [ "$POD_IP" != "$HOST_IP" ]; then
mount -o remount rw /proc/sys
if [ $? -eq 0 ]; then
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sysctl -w net.ipv4.tcp_fin_timeout=15
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
else
echo "Failed to remount /proc/sys as read-write. Skipping sysctl commands."
fi
fi
env:
- name: POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: HOST_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP