|
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是非阻塞,所以可以忽略时间
|
|
|