系统配置优化说明

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍Alibaba Cloud Linux 3系统的优化配置和常见系统配置参数。您可以根据实际需求调整内核参数,以满足特定的业务场景。

操作系统限制

Alibaba Cloud Linux 3。

重要

在修改内核参数前,您需要注意:

  • 从实际需求出发,尽量有相关数据的支撑,不建议您随意调整内核参数。

  • 了解参数的具体作用,需注意不同类型或版本环境中,内核参数可能有所不同。

Alibaba Cloud Linux 3优化配置

Alibaba Cloud Linux 3操作系统对以下系统配置参数进行了优化。

提升性能

配置项

说明

net.ipv4.tcp_timeout_init

1000

TCP超时重传初始值。

最小值为2 HZ。

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

net.ipv4.tcp_synack_timeout_init

1000

SYN-ACK初始超时时间。

最小值为2 HZ。

第一次重传后,超时时间将加倍。

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

net.ipv4.tcp_synack_timeout_max

120000

SYN-ACK超时时间最大值。

最小值为2 HZ。

tcp_synack_timeout_init在重传SYN-ACK报文时RTO会成倍增加,但最大不能超过tcp_synack_timeout_max

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

net.ipv4.tcp_ato_min

40

ACK超时时间。

通过修改sysctl参数灵活地控制ACK超时时间。

取值范围:4 ms~200 ms。

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

net.ipv4.tcp_init_cwnd

10

TCP初始拥塞窗口大小。

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

net.ipv4.tcp_synack_retries

2

服务端响应SYN-ACK后未收到最终的ACK时需要重试的次数。

网络质量良好情况下,进行3次重试大约需要7秒。

net.ipv4.tcp_slow_start_after_idle

0

TCP接收数据空闲之后是否需要重新慢启动。取值范围:

  • 1:是。

  • 0:否。

/sys/kernel/mm/transparent_hugepage/hugetext_enabled

0

控制代码大页特性。取值范围:

  • 0:关闭代码大页。

  • 1:仅打开二进制和动态库大页。

  • 2:仅打开可执行匿名大页。

  • 3:同时打开以上两类大页。

开启代码大页可以降低程序的iTLB miss,提升数据库、大型应用程序等大代码段业务场景性能。具体操作,请参见代码大页

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

提高资源利用率

配置项

说明

net.ipv4.tcp_tw_timeout

60

socket在TIME_WAIT状态的超时时间。

取值范围:1秒~600秒。

具体操作,请参见修改TCP TIME-WAIT超时时间

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

net.ipv4.tcp_max_tw_buckets

5000

允许最多timewait状态的TCP连接数。

TIME_WAIT状态的连接会占用客户端与同一服务端建立连接的端口范围(客户端与同一服务端ip:port连接的最大端口数由net.ipv4.ip_local_port_range确定)。当大量TIME_WAIT状态的连接占用客户端端口时,会导致客户端在调用connect()时分配端口失败,最终导致客户端建立连接失败。更多信息,请参见为什么Linux系统的ECS实例中出现大量“TCP: time wait bucket table overflow”错误?

网络安全

配置项

说明

net.ipv4.conf.all.rp_filter

0

当前所有网卡的反向路由校验控制。取值范围:

  • 0:关闭反向路由校验。

  • 1:开启严格的反向路由校验。开启后,网卡会对每一个传入的数据包进行校验,如果数据包的反向路由与接收接口不匹配,校验失败后将丢弃数据包。

  • 2:不严谨的反向路由校验。网卡对每个进来的数据包校验源地址是否可达,如果反向路由可以通过任何接口到达,那么校验成功,否则校验失败后将丢弃数据包。

警告

当参数设置为1时,可能会发生丢包的情况。在存在多个网卡的情况下,如果待发送的报文通过的路由出口网卡与报文被接收时的入口网卡不同,则会导致报文被丢弃。因此,在多网卡系统中,不建议启用该设置。

net.ipv4.conf.default.rp_filter

0

新建网卡的反向路由校验控制。取值范围:

  • 0:关闭反向路由校验。

  • 1:开启严格的反向路由校验。开启后,网卡会对每一个传入的数据包进行校验,如果数据包的反向路由与接收接口不匹配,校验失败后将丢弃数据包。

  • 2:不严谨的反向路由校验。网卡对每个进来的数据包校验源地址是否可达,如果反向路由可以通过任何接口到达,那么校验成功,否则校验失败后将丢弃数据包。

警告

当参数设置为1时,可能会发生丢包的情况。在存在多个网卡的情况下,如果待发送的报文通过的路由出口网卡与报文被接收时的入口网卡不同,则会导致报文被丢弃。因此,在多网卡系统中,不建议启用该设置。

net.ipv4.conf.default.arp_announce

2

当前所有网卡影响ARP请求中源IP地址的选择。取值范围:

  • 0:默认行为。在默认情况下,系统将使用任意可用的源IP地址作为接口的首选地址。在这种模式下,当发送ARP请求时,内核不会严格限制ARP请求中使用的源IP地址,而是可能选择任何可用的本地地址作为源IP。

  • 1:严格模式。尽量避免使用不相关的源IP地址。内核在选择源IP地址时,会尝试使用与目标地址在同一子网内的地址。如果没有这样的地址,它还是会使用接口的主地址。

  • 2:最严格模式。必须使用发送接口上的IP地址。内核首先按照arp_announce=1的方式查找,若没有查找到,则强制要求ARP请求使用的源IP地址必须是发送ARP请求的接口的IP地址。如果在这个接口上没有合适的IP地址,则不会发送ARP请求。

net.ipv4.conf.all.arp_announce

2

新增网卡影响ARP请求中源IP地址的选择。取值范围:

  • 0:默认行为。在默认情况下,系统将使用任意可用的源IP地址作为接口的首选地址。在这种模式下,当发送ARP请求时,内核不会严格限制ARP请求中使用的源IP地址,而是可能选择任何可用的本地地址作为源IP。

  • 1:严格模式。尽量避免使用不相关的源IP地址。内核在选择源IP地址时,会尝试使用与目标地址在同一子网内的地址。如果没有这样的地址,它还是会使用接口的主地址。

  • 2:最严格模式。必须使用发送接口上的IP地址。内核首先按照arp_announce=1的方式查找,若没有查找到,则强制要求ARP请求使用的源IP地址必须是发送ARP请求的接口的IP地址。如果在这个接口上没有合适的IP地址,则不会发送ARP请求。

net.ipv4.tcp_syncookies

1

SYN Flood防护控制。取值范围:

  • 1:开启TCP内核防护,防止SYN Flood攻击。

  • 2:无条件开启TCP内核防护,防止SYN Flood攻击,用于测试场景。

  • 0:关闭TCP内核SYN Flood防护功能。

Alibaba Cloud Linux 3其他常见系统配置说明

提升性能

配置项

默认值

说明

net.ipv4.ip_local_port_range

32768 60999

端口号范围。

在客户端建立连接时,TCP/UDP协议允许根据实际需求修改本地端口号。当该范围内的端口号大部分被占用完时,内核线性搜索新端口可能导致CPU占用率升高。

net.ipv4.tcp_rmem

4096 131072 6291456

单个tcp socketrecvbuf的大小。单位:字节。

初始值与实例规格无关。第一个是最小值,第二个是默认大小,第三个是最大值。推荐将其调大,但需考虑实例的内存使用情况。

net.ipv4.tcp_wmem

4096 16384 4194304

单个tcp socketsendbuf的大小。单位:字节。

初始值与实例规格无关。第一个是最小值,第二个是默认大小,第三个是最大值。推荐将其调大,但需考虑实例的内存使用情况。

net.core.netdev_max_backlog

1000

percpu用来保存skb队列的长度。

主要用于RPS或者同一主机内部通信的缓存队列,比如loopbackveth

net.core.somaxconn

4096

单个socket最大的Listen backlog队列长度。

nginx这类处理大量短连接的应用,建议将其值调大。

net.core.rmem_max

212992

单个socket上允许的最大recvbuf的大小。

主要用于处理大量连接在单个udp socket的场景。

在TCP中,这个选项仅在用户调用setsockopt()配置SO_RCVBUF时使用,用户设置的recvbuf不能超过该值。若用户没有调用setsockopt(),则tcp recvbuf只受net.ipv4.tcp_rmem的限制。

net.core.wmem_max

212992

单个socket上允许的最大sendbuf的大小。

主要用于处理大量连接在单个udp socket的场景。

在TCP中,这个选项仅在用户调用setsockopt()配置SO_SNDBUF时使用,用户设置的sendbuf不能超过该值。若用户没有调用setsockopt(),则tcp sendbuf只受net.ipv4.tcp_rmem的限制。

/sys/block/<device>/queue/nomerges

0

设备是否关闭merge特性。取值范围:

  • 0:打开任意类型的merge

  • 1:关闭复杂的merge检查,打开简单的one-shot merge

  • 2:关闭所有类型的merge

IO的读写地址连续的情况下,内核IO协议栈会将多个读写地址连续的IO合并为一个大IO(即merge特性),再统一发送给硬件处理,极大地提升了硬件的IO性能。

IO的读写地址随机的情况下,IO之间发生合并的几率较小。然而,检查是否可以执行合并操作会消耗一定的CPU周期,从而影响性能。用户可以通过关闭设备的merge特性来提升性能。

/sys/block/<device>/queue/read_ahead_kb

4096

设备文件系统的read-ahead size

内核默认值为128 KB,tuned服务将值调整为4096 KB。

如果用户下发的IO负载大部分是随机IO,建议调低该值(比如128 KB)以提升业务性能。

/sys/block/<device>/queue/rq_affinity

1

IO完成中断要发送给哪个CPU进行处理。取值范围:

  • 0:IO完成中断会在当前触发中断的CPU上进行处理。

  • 1:IO完成中断发送给提交IO request的CPU所在的groupgroup一般指的是同一个socket,同一个socket上的CPU共享cache,在该设置下IO完成中断实际是发送给该group的第一个CPU。这样设置的优点是cache友好,处理更快;缺点是IO频繁时,group的第一个CPU压力会很大。

  • 2:IO完成中断会发送给提交IO request的CPU。这样设置的优点是CPU的负载比较均衡;缺点是效率较上述设置低。

建议根据系统的IO压力情况调整发送方式。

/sys/block/<device>/queue/scheduler

mq-deadline(单个队列)或

none(多个队列)

IO设备调度器。

Alibaba Cloud Linux 3支持的调度器mq-deadlinekyberbfqnone

针对blk-mq设备,如果只有一个队列,默认使用mq-deadline;如果有多个队列,默认使用none

通常情况下,保持默认值。如果有特殊要求,比如对读时延性,可以切换到kyber,并配置相应的时延目标。

/sys/kernel/mm/pagecache_limit/enabled

0

是否启用Linux内核中的页面缓存Page Cache大小限制功能。取值范围:

  • 0:禁用全部Page Cache限制功能。

  • 1:启用Page Cache限制功能。

更多信息,请参见Page Cache限制功能

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。

/sys/fs/cgroup/memory/memory.pagecache_limit.enable

0

memcg是否启用Page Cache限制功开关。取值范围:

  • 0:当前memcg禁用Page Cache限制功能。

  • 1:当前memcg启用Page Cache限制功能。

更多信息,请参见Page Cache限制功能

/sys/fs/cgroup/memory/memory.pagecache_limit.size

0

限制当前memcgPage Cache使用量。单位:字节。

取值范围:0~当前memcg的memory.limit_in_bytes值(memory.limit_in_bytes值由您自定义设置)。

  • 0:即使全局开关和memcg开关都打开,当前memcg也会禁用Page Cache限制功能。

  • 非0:当前memcg treePage Cache的使用量的上限。

更多信息,请参见Page Cache限制功能

网络安全

配置项

默认值

说明

net.ipv4.conf.all.arp_ignore

0

当前所有网卡的控制系统在收到外部的ARP请求时,决定是否返回ARP响应。取值范围:

  • 0:不论目标IP地址是否位于接收网卡上,都应该对本机IP地址的ARP请求做出响应,包括环回网卡上的地址。

  • 1:只对目标IP地址为本地接收网卡上的地址的ARP请求作出响应。

  • 2:只对目的IP地址为接收网卡上的本地地址的ARP请求进行响应,且ARP请求的源IP必须与接收网卡处于同一网段。

例如,当eth0接收到一个目的地址为eth1的ARP请求时,若为0,将回复ARP Reply;若为1或2,由于接收到的ARP请求中的目的IP地址与网卡不一致,则不会回复。

net.ipv4.conf.default.arp_ignore

0

新建网卡的控制系统在收到外部的ARP请求时,决定是否返回ARP响应。取值范围:

  • 0:不论目标IP地址是否位于接收网卡上,都应该对本机IP地址的ARP请求做出响应,包括环回网卡上的地址。

  • 1:只对目标IP地址为本地接收网卡上的地址的ARP请求作出响应。

  • 2:只对目的IP地址为接收网卡上的本地地址的ARP请求进行响应,且ARP请求的源IP必须与接收网卡处于同一网段。

例如,当eth0接收到一个目的地址为eth1的ARP请求时,若为0,将回复ARP Reply;若为1或2,由于接收到的ARP请求中的目的IP地址与网卡不一致,则不会回复。

net.ipv4.ip_forward

0

控制IPv4数据包的转发功能。取值范围:

  • 1:开启IP转发功能。

  • 0:禁止IP转发。

提高资源利用

配置项

默认值

说明

net.ipv4.tcp_fin_timeout

60

主动断开socket连接的一方,TCP连接保持在FIN-WAIT-2状态的时间。单位:秒。

用于等待对端断开连接或接收对方数据。修改该值以加快系统关闭处于FIN-WAIT-2状态的TCP连接。

在实际业务场景中,可以使用netstat -ant | grep FIN_WAIT2 | wc -l命令来查看处于FIN-WAIT-2状态的连接数量。如果连接数量较大,可以考虑降低该数值,以加快机器释放连接的速度;反之,则建议保持默认的60秒。更多信息,请参见为什么Linux系统的ECS实例中,出现大量的处于FIN_WAIT2状态的TCP连接?

net.ipv4.tcp_syn_retries

6

客户端建连时,SYN重传的次数。

重试3次约7秒。

net.ipv4.tcp_tw_reuse

2

允许使用处于TIME-WAIT状态的socket(即TIME-WAIT状态的端口)进行新的TCP连接。取值范围:

  • 0:关。

  • 1:全局开启。

  • 2:只对loopback开启。

net.ipv4.tcp_keepalive_time

7200

keepalive功能开启的情况下,发送keepalive消息的间隔时间。单位:秒。

用于确认TCP连接是否有效。

系统限制

配置项

默认值

说明

fs.aio-max-nr

65536

Linux aio并发请求的最大值。

该值的设定取决于系统对Linux aio的使用程度,例如数据库和搜索场景,需要一个较大的aio-max-nr

aio-max-nraio-nr配合,aio-nr是通过累加系统调用io_setup(unsigned nr_events, aio_context_t *ctx_idp)的第一个参数得到的。当aio-nr + nr_events > aio-max-nr时,io_setup()将返回-EAGAIN错误。因此,通过观察aio-nr的值合理设置业务环境的aio-max-nr

fs.file-max

根据系统初始化预留内存大小设置。

系统允许的文件句柄的最大数量。

系统初始化时最多10%的预留内存可以用于文件句柄,但是该参数的默认值最小不应小于NR_FILE即8192。

建议无特殊需求,使用默认值即可。

fs.nr_open

1048576

一个进程允许的最大打开文件句柄数量。

实际应用的限制取决于resource limit和RLIMIT_NOFILE。通常我们通过ulimit -n来设置nr_open的值,但无法设置超过fs.nr_open的数值。

监控

配置项

默认值

说明

net.netfilter.nf_conntrack_max

262144

nf_conntrack模块中哈希表支持存放的最大连接数。

默认等于4 * net.netfilter.nf_conntrack_buckets

具体操作,请参见ECS实例中的应用偶尔出现丢包现象并且内核日志(dmesg)存在kernel: nf_conntrack: table full, dropping packet的报错信息

net.netfilter.nf_conntrack_tcp_timeout_time_wait

120

nf_conntrack模块中保存TIME_WAIT状态的TCP连接时间。单位:秒。

net.netfilter.nf_conntrack_tcp_timeout_established

432000

已经建立的连接如果没有活动,被iptables清除的超时时间。单位:秒。

fs.inotify.max_queued_events

16384

inotify机制的最大待处理事件队列长度。

inotify是内核提供的一种基础设施,既可以监控文件,也可以监控目录。当目录被监控时,inotify可以监控目录自身和目录中文件的文件系统事件。

建议无特殊需求,使用默认值即可。

fs.inotify.max_user_instances

128

用户能创建的最大inotify实例数目。

该参数的主要目的是防止用户因创建了过多的inotify实例而导致系统资源(如内存)被过度消耗。

建议无特殊需求,使用默认值即可。

fs.inotify.max_user_watches

8192

用户能添加的最大watch数量。

watchinotify中的一种术语,用来描述用户需要监控的一个对象。一个watch通常包含两个组件,一个是路径名,指向需要监控的文件或者目录;另一个是对路径名指向的文件或者目录所要监控的事件组合,比如文件访问事件,用一个掩码描述各种事件组合。

/sys/block/<device>/queue/hang_threshold

5000

检测系统运行过程中长时间没有返回的IO。单位:ms。

可以根据具体业务场景进行修改。具体操作,请参考检测文件系统和块层的IO hang

重要

Alibaba Cloud Linux 3系统自研特性,不承诺长期维护。