前言

在Linux中,/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系,我们需要对内核参数进行修改,可以直接在/etc/sysctl.conf中添加修改,然后使用命令:sysctl –p使其生效。

参数调优时,尽量不要盲目修改相关参数,这样做反而可能会导致性能下降,应逐个参数对其调优,然后对比调优前后的效果。

参数配置

相关的一些参数优化配置及说明如下:

# 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies 来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
# 开启记录欺骗,源路由和重定向包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# 开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 处理无源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 长示开启TCP连接中TIME-WAIT sockets 的快速回收,默认为0,长示关闭;
net.ipv4.tcp_tw_recycle = 1
# 修改系航默认的 TIMEOUT 时间。保持在FIN-WAIT-2状态的时间,使系统可以处理更多的连接,此参数值为整数,单位:秒。
net.ipv4.tcp_fin_timeout = 2
# 表示当 keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟,单位:秒。
net.ipv4.tcp_keepalive_time = 1200
# 表示用于向外连接的端口范围。缺省情况下很小: 32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.ip_local_port_range = 10000 65000
# 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192
# 表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为6000。
net.ipv4.tcp_max_tw_buckets = 6000
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 32768
# web应用中 listen函数的backlog默认会给我们内核参数的net.core.somaxeonm限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.core.somaxconn = 32768
# 为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_synack_retries = 2
# 在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_syn_retries = 2
# 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连按
net.ipv4.tcp_tw_reuse = 1
# TCP 写 buffer
net.ipv4.tcp_wmem = 8192 436600 873200
# TCP读 buffer
net.ipv4.tcp_rmem = 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
##上面参数同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。
net.ipv4.tcp_mem[l]:在此值下,进入内存压力阶段。
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket 。
# 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,连接将即刻被复位并打印出警告信息。
net.ipv4.tcp_max_orphans = 3276800
# 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。
net.ipv4.tcp_fin_timeout = 30

一些其他的相关参数优化:

# 最大的待发送TCP数据缓冲区空间  
net.inet.tcp.sendspace = 65536
# 最大的接受TCP缓冲区空间  
net.inet.tcp.recvspace = 65536
# 最大的接受UDP缓冲区大小  
net.inet.udp.sendspace = 65535
# 最大的发送UDP数据缓冲区大小  
net.inet.udp.maxdgram = 65535
# 本地套接字连接的数据发送空间  
net.local.stream.sendspace = 65535
# 加快网络性能的协议  
net.inet.tcp.rfc1323 = 1
net.inet.tcp.rfc1644 = 1
net.inet.tcp.rfc3042 = 1
net.inet.tcp.rfc3390 = 1
# 最大的套接字缓冲区  
kern.ipc.maxsockbuf = 2097152
# 系统中允许的最多文件数量  
kern.maxfiles = 65536
# 增加系统文件描述符限制
fs.file-max = 65535
# 每个进程能够同时打开的最大文件数量  
kern.maxfilesperproc = 32768  
# 当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。  
net.inet.tcp.delayed_ack = 0  
# 屏蔽ICMP重定向功能  
net.inet.icmp.drop_redirect = 1  
net.inet.icmp.log_redirect = 1  
net.inet.ip.redirect = 0  
net.inet6.ip6.redirect = 0  
# 防止ICMP广播风暴  
net.inet.icmp.bmcastecho = 0  
net.inet.icmp.maskrepl = 0  
# 限制系统发送ICMP速率  
net.inet.icmp.icmplim = 100  
# 安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才可以用  
net.inet.icmp.icmplim_output = 0  
net.inet.tcp.drop_synfin = 1  
# 设置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接  
net.inet.tcp.always_keepalive = 1
# 若看到net.inet.ip.intr_queue_drops这个在增加,就要调大net.inet.ip.intr_queue_maxlen,为0最好
net.inet.ip.intr_queue_maxlen = 1000
# 防止DOS攻击,默认为30000
net.inet.tcp.msl = 7500
# 接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包
net.inet.tcp.blackhole = 2  
# 接收到一个已经关闭的端口发来的所有UDP包直接drop
net.inet.udp.blackhole = 1  
# 为网络数据连接时提供缓冲
net.inet.tcp.inflight.enable = 1  
# 如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表
net.inet.ip.fastforwarding = 0  
# kernel编译打开options POLLING功能,高负载情况下使用,低负载不推荐。SMP不能和polling一起用
#kern.polling.enable = 1  
# 并发连接数,默认为128,推荐在1024-4096之间。注:数字越大占用内存也越大
kern.ipc.somaxconn = 2048
# 禁止用户查看其他用户的进程  
security.bsd.see_other_uids = 0  
# 设置kernel安全级别  
kern.securelevel = 0  
# 记录下任何TCP连接  
net.inet.tcp.log_in_vain = 1  
# 记录下任何UDP连接  
net.inet.udp.log_in_vain = 1  
# 防止不正确的udp包的攻击  
net.inet.udp.checksum = 1  
# 防止DOS攻击  
net.inet.tcp.syncookies = 1  
# 仅为线程提供物理内存支持,需要256M以上内存  
kern.ipc.shm_use_phys = 1  
# 线程可使用的最大共享内存  
kern.ipc.shmmax = 67108864  
# 最大线程数量  
kern.ipc.shmall = 32768  
# 程序崩溃时不记录  
kern.coredump = 0
# lo本地数据流接收和发送空间  
net.local.stream.recvspace = 65536
net.local.dgram.maxdgram = 16384
net.local.dgram.recvspace = 65536
# 数据包数据段大小,ADSL为1452。  
net.inet.tcp.mssdflt = 1460
# 为网络数据连接时提供缓冲  
net.inet.tcp.inflight_enable = 1
# 数据包数据段最小值,ADSL为1452  
net.inet.tcp.minmss = 1460
# 本地数据最大数量  
net.inet.raw.maxdgram = 65536
# 本地数据流接收空间  
net.inet.raw.recvspace = 65536
# ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接  
net.inet.ip.fw.dyn_max = 65535
# 设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)  
net.inet.ipf.fr_tcpidletimeout = 864000

个人简单配置如图,使用时结合实际需求配置即可:

sysctl_info.png

End

本文标题:Linux内核参数调优

本文链接:https://www.isisy.com/1159.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

如果觉得我的文章对你有用,请随意赞赏