@cdmonkey
2015-07-13T17:32:45.000000Z
字数 3273
阅读 1474
操作系统
相关资料:http://yangrong.blog.51cto.com/6945369/1321594
提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器。但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题。要提高系统的负载能力,可以使用Nginx等原生并发处理能力就很强的软件,如果使用Apache的可以启用其Worker模式,来提高其并发处理能力。除此之外,在考虑节省成本的情况下,可以修改系统的内核相关TCP参数,来最大的提高服务器性能。当然,最根本的提高负载问题,还是升级服务器硬件了,这是最根本的。
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 300
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
EOF
-------------------
#配置生效:
sysctl -p
有时候会出现下面的报错信息:
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
-------------------
#解决方法如下:
[root@nagios-new ~]# modprobe bridge
[root@nagios-new ~]# lsmod |grep bridge
bridge 83177 0
stp 2218 1 bridge
llc 5546 2 bridge,stp
下面是网上找到的一个调优方案:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
#以上的内容是系统默认存在的。
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 8192 4336600 873200
net.ipv4.tcp_rmem = 32768 4336600 873200
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.ip_local_port_range = 1024 65000
正常情况下,TCP连接断开后,会以“TIME_WAIT”状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的这样的等待状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将该状态的端口清理掉。
出现“TIME_WAIT”意味着你的程序时常有主动关闭连接的行为,属于正常行为,可以设置地址可重用。
如果系统存在大量“TIME_WAIT”状态的连接,可以通过调整内核参数解决:
#连接服务器查看连接数的时候提示如下:
[root@WEB-A1 ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 14434
FIN_WAIT2 6
ESTABLISHED 133
vi /etc/sysctl.conf
#加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
-----------------
#使参数生效:
sysctl -p
问题就可以解决了。在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的拒绝服务攻击及SYN
攻击。
服务器出现“CLOSE_WAIT”意味着客户端主动发起“FIN”来关闭连接,你收到对方主动发起的“FIN”之后没有关闭描述符,也就是说你自己没有给对方发送“FIN”,对方处于“FIN_WAIT_2”状态,TCP连接的“四次挥手”关闭流程没有顺利进行下去,这种情况很有可能是程序BUG或者异常导致,
传输控制协议(TCP)是面向连接的,在实际应用中通常都需要检测连接是否还可用,如果不可用,可分为:
该协议栈有个“keepalive”的属性,可以主动探测套接字(socket)是否可用,不过这个属性的默认值很大。
net.ipv4.tcp_keepalive_intvl = 20 #No longer exists in Centos 6.x
net.ipv4.tcp_keepalive_probes = 3 #No longer exists in Centos 6.x
net.ipv4.tcp_keepalive_time = 60
http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html