高并发web系统性能优化

一、sysctl优化
#ipv4net.ipv4.ip_forward **= 0**net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_retries2 = 5net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 10net.ipv4.tcp_keepalive_time = 1800net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_keepalive_intvl =15net.ipv4.tcp_max_tw_buckets = 36000net.ipv4.tcp_max_orphans = 32768net.ipv4.tcp_syncookies = 1net.ipv4.tcp_max_syn_backlog = 16384net.ipv4.tcp_wmem = 8192 131072 16777216net.ipv4.tcp_rmem = 32768 131072 16777216net.ipv4.tcp_mem = 786432 1048576 1572864net.ipv4.ip_local_port_range = 1024 65000net.ipv4.ip_conntrack_max = 65536net.ipv4.netfilter.ip_conntrack_max=65536net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180#优化套接字缓冲区net.core.rmem_default = 212992net.core.rmem_max = 212992net.core.wmem_default = 212992net.core.wmem_max = 212992net.core.somaxconn = 16384net.core.netdev_max_backlog = 16384#打开的文件句柄fs.file-max=34166下列文件所在目录:/proc/sys/net/ipv4/
名称
默认值
建议值
描述
tcp_syn_retries
5
5
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃 。不应该大于255,默认值是5,对应于180秒左右时间 。。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1决定的)
tcp_synack_retries
5
1
对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包 。这是所谓的三次握手( threeway handshake)机制的第二个步骤 。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目 。不应该大于255,默认值是5,对应于180秒左右时间 。
tcp_keepalive_time
7200
1800
TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效 。防止两边建立连接但不发送数据的攻击 。
tcp_keepalive_probes
9
3
TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效 。
tcp_keepalive_intvl
75
15
探测消息未获得响应时,重发该消息的间隔时间(秒) 。默认值为75秒 。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)
tcp_retries1
3
3
放弃回应一个TCP连接请求前﹐需要进行多少次重试 。RFC 规定最低的数值是3
tcp_retries2
15
5
在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试 。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)
tcp_orphan_retries
7
3
在近端丢弃TCP连接之前﹐要进行多少次重试 。默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定 。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源 。另外参的考tcp_max_orphans 。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为3)
tcp_fin_timeout
60
10
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间 。对方可能会断开连接或一直不结束连接或不可预料的进程死亡 。默认值为 60 秒 。
tcp_max_tw_buckets
180000
36000
系统在同时所处理的最大 timewait sockets 数目 。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息 。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存) 。(事实上做NAT的时候最好可以适当地增加该值)
tcp_tw_recycle
0
1
打开快速 TIME-WAIT sockets 回收 。除非得到技术专家的建议或要求﹐请不要随意修改这个值 。(做NAT的时候,建议打开它)
tcp_tw_reuse
0
1
表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)
tcp_max_orphans
8192
32768
系统所能处理不属于任何进程的TCP sockets最大数量 。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息 。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制 。如果内存大更应该增加这个值 。(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)


推荐阅读