昨天在完成老总交代的任务之后交给他一个推广连接。万没成想这连接在微信上还没怎么推,访问速度就已经秒崩。赶紧调取服务器监控才发现tcp连接存在着大量的假死链接在耗费服务器资源。其中ESTABLISHED居然高居在10000左右不下。这么多的假死连接都是客户端不正常的断链产生的。难怪服务器的配置那么高。访问速度还是崩了。作为程序开发者来讲,你当然不能要求客户端访问者做什么。这就是作为程序员的一种无奈吧。后来思来想去找到了一种解决思路。应该可以杜绝这种糟糕的情况再次发生。(tips:ecs服务器通常是不存在心跳机制的。所以它无法判断面对客户端发来的众多连接当中有没有在中途由于访问者再客户端发起的由不正常的关闭而造成的死链接。只会正常的与每个客户端连接进行四次握手之后断掉。所以对于客户端产生的各种tcp链接的响应机制还是需要做一番处理的。其实现的思路大概是让连接大概10s-20s中得不到服务器反应的连接立刻死掉,不再让它不断地与服务器进行四次正常握手而彻底与服务器端断开连接。这样就保证了服务器的正常资源不会分配在不良的客户端连接上。)
所谓Linux服务器内核参数优化(适合Apache、Nginx、Squid等多种web应用,特殊的业务有可能需要做略微调整),主要是指在Linux系统中针对业务服务应用而进行的系统内核参数调整,优化并无一定的标准。下面是生产环境下Linux常见的内核优化为例子进行说明,供大家参考。
优化的方法是执行vim /etc/sysctl.conf命令到文件结尾,然后拷贝如下内容并保存。之后记得重启服务器以使服务器系统配置生效。
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ivp4.tcp_tw_recycle = 1
net.ivp4.tcp_syncookies = 1
net.ivp4.tcp_keepalive_time = 600
net.ivp4.ip_local_port_range = 4000 65000
net.ivp4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ivp4.route.gc_timeout = 100
net.ivp4.tcp_syn_retries = 1
net.ivp4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ivp4.tcp_max_orphans = 16384
#以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
将上面的内核参数加入/etc/sysctl.conf文件中,然后执行如下命令使之生效:
如果是在Centos6环境中,必须开启iptables服务才不会出现上面显示的报错,其实报错也可以暂时不理,这时针对防火墙的优化,而此时防火墙并没有开启,将来开启就没问题了。
sysctl.conf内核文件中的参数含义见表1 。
表1: