一、 优化kernel:

1、 /proc/sys/kernel/ctrl-alt-del
该文件有一个二进制值,该值控制系统在接收到ctrl+alt+delete按键组合时如何反应。这两个值分别是:
零(0)值,表示捕获ctrl+alt+delete,并将其送至 init 程序;这将允许系统可以安全地关闭和重启,就好象输入shutdown命令一样。
壹(1)值,表示不捕获ctrl+alt+delete,将执行非正常的关闭,就好象直接关闭电源一样。
缺省设置:0
建议设置:1,防止意外按下ctrl+alt+delete导致系统非正常重启。

2、 /proc/sys/kernel/msgmax
该文件指定了从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。

3、 /proc/sys/kernel/msgmnb
该文件指定一个消息队列的最大长度(bytes)。

4、/proc/sys/kernel/msgmni
该文件指定消息队列标识的最大数目,即系统范围内最大多少个消息队列。

5、/proc/sys/kernel/panic
该文件表示如果发生“内核严重错误(kernel panic)”,则内核在重新引导之前等待的时间(以秒为单位)。
零(0)秒,表示在发生内核严重错误时将禁止自动重新引导。

6、/proc/sys/kernel/shmall
该文件表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。

7、/proc/sys/kernel/shmmax
该文件表示内核所允许的最大共享内存段的大小(bytes)。
缺省设置:33554432
建议设置:物理内存 * 50%
实际可用最大共享内存段大小=shmmax * 98%,其中大约2%用于共享内存结构。
可以通过设置shmmax,然后执行ipcs -l来验证。

8、/proc/sys/kernel/shmmni
该文件表示用于整个系统的共享内存段的最大数目(个)。

9、/proc/sys/kernel/threads-max
该文件表示内核所能使用的线程的最大数目。

10、/proc/sys/kernel/sem
该文件用于控制内核信号量,信号量是System VIPC用于进程间通讯的方法。
建议设置:250 32000 100 128
第一列,表示每个信号集中的最大信号量数目。
第二列,表示系统范围内的最大信号量总数目。
第三列,表示每个信号发生时的最大系统操作数目。
第四列,表示系统范围内的最大信号集总数目。
所以,(第一列)*(第四列)=(第二列)
以上设置,可以通过执行ipcs -l来验证。


二、优化VM:

1、 /proc/sys/vm/block_dump
该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作。
缺省设置:0,禁用Block Debug模式

2、/proc/sys/vm/dirty_background_ratio
该文件表示脏数据到达系统整体内存的百分比,此时触发pdflush进程把脏数据写回磁盘。

3、/proc/sys/vm/dirty_expire_centisecs
该文件表示如果脏数据在内存中驻留时间超过该值,pdflush进程在下一次将把这些数据写回磁盘。
缺省设置:3000(1/100秒)

4、/proc/sys/vm/dirty_ratio
该文件表示如果进程产生的脏数据到达系统整体内存的百分比,此时进程自行把脏数据写回磁盘。
缺省设置:40

5、/proc/sys/vm/dirty_writeback_centisecs
该文件表示pdflush进程周期性间隔多久把脏数据写回磁盘。
缺省设置:500(1/100秒)

6、/proc/sys/vm/vfs_cache_pressure
该文件表示内核回收用
于directory和inode
cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode
cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode
cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。
缺省设置:100

7、/proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。
缺省设置:724(512M物理内存)

8、/proc/sys/vm/nr_pdflush_threads
该文件表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。
缺省设置:2(只读)

9、/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。
缺省设置:0

10、 /proc/sys/vm/overcommit_ratio
该文件表示,如果overcommit_memory=2,可以过载内存的百分比,通过以下公式来计算系统整体可用内存。
系统可分配内存=交换空间+物理内存*overcommit_ratio/100
缺省设置:50(%)

11、/proc/sys/vm/page-cluster
该文件表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。

缺省设置:3(2的3次方,8页)

12、/proc/sys/vm/swapiness
该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。越大越偏向使用swap
缺省设置:60

13、/proc/sys/vm/legacy_va_layout
该文件表示是否使用最新的32位共享内存mmap()系统调用,Linux支持的共享内存分配方式包括mmap(),Posix,System VIPC。
0, 使用最新32位mmap()系统调用。
1, 使用2.4内核提供的系统调用。
缺省设置:0

14、/proc/sys/vm/nr_hugepages
该文件表示系统保留的hugetlb页数。


三、优化fs:

1、 /proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开
文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。
缺省设置:4096
建议设置:65536

2、/proc/sys/fs/file-nr
该文件与 file-max 相关,它有三个值:
已分配文件句柄的数目
已使用文件句柄的数目
文件句柄的最大数目
该文件是只读的,仅用于显示信息。


四、 优化net:

1、优化网络设备接收队列
net.core.netdev_max_backlog=3000
   该文件表示在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
   默认值:    rhel5 默认为1000
   建议值为3000


2、重定向 icmp 信息是否接收

net.ipv4.conf.lo.accept_redirects
   accept_redirects:该参数位于 /proc/sys/net/ipv4/conf/DEV/accept_redirects (DEV表示具体的网络接口),如果你的主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向 icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0,或者使用“安全重定向”(见下文) 以消除安全性隐患。
  net.ipv4.conf.lo.accept_redirects=0
  net.ipv4.conf.all.accept_redirects=0
  net.ipv4.conf.eth0.accept_redirects=0
  net.ipv4.conf.default.accept_redirects=0


3、打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。
   net.ipv4.tcp_max_tw_buckets = 6000

   net.ipv4.tcp_tw_recyle=1
   net.ipv4.tcp_tw_reuse=1

    /proc/sys/net/ipv4/tcp_max_tw_buckets选项用来设定timewait的数量,默认是180000,这里设为6000。  

   /proc/sys/net/ipv4/tcp_tw_recyle
   打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求,请不要随
   意修改这个值。
   缺省设置:0
   /proc/sys/net/ipv4/tcp_tw_reuse
   该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
    缺省设置:0
下边的命令用来对连接数量非常大的服务器进行调优.
·对于同时支持很多连接的服务器,新的连接可以重新使用TIME-WAIT套接字. 这对于Web服务器非常有效,如果你使用该命令,还要启动TIME-WAIT 套接字状态的快速循环功能:
显示出将这些功能启用,连接数量明显降低.因为每个TCP传输都包含远程客户端的协议信息缓存,所以有利于提高性能.缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。


4、减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30
          tcp_fin_timeout:在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,
    在获 得B的ack确认包后,A就进入FIN WAIT2状态等待B的fin包然后给B发ack确认包。
    这个参数就是用来设置A进入FIN WAIT2状态等待对方fin包的超时时间。
    如果时间到了仍未收到对方的fin包就主动释放该会话。
         对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能
  会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。
  FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1,因为它们最多只吃 1.5K
  的内存,但是它们存在时间更长。
         参数tcp_fin_timeout 是套接字关闭时,保持FIN-WAIT-2状态的时间。一个TCP连接以three-segment SYN序列开始, 以three-segment FIN序列结束.均不保留数据.通过改变tcp_fin_timeout的值, 从FIN序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进.改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出.

5、减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time = 1800

   net.ipv4.tcp_keepalive_probes = 9
   net.ipv4.tcp_keepalive_intvl = 75

   /proc/sys/net/ipv4/tcp_keepalive_time当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。
  /proc/sys/net/ipv4/tcp_keepalive_intvl当探测没有确认时,重新发送探测的频度。缺省是75秒。
  /proc/sys/net/ipv4/tcp_keepalive_probes在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应。

   服务器的一个问题是,同一时刻的大量TCP连接里有很多的连接被打开但是没有使用. TCP的keepalive功能检测到这些连接,缺省情况下,在2小时之后丢掉. 2个小时的可能导致内存过度使用,降低性能.因此改成1800秒(30分钟)是个更好的选择:


6、增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=8192

    /proc/sys/net/ipv4/tcp_max_syn_backlog
    对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。对于
    超过 128Mb 内存的系统,默认值是 1024,低于 128Mb 的则为 128。如果
    服务器经常出现过载,可以尝试增加这个数字。警告!假如您将此值设为大于
    1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE,以保持
    TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如
    果tcp_adv_win_scale 128Mb 32768-610000)则系统将忽略所有发送给自己
    的ICMP ECHO请求或那些广播地址的请求。
    当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致half-open连接数量的增加。这对于Web服务器很来讲很平常,尤其有很多拨号客户时.这些half-open连接保存在 backlog connections 队列中.将这个值最少设置为4096 (缺省为1024). 即便是服务器不接收这类连接,设置这个值还能防止受到denial-of-service (syn-flood)的***.


7、打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood***。
net.ipv4.tcp_syncookies=1
  /proc/sys/net/ipv4/tcp_syncookies
该文件表示是否打开TCP同步标签(syncookie),内核必须打开了 CONFIG_SYN_COOKIES项进行编译。 同步标签(syncookie)可以防止一个套接字在有过多试图连接到达时引起过载。
tcp_syncookies 参数类型:整型
只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood***。默认值是false。
注意:该选项千万不能用于那些没有收到***的高负载服务器,如果在日志中出现 synflood消息,但是调查发现没有收到synflood***,而是合法用户的连接负载过高的原因,你应该调整其它参数来提高服务器性能。参考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.
syncookie严重的违背TCP协议,不允许使用TCP扩展,可能对某些服务导致严重的性能影响(如SMTP转发)。
开启TCP SYN cookies,保护服务器避免受syn-flood***,包括服务取决denial-of-service (DoS) 或者分布式服务拒绝distributed denial-of-service (DDoS) (仅适用Red Hat Enterprise Linux AS)


8、指定发送SYN和ACK包个数:

    net.ipv4.tcp_syn_retries = 5
    net.ipv4.tcp_synack_retries = 5

   net.ipv4.tcp_synack_retries参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。

   net.ipv4.tcp_syn_retries选项表示在内核放弃建立连接之前发送SYN包的数量。


9、定义TCP打开的端口范围:

   net.ipv4.ip_local_port_range = 32768    61000

   net.ipv4.ip_local_port_range选项用来设定允许系统打开的端口范围


10、优化套接字缓冲区:

   net.core.rmem_max = 131071
     net.core.rmem_default = 124928

     net.core.wmem_max = 131071
     net.core.wmem_default = 124928

       /proc/sys/net/core/rmem_default
    该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)。
      /proc/sys/net/core/rmem_max
    该文件指定了接收套接字缓冲区大小的最大值(以字节为单位)。
     /proc/sys/net/core/wmem_default
    该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。
     /proc/sys/net/core/wmem_max
    该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。

11、优化TCP接收/发送缓冲区
     net.ipv4.tcp_rmem=4096 87380 16777216
     net.ipv4.tcp_wmem=4096 65536 16777216

    /proc/sys/net/ipv4/tcp_wmem
    该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于发送缓冲的内存最小值。每个TCP socket都可以使用它。
Default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。
Max:为TCP socket预留用于发送缓冲的内存最大值。该值不会影响net.core.wmem_max,今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。
缺省设置:4096 16384 131072
     /proc/sys/net/ipv4/tcp_rmem
     该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下TCP socket都至少会有这么多数量的内存用于接收缓冲。
Default: 为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem中default的值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win的 默认值情况下,TCP 窗口大小为65535。
Max:为TCP socket预留用于接收缓冲的内存最大值。该值不会影响 net.core.wmem中max的值,今天选择参数 SO_SNDBUF则不受该值影响。


12、其他tcp定义:

      tcp_timestamps = 1
缺省值为1
Timestamps 用在其它一些东西中﹐可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 ‘旧封包’。(该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。)

   经常性出现connect失败,抓包发现:服务S端已经收到了syn包,但没有回复synack,关闭了tcptimestamp就恢复正常。

     tcp_retries1 :INTEGER
默认值是3
放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 – 8分钟之间。(注意:这个值同时还决定进入的syn连接)

     tcp_retries2 :INTEGER
默认值为15
在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)