/etc/sysctl.conf 调优 & 优化Linux内核参数

时间:2021-03-19 12:33:15

from: http://apps.hi.baidu.com/share/detail/15652067

http://keyknight.blog.163.com/blog/static/3663784020104152407759/

http://blog.sina.com.cn/s/blog_6e2aeba30100uve3.html

sysctl.conf 优化

The sysctl.conf of a server is something that is seldom optimized for performance. You can get a tremendous boost in throughput by adjusting these settings. This configuration has been written by Steve from Rack911. I have applied this configuration to servers ranging from Celeron 1.7Ghz to Dual Xeon 2.8Ghz servers, and on the whole, the load on each lowered after making the changes.

First make a backup of your old /etc/sysctl.conf file by running the following command, logged in as root:

cp /etc/sysctl.conf /etc/sysctl.conf.bak

Now enter:
pico /etc/sysctl.conf 

and replace the contents of the file with the following:


# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.

# Disables packet forwarding
net.ipv4.ip_forward=0

# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.lo.log_martians = 0
net.ipv4.conf.eth0.log_martians = 0

# Disables the magic-sysrq key
kernel.sysrq = 0

# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15

# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800

# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0

# Turn off the tcp_sack
net.ipv4.tcp_sack = 0

# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0

# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1

# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1

# Increases the size of the socket queue (effectively, q0).
net.ipv4.tcp_max_syn_backlog = 1024

# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 1440000

# Allowed local port range
net.ipv4.ip_local_port_range = 16384 65536

CTRL + X to exit and save the file

To make your changes take effect immediately, type this command:
/sbin/sysctl -p

引用自:FreeBSD下构建安全的Web服务器 
作者:heiyeluren http://www.unixsky.net 
编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) 

#最大的待发送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 

#每个进程能够同时打开的最大文件数量 
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=32768 

#禁止用户查看其他用户的进程 
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 

#仅为线程提供物理内存支持,需要256兆以上内存 
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



Linux如何在系统运行时修改内核参数(/proc/sys 与 /etc/sysctl.conf)  

RedHat向员提供了非常好的方法,使我们可以在系统运行时更改内核参数,而不需要重新引导系统。这是通过/proc虚拟文件系统实现的。/proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改, 不过重新启动机器后会失效,可以通过更改/proc/sys中内核参数对应的文件 /etc/sysctl.conf 的内核参数来永久更改。下面我们以打开内核的 ip转发功能为例说明在系统运行时修改内核参数的两种方法。IP转发是指允许系统对来源和目的地都不是本机的数据包通过网络,RedHat默认屏蔽此功能,在 需要用本机作为路由器、NAT等情况下需要开启此功能。


  方法一:修改/proc下内核参数文件内容

  直接修改内核参数ip_forward对应在/proc下的文件/proc/sys/net/ipv4/ip_forward。用下面命令查看ip_forward文件内容:
  # cat /proc/sys/net/ipv4/ip_forward
  该文件默认值0是禁止ip转发,修改为1即开启ip转发功能。修改命令如下:
  # echo 1 >/proc/sys/net/ipv4/ip_forward
  修改过后就马上生效,即内核已经打开ip转发功能。但如果系统重启后则又恢复为默认值0,如果想永久打开需要通过修改/etc/sysctl.conf文件的内容来实现。

  方法二.修改/etc/sysctl.conf文件
  默认sysctl.conf文件中有一个变量是
  net.ipv4.ip_forward = 0
  将后面值改为1,然后保存文件。因为每次系统启动时初始化脚本/etc/rc.d/rc.sysinit会读取/etc/sysctl.conf文件的内容,所以修改后每次系统启动时都会开启ip转发功能。但只是修改sysctl文件不会马上生效,如果想使修改马上生效可以执行下面的命令:
  # sysctl –p



  在修改其他内核参数时可以向/etc/sysctl.conf文件中添加相应变量即可,下面介绍/proc/sys下内核文件与配置文件 sysctl.conf中变量的对应关系,由于可以修改的内核参数都在/proc/sys目录下,所以sysctl.conf的变量名省略了目录的前面部分(/proc/sys)。

  将/proc/sys中的文件转换成sysctl中的变量依据下面两个简单的规则:

  1.去掉前面部分/proc/sys

  2.将文件名中的斜杠变为点

  这两条规则可以将/proc/sys中的任一文件名转换成sysctl中的变量名。

  例如:

  /proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward

  /proc/sys/kernel/hostname =》 kernel.hostname

  可以使用下面命令查询所有可修改的变量名

  # sysctl –a

  下面例举几个简单的内核参数:

  1./proc/sys/kernel/shmmax
  该文件指定内核所允许的最大共享内存段的大小。

  2./proc/sys/kernel/threads-max
  该文件指定内核所能使用的线程的最大数目。

  3./proc/sys/kernel/hostname
  该文件允许您配置网络主机名。

  4./proc/sys/kernel/domainname
  该文件允许您配置网络域名 



1net.ipv4.tcp_max_syn_backlog = 65536

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于超过128M内存的系统而言,缺省值是1024,低于128M小内存的系统则是128

SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()Accept() ),是用另一个队列单独存放半打开连接。

这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明<1000p/s)加大SYN队列长度可以容纳更多等待连接的网络连接数,一般遭受SYN Flood攻击的网站,都存在大量SYN_RECV状态,所以调大tcp_max_syn_backlog值能增加抵抗syn攻击的能力。

2net.core.netdev_max_backlog =  32768

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

3net.core.somaxconn = 32768

调整系统同时发起并发TCP连接数,可能需要提高连接储备值,以应对大量突发入局连接请求的情况。如果同时接收到大量连接请求,使用较大的值会提高受支持的暂挂连接的数量,从而可减少连接失败的数量。大的侦听队列对防止DDoS攻击也会有所帮助。挂起请求的最大数量默认是128

4net.core.wmem_default = 8388608

该参数指定了发送套接字缓冲区大小的缺省值(以字节为单位)

5net.core.rmem_default = 8388608

该参数指定了接收套接字缓冲区大小的缺省值(以字节为单位)

6net.core.rmem_max = 16777216

该参数指定了接收套接字缓冲区大小的最大值(以字节为单位)

7net.core.wmem_max = 16777216

该参数指定了发送套接字缓冲区大小的最大值(以字节为单位)

8net.ipv4.tcp_timestamps = 0

Timestamps可以防范那些伪造的sequence号码。一条1G的宽带线路或许会重遇到带out-of-line数值的旧sequence号码(假如它是由于上次产生的)。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉,以提高性能。

9net.ipv4.tcp_synack_retries = 2

对于远端的连接请求SYN,内核会发送SYNACK数据报,以确认收到上一个SYN连接请求包。这是所谓的三次握手(threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的SYN+ACK数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据tcp_syn_retries来决定这个值)

10net.ipv4.tcp_syn_retries = 2

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

11net.ipv4.tcp_tw_recycle = 1

表示开启TCP连接中TIME-WAIT Sockets的快速回收,默认为0,表示关闭。

#net.ipv4.tcp_tw_len = 1

12net.ipv4.tcp_tw_reuse = 1

表示开启重用,允许将TIME-WAIT Sockets重新用于新的TCP连接,默认为0,表示关闭。这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助。

13net.ipv4.tcp_mem = 94500000 915000000 927000000

tcp_mem3INTEGER变量:low, pressure, high

low:当TCP使用了低于该值的内存页面数时,TCP没有内存压力,TCP不会考虑释放内存。(理想情况下,这个值应与指定给tcp_wmem的第2个值相匹配。这第2个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072*300/4096)

pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是TCP可以使用的总缓冲区大小的最大值(204800*300/4096)

high:允许所有TCP Sockets用于排队缓冲数据报的页面量。如果超过这个值,TCP连接将被拒绝,这就是为什么不要令其过于保守(512000*300/4096)的原因了。在这种情况下,提供的价值很大,它能处理很多连接,是所预期的2.5倍;或者使现有连接能够传输2.5倍的数据。

一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

14net.ipv4.tcp_max_orphans = 3276800

系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的DoS攻击﹐千万不要依赖这个或是人为的降低这个限制

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 120

15net.ipv4.ip_local_port_range = 1024  65535

将系统对本地端口范围限制设置为1024~65000之间

16net.ipv4.ip_conntrack_max = 10000

设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数)