由网络副手--寻路人于2017.05.23 23:22:00发布在PHP代码 问答升级中Memcached长连接的优化 阅读4230 评论2 喜欢1 场景: 今天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 了啊. 默认用的短连接.难道真是这样? 瞬间打开代码验证下猜测,我勒个擦,果然没错. 上手改代码吧. 下面把官方文档的一段代码黏贴过来. 开启长连接 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来看效果. 赞 1 分享 赏 您可以选择一种方式赞助本站 支付宝扫码赞助 BraveDu 署名: 网络副手~寻路人
兄弟, 这篇文章不错. 之前我也是以为ESTABLISHED连接只有一个. 但测试时偶尔发现 ESTABLISHED连接数 = fpm数量才恍然大悟
哎,多说评论挂了,只能使用默认的了.