设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] memcached 服务端异常分析

[复制链接]

尚未签到

发表于 2018-12-24 12:21:27 | 显示全部楼层 |阅读模式
  memcached 服务端异常分析
  
  客户端连接memcached 几种状态:
1、正常
2、机器活着,进程不存在
3、进程在,但防火墙禁止了
4、进程在,已经死了,不能连接

各种状态的表现


1、正常

  •   root@kickseed:/data/# telnet 172.19.103.15 11212

  •   Trying 172.19.103.15...

  •   Connected to 172.19.103.15.

  •   Escape character is '^]'.

  •   


复制代码
2、机器活着,进程不存在:

  •   root@kickseed:/data/# telnet 172.19.103.15 11212

  •   Trying 172.19.103.15...

  •   telnet: Unable to connect to remote host: Connection refused

复制代码
3、进程在,但防火墙禁止了.或者机器死机了

  •   root@kickseed:/data/# telnet 172.19.103.15 11212

  •   Trying 172.19.103.15...

  •   


复制代码
4、进程还在,但已经死了,不能连接了

  •   root@kickseed:/data/# telnet 172.19.103.15 11212

  •   Trying 172.19.103.15...

复制代码
3,4是一样的,下面按一种情况测试



看看各种情况花的时间
正常情况下做addServer,set,get操作:

  •   addServer:spendtime is : 0.00025701522827148

  •   set:spendtime is : 0.00028610229492188

  •   get:spendtime is : 0.00026392936706543

  •   string(1) "1"

  •   


复制代码
memcached机器能连接,但是memcached进程不在的情况

  •   addServer:spendtime is : 0.00055599212646484

  •   set:spendtime is : 0.0005800724029541

  •   get:spendtime is : 3.6954879760742E-5

  •   bool(false)

复制代码
各个时间比正常情况多一倍左右,也都能接受




分析一下"进程在,但是不能连接"的情况,这种最多(iptables封掉,模拟机器死机或进程还在但连接不上的情况)

  •   addServer:spendtime is : 4.0041761398315

  •   set:spendtime is : 8.0083198547363

  •   get:spendtime is : 4.6968460083008E-5

  •   bool(false)  

  •   


复制代码
可以看出,addServer花了很长时间,set花了很长时间;get时间很短就返回了
说明addServer时也是会连接服务器,set get都会连接服务器




所以网络连接问题或服务器死掉会导致502问题,单纯memcached进程挂掉只会导致获取不到数据




我是分割线=====================================================





返回值和超时时间分析

对方机器活着,进程不存在

  •   addServer:spendtime is : 0.00033211708068848

  •   bool(true)

  •   array ( 0 => array ( 'host' => '172.19.103.15', 'port' => 11212, 'weight' => 1, ), )

  •   set:spendtime is : 0.00057196617126465

  •   bool(false)

  •   get:spendtime is : 2.7894973754883E-5

  •   bool(false)

复制代码
addServer成功,get和set都是失败的,但不会超时失败,不会导致业务502。


死机或进程还在但连接不上的情况,且不设置超时时间

  •   addServer: spendtime is : 4.0005769729614

  •   bool(true)

  •   array ( 0 => array ( 'host' => '172.19.103.15', 'port' => 11212, 'weight' => 1, ), )

  •   set: spendtime is : 8.0083749294281

  •   bool(false)

  •   get: spendtime is : 4.1007995605469E-5

  •   bool(false)

复制代码
死机或进程还在但连接不上的情况,但设置了超时时间200毫秒

  •   $m->setOption(Memcached::OPT_CONNECT_TIMEOUT,200);

  •   $m->setOption(Memcached::OPT_RETRY_TIMEOUT,200);

  •   $m->setOption(Memcached::OPT_POLL_TIMEOUT,200);

复制代码

  •   

  •   addServer: spendtime is : 0.20040106773376

  •   bool(true)

  •   array ( 0 => array ( 'host' => '172.19.103.15', 'port' => 11212, 'weight' => 1, ), )

  •   set: spendtime is : 0.40070199966431

  •   bool(false)

  •   get: spendtime is : 3.8862228393555E-5

  •   bool(false)

  •   


复制代码

可以看出addServer都是成功的,set超时后返回false,get超时返回false

时间也分别是0.2 和 0.4 0.00038 。addServer和set时间基本等于超时时间和超时时间的2倍


默认超时时间
超时时间的默认值:
var_dump($m->getOption(Memcached::OPT_CONNECT_TIMEOUT));
var_dump($m->getOption(Memcached::OPT_RETRY_TIMEOUT));
var_dump($m->getOption(Memcached::OPT_SEND_TIMEOUT));
var_dump($m->getOption(Memcached::OPT_RECV_TIMEOUT));
var_dump($m->getOption(Memcached::OPT_RETRY_TIMEOUT));


result:
int(4000)
int(2)
int(0)
int(0)
int(5000)


而不是手册上写的(估计是版本问题,我测试的memcached extension版本是2.0.1):
1000
0
0
0
1000

实际观察来看,OPT_CONNECT_TIMEOUT默认值不是手册上写的1000毫秒,而是4000毫秒。手册有时也不可靠啊


阻塞模式和非阻塞模式


$m->setOption(Memcached::OPT_SEND_TIMEOUT,300);
$m->setOption(Memcached::OPT_RECV_TIMEOUT,300);

这两个超时设置在阻塞模式下才有意义,我们只用非阻塞模式


结论:
1、进程死了会导致获取不到数据,但不至于连接很长时间不返还
2、最坏的情况是机器死了。为了防止机器挂掉的情况,一定要设置超时时间。
Memcached::OPT_CONNECT_TIMEOUT非常重要,有直接影响。OPT_RETRY_TIMEOUT和OPT_POLL_TIMEOUT还没发现做什么用。
3、看上面的spend time 可以看出,addServer等于OPT_CONNECT_TIMEOUT,set的时间等于OPT_CONNECT_TIMEOUT*2,get是非阻塞,所以可以忽略时间
  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655287-1-1.html 上篇帖子: LEMP+memcached 下篇帖子: Centos 7.2 编译安装memcached
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表