kernel: TCP: out of memory -- consider tuning tcp_mem 问题处理记录

问题:

          1、通过/var/log/messages定位到原因,大概意思是TCP发送缓冲区满了

kernel: TCP: out of memory -- consider tuning tcp_mem 问题处理记录_第1张图片

 

        2、查看其默认tcp_mem配置:

kernel: TCP: out of memory -- consider tuning tcp_mem 问题处理记录_第2张图片

 解决办法:

1、vim /etc/sysctl.conf 加入以下内容即可

net.core.netdev_max_backlog=30000
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_mem = 94500000 915000000 927000000

2、linux推荐内核调优(可选)

cat >> /etc/sysctl.conf << EOF
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
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 = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
EOF
/sbin/sysctl -p

参数名

说明

net.ipv4.tcp_max_tw_buckets = 6000

系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值将立刻被清楚并输出警告信息。默认值为180000。对于squid来说效果不是很大,但可以控制TIME_WAIT套接字最大值,避免squid服务器被拖死。

net.ipv4.tcp_rmem = 4096 87380 4194304

接收窗口的最大大小

net.ipv4.tcp_wmem = 4096 16384 4194304

默认的接收窗口大小,默认值为 4096(4K)

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_mem[0]:低于此值,TCP 没有内存压力。net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。net.ipv4.tcp_mem[2]:高 于此值,TCP 拒绝分配 socket。上述内存单位是页,而不是字节

net.ipv4.tcp_keepalive_time = 1200

表示当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度。缺省是 2 小时,改为 20 分钟

net.ipv4.ip_local_port_range = 1024 65535

表示用于向外连接的端口范围

net.core.wmem_default = 8388608

为 TCP socket 预留用于发送缓冲的内存默认值(单位:字节)一般要低于 net.core.wmem_default 的值。默认值为 16384(16K)

net.core.rmem_default = 8388608

为 TCP socket 预留用于接收缓冲的内存默认值(单位:字节)

net.core.rmem_max = 16777216

为 TCP socket 预留用于接收缓冲的内存最大值(单位:字节)

net.core.wmem_max = 16777216

TCP socket 预留用于发送缓冲的内存最大值(单位:字节)

net.core.netdev_max_backlog = 262144

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

net.core.somaxconn = 262144

listen(函数)的默认参数,挂起请求的最大数量限制

kernel.msgmnb = 65536

所有在消息队列中的消息总和的最大值(msgmnb=64k)

kernel.msgmax = 65536

指定内核中消息队列中消息的最大值(msgmax=64k)

kernel.shmmax = 68719476736

是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,64 位 linux 系统:可取的最大值为物理内存值-1byte,建 议值为多于物理内存的一半,一般取值大于 SGA_MAX_SIZE 即可,可以取物理内存-1byte。例如,如果为 64GB 物理内存,可取 6410241024*1024-1=68719476735

kernel.shmall = 4294967296

该参数控制可以使用的共享内存的总页数。Linux 共享内存页大小为 4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是 16G,那么需要共享内存页数是 16GB/4KB=16777216KB /4KB=4194304(页) ,也就是 64Bit 系统下 16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求(几乎是原来设置 2097152 的两倍)

net.ipv4.tcp_fin_timeout = 30

TCP协议的time_wait超时时间。操作系统默认240秒后,才会关闭处于time_wait状态的连接,在高并发访问下,服务器端会因为处于time_wait的连接数太多,可能无法建立新的连接,所以需要在服务器上调小此等待值。

参考:

1、TCP: Out of Memory — Consider Tuning TCP_Mem - DZone Performance

2、Linux内核调优 - 云+社区 - 腾讯云 (tencent.com)

3、记一次linux tcp和kafka调参 - 码农教程 (manongjc.com)

你可能感兴趣的:(网络,CentOS,网络,linux,centos)