[关闭]
@cdmonkey 2015-07-13T09:32:45.000000Z 字数 3273 阅读 1378

内核参数调优

操作系统


相关资料:http://yangrong.blog.51cto.com/6945369/1321594

一、常规调优

提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器。但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题。要提高系统的负载能力,可以使用Nginx等原生并发处理能力就很强的软件,如果使用Apache的可以启用其Worker模式,来提高其并发处理能力。除此之外,在考虑节省成本的情况下,可以修改系统的内核相关TCP参数,来最大的提高服务器性能。当然,最根本的提高负载问题,还是升级服务器硬件了,这是最根本的。

  1. cat >> /etc/sysctl.conf << EOF
  2. net.ipv4.tcp_fin_timeout = 2
  3. net.ipv4.tcp_tw_reuse = 1
  4. net.ipv4.tcp_tw_recycle = 1
  5. net.ipv4.tcp_syncookies = 1
  6. net.ipv4.tcp_keepalive_time = 300
  7. net.ipv4.ip_local_port_range = 4000 65000
  8. net.ipv4.tcp_max_syn_backlog = 16384
  9. net.ipv4.tcp_max_tw_buckets = 36000
  10. net.ipv4.route.gc_timeout = 100
  11. net.ipv4.tcp_syn_retries = 1
  12. net.ipv4.tcp_synack_retries = 1
  13. net.core.somaxconn = 16384
  14. net.core.netdev_max_backlog = 16384
  15. net.ipv4.tcp_max_orphans = 16384
  16. EOF
  17. -------------------
  18. #配置生效:
  19. sysctl -p

有时候会出现下面的报错信息:

  1. error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
  2. error: "net.bridge.bridge-nf-call-iptables" is an unknown key
  3. error: "net.bridge.bridge-nf-call-arptables" is an unknown key
  4. -------------------
  5. #解决方法如下:
  6. [root@nagios-new ~]# modprobe bridge
  7. [root@nagios-new ~]# lsmod |grep bridge
  8. bridge 83177 0
  9. stp 2218 1 bridge
  10. llc 5546 2 bridge,stp

下面是网上找到的一个调优方案:

  1. net.ipv4.ip_forward = 0
  2. net.ipv4.conf.default.rp_filter = 1
  3. net.ipv4.conf.default.accept_source_route = 0
  4. kernel.sysrq = 0
  5. kernel.core_uses_pid = 1
  6. net.ipv4.tcp_syncookies = 1
  7. net.bridge.bridge-nf-call-ip6tables = 0
  8. net.bridge.bridge-nf-call-iptables = 0
  9. net.bridge.bridge-nf-call-arptables = 0
  10. kernel.msgmnb = 65536
  11. kernel.msgmax = 65536
  12. kernel.shmmax = 68719476736
  13. kernel.shmall = 4294967296
  14. #以上的内容是系统默认存在的。
  15. net.ipv4.tcp_max_tw_buckets = 6000
  16. net.ipv4.tcp_sack = 1
  17. net.ipv4.tcp_window_scaling = 1
  18. net.ipv4.tcp_wmem = 8192 4336600 873200
  19. net.ipv4.tcp_rmem = 32768 4336600 873200
  20. net.core.wmem_default = 8388608
  21. net.core.rmem_default = 8388608
  22. net.core.rmem_max = 16777216
  23. net.core.wmem_max = 16777216
  24. net.core.netdev_max_backlog = 262144
  25. net.core.somaxconn = 262144
  26. net.ipv4.tcp_max_orphans = 3276800
  27. net.ipv4.tcp_max_syn_backlog = 262144
  28. net.ipv4.tcp_timestamps = 1
  29. net.ipv4.tcp_synack_retries = 1
  30. net.ipv4.tcp_syn_retries = 1
  31. net.ipv4.tcp_tw_recycle = 1
  32. net.ipv4.tcp_tw_reuse = 1
  33. net.ipv4.tcp_mem = 786432 1048576 1572864
  34. net.ipv4.tcp_fin_timeout = 30
  35. net.ipv4.tcp_keepalive_time = 300
  36. net.ipv4.ip_local_port_range = 1024 65000

TIME_WAIT

正常情况下,TCP连接断开后,会以“TIME_WAIT”状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的这样的等待状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将该状态的端口清理掉。

出现“TIME_WAIT”意味着你的程序时常有主动关闭连接的行为,属于正常行为,可以设置地址可重用。

如果系统存在大量“TIME_WAIT”状态的连接,可以通过调整内核参数解决:

  1. #连接服务器查看连接数的时候提示如下:
  2. [root@WEB-A1 ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  3. TIME_WAIT 14434
  4. FIN_WAIT2 6
  5. ESTABLISHED 133
  1. vi /etc/sysctl.conf
  2. #加入以下内容:
  3. net.ipv4.tcp_syncookies = 1
  4. net.ipv4.tcp_tw_reuse = 1
  5. net.ipv4.tcp_tw_recycle = 1
  6. net.ipv4.tcp_fin_timeout = 30
  7. -----------------
  8. #使参数生效:
  9. sysctl -p

问题就可以解决了。在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的拒绝服务攻击及SYN攻击。

此处输入图片的描述

CLOSE_WAIT

服务器出现“CLOSE_WAIT”意味着客户端主动发起“FIN”来关闭连接,你收到对方主动发起的“FIN”之后没有关闭描述符,也就是说你自己没有给对方发送“FIN”,对方处于“FIN_WAIT_2”状态,TCP连接的“四次挥手”关闭流程没有顺利进行下去,这种情况很有可能是程序BUG或者异常导致,

传输控制协议(TCP)是面向连接的,在实际应用中通常都需要检测连接是否还可用,如果不可用,可分为:

该协议栈有个“keepalive”的属性,可以主动探测套接字(socket)是否可用,不过这个属性的默认值很大。

  1. net.ipv4.tcp_keepalive_intvl = 20 #No longer exists in Centos 6.x
  2. net.ipv4.tcp_keepalive_probes = 3 #No longer exists in Centos 6.x
  3. net.ipv4.tcp_keepalive_time = 60

长连接和短连接

http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注