apache调优
    可调整的内核参数
       1、调整下列内核参数解决出现大量的TIME_WAIT
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
参数说明:
然后执行 /sbin/sysctl -p 让参数生效。
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 修改系統默认的 TIMEOUT 时间
       2、调整内核参数是apache的keepalive开启占用更少的资源
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 1800
参数说明:
tcp_keepalive_time  默认值是7200(2小时)
当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击?tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)

tcp_keepalive_probes  默认值是9
TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)

tcp_keepalive_intvl  默认值为75
探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)
        3、调整内核参数,使之可支持更多的listen队列和syn队列
net.ipv4.tcp_max_syn_backlog =1024
net.core.somaxconn = 128
参数说明:
net.ipv4.tcp_max_syn_backlog:
    syn的消息队列长度,使系统可以处理更多的并发连接
当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致half-open连接数量的增加。这对于Web服务器很来讲很平常,尤其有很多拨号客户时.这些half-open连接保存在 backlog connections 队列中.将这个值最少设置为8192 (缺省为1024). 即便是服务器不接收这类连接,设置这个值还能防止受到denial-of-service (syn-flood)的攻击
net.core.somaxconn:
这个参数会影响到所有AF_INET类型socket的listen队列,在高突发的请求中可能会导致链接超时或者触发重传。
  
        4、调整内核参数增大socket的缓冲区,其中有冲突默认值以tcp自己的为准;最大值冲突时,以net.core.mem_max为准
net.core.wmem_default = 2097152 #108544,系统套接字缓冲区
net.core.rmem_default = 2097152 #108544,系统套接字缓冲区
net.core.rmem_max=16777216   #131071,系统套接字缓冲区
net.core.wmem_max=16777216 #131071,系统套接字缓冲区
net.ipv4.tcp_rmem=4096 87380 16777216  #4096   87380   174760, TCP接收缓冲区
net.ipv4.tcp_wmem=4096 65536 16777216 #4096  16384   131072, TCP发送缓冲区
net.ipv4.tcp_mem = 786432 1048576 1572864 # Out of socket memory。以page为单位

    基于cpu的考虑
       1、因为每个访问都会产生一个进程,会对cpu的load造成负担,因此需要调整apache的最大允许的进程数。apache配置文件的prefork。
       2、可以隔离一个cpu处理,将apache进程绑定在单独的cpu上:
先查看隔离自己的第二颗cpu在 /boot/grup/grup.conf 中添加lsolcpus=1;重启之后,将apache绑 定在第二颗cpu上taskset2 /etc/init.d /httpd  restart
       3、如果cpu的load一直很高,就应该考虑做分发了。

    基于内存的考虑
       1、apache有很多的模块,如果这些模块都加载进来的话,会造成许多内存的浪费,因为有很多不用的模块。所以要去掉不用的模块。
       2、apache的进程数,socket套接字的数量,syn队列的长度,listen队列的长度,都会消耗内存,因此这些值的设定,要考虑内存

    基于I/0的考虑
       1、可以将apache服务单独挂在一个独立的磁盘系统上,该磁盘系统可以用多个IO同时读写,比如lvm -i ,或者是raid 0。
       2、挂在apache时可以取消写atime的功能。
       3、apache的日志功能,可以使之写入独立的日志服务器上,减少对本机的io压力。如果写入本机,可以参考上面的1,写入独立的磁盘系统中。
       4、在BI/O层使用deadline算法,减少相应的速度。
       5、可以在内存中开辟出独立的空间,当硬盘来使用,以后数据处理时都可以直接写到这里来,增加了io速度。最好将静态页面放在这里。
        mkdir -pv /tmp/mm
        mount -o size=500M -t tmpfs none /tmp/mm 
       500M 内存到这个目下,以后在对数据处理时,就相当于往内存中写,而这些数据不会因清空缓存而数据丢失,而是相当于做了一个预热(保证数据都在内存中,把内存当作硬盘来用)


    其他的一些考虑
       1、apache要开启keepalive模式,减少连接的次数。
       2、但是每增加一个连接,就会使用一个文件描述符,因此需要增加文件描述符的数量