Linux-socket内核参数配置及含义详解

星期一, 2020-06-08 | Author: Lee | JAVA-and-J2EE, linux | 3,176 views

多由于Linux下解决time_wait连接过多(Linux内核优化配置)

内核文件配置:

vi /etc/sysctl.conf
##生效
/sbin/sysctl -p
 
##查看keepalive的相关配置
sysctl -a | grep keepalive
 
##查看tcp连接的相关状态指令
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
 
##若没有netstat指令安装
yum install net-tools

内核配置注释信息,参考自己的内存和CPU核数进行优化配置,如下

#该文件内容为0,表示禁止数据包转发,1表示允许。
net.ipv4.ip_forward = 0
 
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_syncookies = 1
 
#如果该文件指定的值为非0,则激活sysctem request key。默认值:0。
kernel.sysrq = 0
 
#默认coredump filename是“核心”。通过设置core_uses_pid为1(默认值为0),文件名的coredump成为核心PID。如果core_pattern不包括“%p”(默认是不)和core_uses_pid设置。那时pid将附加到文件名上。
kernel.core_uses_pid = 1
 
#该文件指定在一个消息队列中最大的字节数 缺省设置:16384。
 
kernel.msgmnb = 65536
 
#该文件指定了从一个进程发送到另一个进程的消息最大长度。进程间的消息传递是在内核的内存中进行的。不会交换到硬盘上。所以如果增加该值,则将增加操作系统所使用的内存数量。
kernel.msgmax = 65536
 
#该参数定义了共享内存段的最大尺寸(以字节为单位)。默认是32M。
#可取的最大值为物理内存值 -1byte ,建议值为多于物理内存的一半,一般取值大于 SGA_MAX_SIZE 即可,可以取物理内存 -1byte 。  
#内存为 12G 时,该值为 12*1024*1024*1024-1 = 12884901887
#内存为 16G 时,该值为 16*1024*1024*1024-1 = 17179869183
#内存为 32G 时,该值为 32*1024*1024*1024-1 = 34359738367
#内存为 64G 时,该值为 64*1024*1024*1024-1 = 68719476735
#内存为 128G 时,该值为 128*1024*1024*1024-1 = 137438953471
kernel.shmmax = 17179869183
 
#该参数表示统一一次可以使用的共享内存总量(以页为单位)。默认是2097152,通常不需要修改。
#Linux 共享内存页大小为 4KB, 共享内存段的大小都是共享内存页大小的整数倍。
#一个共享内存段的最大大小是 16G ,那么需要共享内存页数是 16GB/4KB==4194304 (页),
#当内存为 12G 时, kernel.shmall = 3145728
#当内存为 16G 时, kernel.shmall = 4194304
#当内次为 32G 时, kernel.shmall = 8388608
#当内存为 64G 时, kernel.shmall = 16777216
#当内存为 128G 时, kernel.shmall = 33554432
kernel.shmall = 4194304
 
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为 5000。对于Apache、Nginx等服务器,参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死
net.ipv4.tcp_max_tw_buckets = 6000
 
#用来查找特定的遗失的数据包---因此有助于快速恢复状态
net.ipv4.tcp_sack = 1
 
#设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力
net.ipv4.tcp_window_scaling = 1
 
# TCP读buffer
net.ipv4.tcp_rmem = 4096 87380 4194304
 
# TCP写buffer
net.ipv4.tcp_wmem = 4096 16384 4194304
 
# 默认的发送窗口大小
net.core.wmem_default = 8388608
 
# 默认的接收窗口大小
net.core.rmem_default = 8388608
 
# 最大socket接收缓冲
net.core.rmem_max = 16777216
 
# 最大socket发送缓冲
net.core.wmem_max = 16777216
 
# 表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 262144
 
# 默认值是128, 这个参数用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致链接超时或 # 者重传,因此,需要结合并发请求数来调节此值。
net.core.somaxconn = 65535
 
# 用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即 # 被复位并打印出警告信息。这个限制只是为了 防止简单的DoS攻击。不能过分依靠这个限制甚至人为减小这个值, # 更多的情况下应该增加这个值。
net.ipv4.tcp_max_orphans = 3276800
 
# 用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128MB内存的系统而言,此参数的默认值是 # 1024,对小内存的系统则是128。
net.ipv4.tcp_max_syn_backlog = 262144
 
#开启TCP时间戳
#以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
net.ipv4.tcp_timestamps = 0
 
# 参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_synack_retries = 1
 
# 表示在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_syn_retries = 1
 
# 用于设置开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
 
# 同样有3个值,意思是:net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。 # net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。 # net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。
net.ipv4.tcp_mem = 94500000 915000000 927000000
 
# 决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。正确设置这个值非常重要,有时即使一个负载很小的 # Web服务器,也会出现大量的死套接字而产生内存溢出的风险。
net.ipv4.tcp_fin_timeout = 1
 
# 表示当keepalive启用的时候,TCP发送keepalive消息的频度。默认值是2小时(7200)。1200/60 = 20 分钟
net.ipv4.tcp_keepalive_time = 1200
 
# 用来设定允许系统打开的端口范围。
net.ipv4.ip_local_port_range = 1350 65535
 
#禁ping,如果有nagios监控等需要ping保持通讯的此项关闭
net.ipv4.icmp_echo_ignore_all = 1

Tags: ,

文章作者: Lee

本文地址: https://www.pomelolee.com/2075.html

除非注明,Pomelo Lee文章均为原创,转载请以链接形式标明本文地址

No comments yet.

Leave a comment

Search

文章分类

Links

Meta