安装linux后的内核调优

vm.swappiness = 10
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.wmem_max = 873200
net.core.rmem_max = 873200
net.ipv4.tcp_wmem = 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.core.somaxconn = 256
net.core.netdev_max_backlog = 1000
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0

#下面是iptables相关
net.ipv4.ip_conntrack_max = 6553600
net.ipv4.netfilter.ip_conntrack_max = 6553600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.neigh.default.gc_thresh1 = 10240
net.ipv4.neigh.default.gc_thresh2 = 40960
net.ipv4.neigh.default.gc_thresh3 = 81920

几个解释:

swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。两个极端,对于 centos linux 5的默认设置,这个值等于60,建议修改为10。

net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024    65000
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,
#TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。
#对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,
#但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

相关参数说明:ARP支持一个sysctl接口,可以用以配置全局参数或逐个网络接口地进行配制。该sysctl可以通过/proc/sys /net/ipv4/neigh/*/*文件或者使用sysctl(2)接口来访问。系统中每个接口都在/proc/sys/net/ipv4 /neigh/.中有自己的目录。`default’目录中的设置用于所有新建的设备。sysctl相关的时间是以秒为单位,除非特别声明过.
anycast_delay  对IPv6相邻请求信息的回复的最大延迟时间;目前还不支持anycast。缺省值为1秒。  app_solicit  这是在使用多路广播探测(multicast probe)前,经过网络连接送到用户间隙ARP端口监控程序的探测(probe)最大数目(见mcast_solicit)。缺省值为0。  base_reachable_time  一旦发现相邻记录,至少在一段介于base_reachable_time/2和3*base_reachable_time/2之间的随机时间内,该记录是有效的。如果收到上层协议的肯定反馈,那么记录的有效期将延长。缺省值是30秒。  delay_first_probe_time  发现某个相邻层记录无效(stale)后,发出第一个探测要等待的时间。缺省值是5秒。  gc_interval  收集相邻层记录的无用记录的垃圾收集程序的运行周期,缺省为30秒。  gc_stale_time  决定检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。  gc_thresh1  存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128。  gc_thresh2  保存在ARP高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字5秒。缺省值是512。  gc_thresh3  保存在ARP高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是1024。  locktime  ARP记录保存在高速缓存内的最短时间(jiffy数),以防止存在多个可能的映射(potential mapping)时,ARP高速缓存系统的颠簸(经常是由于网络的错误配置而引起)。缺省值是1秒。  mcast_solicit  在把记录标记为不可抵达的之前,用多路广播/广播(multicast/broadcast)方式解析地址的最大次数。  缺省值是3。  proxy_delay  当接收到有一个请求已知的代理ARP地址的ARP请求时,在回应前可以延迟的jiffy(时间单位,见BUG)数目。这样,以防止网络风暴。缺省值是0.8秒。  proxy_qlen  能放入代理ARP地址队列(proxy-ARP addresses)的数据包最大数目。缺省值是64。  retrans_time  重发一个请求前的等待jiffy(时间单位,见BUG)的数目。缺省值是1秒。  ucast_solicit  询问ARP端口监控程序前,试图发送单探测(unicast probe)的次数。(见app_solicit).缺省值是3秒。  unres_qlen  每个没有被其它网络层解析的地址,在队列中可存放包的最大数目。缺省值是3.

$ /proc/sys/net/core/wmem_max
最大socket写buffer,可参考的优化值:873200

$ /proc/sys/net/core/rmem_max
最大socket读buffer,可参考的优化值:873200

$ /proc/sys/net/ipv4/tcp_wmem
TCP写buffer,可参考的优化值: 8192 436600 873200

$ /proc/sys/net/ipv4/tcp_rmem
TCP读buffer,可参考的优化值: 32768 436600 873200

$ /proc/sys/net/ipv4/tcp_mem
同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
上述内存单位是页,而不是字节.
可参考的优化值是:786432 1048576 1572864

$ /proc/sys/net/core/netdev_max_backlog
进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.

$ /proc/sys/net/core/somaxconn
listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.
可调整到256.

$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默认10K.

$ /proc/sys/net/ipv4/tcp_max_syn_backlog
进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.
可调整到2048.

$ /proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.

$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
这3个参数与TCP KeepAlive有关.默认值是:

tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds

意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可调整到:

/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3

$ proc/sys/net/ipv4/ip_local_port_range
指定端口范围的一个配置,默认是32768 61000,已够大.

 

增加文件数限制:

vim /etc/security/limits.conf
* soft nofile 51200
* hard nofile 65535

升级qmail时导入旧qmail系统用户及邮件的脚本

#!/bin/bash
#本脚本用于升级qmail时导入旧的qmail系统的用户及邮件
#auther:阿辉
#date:2009.06.12

adduser="/home/vpopmail/bin/vadduser"
vuserinfo="/home/vpopmail/bin/vuserinfo"
quota="100MB"
#vpopmail.csv为旧的vpopmail数据库表的导出文件
vpopmail="/root/vpopmail.csv"

sed ‘/^s*$/d’ $vpopmail | sed ‘/^s*#.*/d’ | while read list
do
    echo
    echo
    username=`echo $list | cut -d ‘;’ -f 2 | tr -d ‘"’`
    domain=`echo $list | cut -d ‘;’ -f 3 | tr -d ‘"’`
    encrypt=`echo $list | cut -d ‘;’ -f 4 `
    password=`echo $list | cut -d ‘;’ -f 10 | tr -d ‘"’`
    comment=`echo $list | cut -d ‘;’ -f 7 `
    dir="/opt"`echo $list | cut -d ‘;’ -f 8 | tr -d ‘"’`
    email=$username"@"$domain

    #建用户
    echo $adduser -q $quota -c $comment $email $password
    $adduser -q $quota $email $password
   
    #更新用户信息及加密密码
    echo "update vpopmail.fortelchina_com set pw_passwd = $encrypt,pw_gecos = $comment where pw_name = ‘$username’"
    echo "update vpopmail.fortelchina_com set pw_passwd = $encrypt,pw_gecos = $comment where pw_name = ‘$username’" | mysql -uroot -p123456

    #导入用户邮件
    pw_dir=`echo "select pw_dir from vpopmail.fortelchina_com where pw_name = ‘$username’" | mysql -uroot -p123456 | sed ‘1d’`
    echo /bin/cp -rf $dir/Maildir $pw_dir
    /bin/cp -rf $dir/Maildir $pw_dir
   
    #修改邮件的权限
    echo chown -R vpopmail.vchkpw $pw_dir
    chown -R vpopmail.vchkpw $pw_dir

    #重新生成maildirsize文件
    echo rm -rf $pw_dir/Maildir/maildirsize
    rm -rf $pw_dir/Maildir/maildirsize
    echo $vuserinfo $email
    $vuserinfo $email
   
done