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 | #主动方的最后1个状态。默认120秒 |
关闭 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