Linux内核调整

Linux内核调整

内核配置文件

-rw-r--r-- 1 root root 1631 Apr 11 20:51 /etc/sysctl.conf

开启路由转发功能

net.ipv4.ip_forward = 1

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。

vm.overcommit_memory = 1

设置linux可以使用的端口是从1024到65535

net.ipv4.ip_local_port_range = 1024 65535

FIN_WAIT_2状态的超时时长

net.ipv4.tcp_fin_timeout = 1

当keepalive起用的时候,TCP发送keepalive消息的频度,单位为秒,缺省是7200秒(即2小时)

net.ipv4.tcp_keepalive_time = 1200

内核分配给TCP连接的内存,单位是page:

       第一个数字表示TCP使用的page少于此值时,内核不进行任何处理(干预),
       第二个数字表示TCP使用的page超过此值时,内核进入“memory pressure”压力模式,
       第三个数字表示TCP使用的page超过些值时,报“Out of socket memory”错误,TCP 连接将被拒绝

net.ipv4.tcp_mem = 94500000 915000000 927000000

为每个TCP连接分配的写缓冲区内存大小,单位是byte:
       第一个数字表示,为TCP连接分配的最小内存,
       第二个数字表示,为TCP连接分配的缺省内存,
       第三个数字表示,为TCP连接分配的最大内存(net.core.wmem_max可覆盖该值)

net.ipv4.tcp_wmem = 4096 8192 4194304

为1表示允许将TIME-WAIT(僵尸进程)的句柄重新用于新的TCP连接

net.ipv4.tcp_tw_reuse = 1

为1表示开启TCP连接中TIME-WAIT的快速回收,NAT环境可能导致DROP掉SYN包(回复RST)

net.ipv4.tcp_tw_recycle = 1

开启TCP时间戳,用来计算往返时间RTT(Round-Trip Time)和防止序列号回绕,关闭即可防止nat架构的问题

net.ipv4.tcp_timestamps = 0

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

net.ipv4.tcp_synack_retries = 2

对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

net.ipv4.tcp_syn_retries = 1

当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击

net.ipv4.tcp_syncookies = 1

当TCP连接已经建立,并塞到程序监听backlog队列时,如果检测到backlog队列已经满员后,TCP连接状态会回退到SYN+ACK状态,假装TCP三次握手第三次客户单的ACK包没收到,让客户端重传ACK,以便快速进入ESTABLISHED状态。如果设置了该参数,那么在检测到监听backlog队列已满时,直接发 RST 包给客户端终止此连接,此时客户端程序会收到104 Connection reset by peer错误。这个参数很暴力,慎用。

net.ipv4.tcp_abort_on_overflow = 0

接收套接字缓冲区大小的默认值(以字节为单位)。

net.core.rmem_default = 262144

接收套接字缓冲区大小的最大值(以字节为单位)。

net.core.rmem_max = 16777216

发送套接字缓冲区大小的默认值(以字节为单位)。

net.core.wmem_default = 262144

发送套接字缓冲区大小的最大值(以字节为单位)。

net.core.wmem_max = 16777216

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

net.core.netdev_max_backlog = 262144

表示socket监听(listen)的backlog上限。backlog是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。 默认值是128。当服务端繁忙时,如NameNode或JobTracker,128是远远不够的。这样就需要增大backlog,例如3000台集群就将ipc.server.listen.queue.size设成了32768,为了使得整个参数达到预期效果,同样需要将kernel参数net.core.somaxconn设成一个大于等于32768的值。

net.core.somaxconn = 262144

该参数用于设定系统中最多允许存在多少tcp套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,没有与用户文件句柄关联的tcp套接字符将立即被复位,同时给出警告信息。这个限制只是为了防止简单的DoS工具。一般在系统内存比较充足的情况下,可以增大这个参数的赋值

net.ipv4.tcp_max_orphans = 3276800

Tcp syn队列的较大长度,在进行系统调用connect时会发生Tcp的三次握手,server内核会为Tcp维护两个队列,Syn队列和Accept队列,Syn队列是指存放完成第一次握手的连接,Accept队列是存放完成整个Tcp三次握手的连接,修改net.ipv4.tcp_max_syn_backlog使之增大可以接受更多的网络连接。

net.ipv4.tcp_max_syn_backlog = 262144

最大追踪连接数修改调整

net.ipv4.netfilter.ip_conntrack_max = 2097152
net.nf_conntrack_max = 655360

响应时间调整

1
2
3
4
5
6
7
#主动方的最后1个状态。默认120秒
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
#CLOSE_WAIT是被动方收到FIN发ACK,然后会转到LAST_ACK发FIN,除非程序写得有问题,正常来说这状态持续时间很短。默认 60 秒
net.netfilter.nf_conntrack_tcp_timeout_close_wait=15
#理论上不用这么长,不小于 net.ipv4.tcp_keepalive_time 就行了。默认 432000 秒(5天)
net.netfilter.nf_conntrack_tcp_timeout_established=300

关闭 arp 的公告及响应

arp_announce

对网络接口上本地IP地址发出的ARP报文作出相应级别的限制。
       0 本机所有IP地址都向任何一个接口通告ARP报文。
       1 尽量仅向该网卡回应与该网段匹配的ARP报文。
       2 只向该网卡回应与该网段匹配的ARP报文。

arp_ignore

定义对目标地址为本地IP的ARP询问不同的应答模式。

       0 响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
       1 只响应目的IP地址为接收网卡上的本地地址的arp请求。
       2 只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
       3 如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
       4~7 预留。
       8 不回应所有的arp请求。

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2018-2024 Outsrkem
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信