场景:
今天PM过来反馈问答网站打开非常缓慢,瞬间打开网站访问以下,发现果真比较慢,立即排查.
1.看整体网络流量
2.抽查局部服务器查看负载.
3.查看服务TCP连接.
通过排查发现Memcached服务器占用资源过高.

netstat nlp | grep 端口 ,大量Time Wait.
有TIME WAIT 并不可怕,分析是什么环节导致的. 可重复利用TPC便可重复利用,如果实在解决不了也只有分担流量了.
接下来看下导致这个问题的罪魁祸首有多少量.

netstat -n | grep 端口 | awk '/^tcp/ {++Nums[$NF]} END {for(i in Nums) print $i,Nums[i]}'

统计出来吓一跳啊。 9万多.
按理说次端口是Memcache用的,Memcache端口用的是长连接,怎么会出现这么多Time Wait呢 ?

哈哈,问题出来了.
前提是 Memcache 是用的长连接,但是升级后为了响应PHP7 都更换成Memcached 了啊. 默认用的短连接.难道真是这样?
瞬间打开代码验证下猜测,我勒个擦,果然没错. 上手改代码吧. 下面把官方文档的一段代码黏贴过来.
开启长连接

<?php
$mcConf = array(
        array('mc1.example.com',11211),
        array('mc2.example.com',11211),
);
$persistent_id = md5(serialize($mcConf));
$mc = new Memcached($persistent_id);
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
if (!count($mc->getServerList())) {
    $mc->addServers($mcConf);
}
?>

以上的一段实例化代码变可以实现开启长连接了,主要就是通过一个在实例化的时候的句柄,同时在追加服务器进入链接池的时候做个判断,判断是否连接池有存在,如果存在则不追加,否则即使开启了长连接,依然会开启多个长连接,而没法复用.

注意:
这里有要说的大家不要走入一个误区. 容易理解成长连接就是一个IP在持续访问时 ESTABLISHED 数量永远是1。此处取决于php-fpm的数量(前提是$persistent_id 不变的情况下),如果PHP-FPM为150个,那么一个用户持续刷新访问的时候, ESTABLISHED 会持续加,但是不会超过150. 各位不要看到此处ESTABLISHED 增加,就果断认为长连接无效,想验证明显效果的小伙伴,可以开启一个 PHP-FPM来看效果.