侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

Linux系统内核优化

2023-11-21 星期二 / 0 评论 / 0 点赞 / 61 阅读 / 12815 字

1. 内核参数信息 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rmem = 8192 131072 167

1. 内核参数信息

net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_rmem = 8192     131072    16777216

net.ipv4.tcp_wmem = 8192    131072  16777216

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.netdev_max_backlog = 102400

net.core.somaxconn = 65535

net.ipv4.tcp_max_orphans = 102400

net.ipv4.tcp_orphan_retries  = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_max_syn_backlog = 102400

net.ipv4.tcp_max_tw_buckets = 8000

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 786432  1310720 1835008

net.ipv4.tcp_fin_timeout = 10        || MSL(maximum segment life)

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_keepalive_intvl = 15

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.ip_local_port_range = 1024    65000

net.netfilter.nf_conntrack_max = 379392

net.nf_conntrack_max = 379392

net.netfilter.nf_conntrack_tcp_timeout_close_wait  =   60  

net.netfilter.nf_conntrack_tcp_timeout_fin_wait  =   120  

net.netfilter.nf_conntrack_tcp_timeout_time_wait  =   120

net.netfilter.nf_conntrack_tcp_timeout_established = 180       

2. 内核参数详解

(1) net.ipv4.tcp_sack = 1

[注释]使用 Selective ACK﹐它可以用来查找特定的遗失的数据报--- 因此有助于快速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段)。(对于广域网通信来说这个选项应该启用,但是这会增加对 CPU 的占用。)

(2) net.ipv4.tcp_window_scaling = 1

[注释]该文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力(RFC 1323)。(对普通地百M网络而言,关闭会降低开销,所以如果不是高速网络,可以考虑设置为0)Linux 内核还包括了自动对这些 socket 缓冲区进行优化的能力(请参阅下面  的 tcp_rmem 和 tcp_wmem),不过这些选项会对整个栈造成影响。如果只需要为一个连接或一类连接调节窗口的大小,那么这种机制也许不能满足需要了。

(3) net.ipv4.tcp_rmem = 8192     131072    16777216  

[注释] 为自动调优定义socket使用的内存。

第一个值是为socket接收缓冲区分配的最少字节数;

第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;

第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。

(4) net.ipv4.tcp_wmem = 8192    131072  16777216

[注释] 为自动调优定义socket使用的内存。

第一个值是为socket发送缓冲区分配的最少字节数;

第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;

第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。

(5) net.core.wmem_default = 8388608

[注释] 该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。

(6) net.core.rmem_default = 8388608

[注释]  该文件指定了接收套接字缓冲区大小的默认值(以字节为单位)。

(7) net.core.rmem_max = 16777216

[注释] 最大的TCP数据发送窗口(字节)。

(8) net.core.wmem_max = 16777216

[注释] 最大的TCP数据接收窗口(字节)。

(9) net.core.netdev_max_backlog = 102400

[注释] 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

(10) net.core.somaxconn = 65535

[注释]listen方法传入的backlog参数

用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。

web应用中listen函数的backlog默认会给内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。对繁忙的服务器,增加该值有助于网络性能。int类型的backlog参数,listen方法的backlog意义为,已经完成三次握手、已经成功建立连接的套接字将要进入队列的长度。

什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。

(11) net.ipv4.tcp_max_orphans = 65535

[注释 最大孤儿套接字(orphan sockets)数,单位是个

net.ipv4.tcp_max_orphans = 65536

表示最多65536个

注意:当cat /proc/net/sockstat看到的orphans数量达到net.ipv4.tcp_max_orphans的约一半时(32768),就会报:Out of socket memory此时占用内存 32K*64KB=2048MB=2GB

(每个孤儿socket可占用多达64KB内存),实际可能小一些

(12) net.ipv4.tcp_orphan_retries

孤儿socket废弃前重试的次数,重负载web服务器建议调小net.ipv4.tcp_orphan_retries = 1

设置较小的数值,可以有效降低orphans的数量(net.ipv4.tcp_orphan_retries = 0并不是想像中的不重试)

(13) net.ipv4.tcp_syncookies = 1

[注释]一般服务器都会设置net.ipv4.tcp_syncookies=1来防止SYN Flood攻击。假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟)。这些处在SYNC_RECV的TCP连接称为半连接,并存储在内核的半连接队列中,在内核收到对端发送的ack包时会查找半连接队列,并将符合的requst_sock信息存储到完成三次握手的连接的队列中,然后删除此半连接。大量SYNC_RECV的TCP连接会导致半连接队列溢出,这样后续的连接建立请求会被内核直接丢弃,这就是SYN Flood攻击。能够有效防范SYN Flood攻击的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明。SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

观测服务上SYN_RECV连接个数为:7314,对于一个高并发连接的通讯服务器,这个数字比较正常

(14) net.ipv4.tcp_timestamps = 0

[注释] TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项。

(15) net.ipv4.tcp_synack_retries = 2

[注释] TCP三次握手的syn/ack阶段,重试次数,缺省5,设为2-3

(16) net.ipv4.tcp_syn_retries = 1

[注释] 表示在内核放弃建立连接之前发送SYN包的数量。

如果发送端要求关闭套接字,net.ipv4.tcp_fin_timeout选项决定了套接字保持在FIN-WAIT-2状态的时间。接收端可以出错并永远不关闭连接,甚至意外宕机。

(17) net.ipv4.tcp_fin_timeout = 10

[注释] 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。

默认值是60秒。需要注意的是,即使一个负载很小的Web服务器,也会出现因为大量的死套接字而产生内存溢出的风险。FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能消耗1.5KB的内存,但是其生存期长些。

(18) net.ipv4.tcp_max_syn_backlog = 102400

[注释] 对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字。

(19) net.ipv4.tcp_max_tw_buckets = 8000

[注释] 系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)

(20) net.ipv4.tcp_tw_recycle = 1

[注释] 表示是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接 。

(21) net.ipv4.tcp_mem = 786432  1310720 1835008

[注释] 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。

第一个值是内存使用的下限;

第二个值是内存压力模式开始对缓冲区使用应用压力的上限;

第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。

(22) net.ipv4.tcp_keepalive_time = 30

[注释] TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。

表示TCP链接在多少秒之后没有数据报文传输启动探测报文;

(23) net.ipv4.tcp_keepalive_intvl = 15

[注释] 探测消息未获得响应时,重发该消息的间隔时间(秒)。

表示前一个探测报文和后一个探测报文之间的时间间隔

(24) net.ipv4.tcp_keepalive_probes = 3

[注释] 在认定TCP连接失效之前,最多发送多少个keepalive探测消息。表示探测的次数

       

(25) net.ipv4.ip_local_port_range = 1024    65000

[注释] 表示用于向外连接的端口范围,默认比较小,这个范围同样会间接用于NAT表规模。

(26) net.netfilter.nf_conntrack_max = 379392

(27) net.nf_conntrack_max = 379392

(28) net.netfilter.nf_conntrack_tcp_timeout_close_wait  =   60  

(29) net.netfilter.nf_conntrack_tcp_timeout_fin_wait  =   120  

(30) net.netfilter.nf_conntrack_tcp_timeout_time_wait  =   120

(31) net.netfilter.nf_conntrack_tcp_timeout_established = 180

[注释 状态跟踪表的最大行数的设定,理论最大值

CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)

以8G的64位操作系统为例:

CONNTRACK_MAX = 8*1024*1024*1024/16384/2 = 262144

其哈希表大小通常为总表的1/8,最大为1/2。

CONNTRACK_BUCKETS = CONNTRACK_MAX / 8

同样8G的64位操作系统,哈希最佳范围是32693 ~ 131072 。

运行状态中通过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,通过文件 /sys/module/nf_conntrack/parameters/hashsize 进行设置。

广告 广告

评论区