使用活动会话的Memcached重启会导致请求挂起30-40秒,会话被终止


memcached restart with active sessions causes request to hang for 30-40 seconds and session is killed

我正在使用php会话对memcached进行一些测试。

以下步骤会导致问题。

  1. 开始memcache
  2. 登录创建会话的应用程序
  3. 重启memcache
  4. 尝试导航到另一个页面
  5. 浏览器挂起30秒并注销
  6. 再次登录后的请求需要30秒,但可以工作。随机停止30秒执行动作并恢复到正常速度

这种奇怪行为的原因是什么

有时我得到以下错误:

遇到PHP错误

严重性:警告

消息:Unknown: Failed to write session data (memcache)。请验证当前会话设置是否正确。Save_path正确(tcp://10.181.16.192:11211?persistent=1&weight=1&timeout=1&retry_interval=15)

文件名:未知

行号:0

编辑:

如果我重新启动memcache然后apache,问题不会发生

我注意到TCP连接在重新启动memcached时更改为CLOSE_WAIT。

但是如果我重新启动memcache和apache背靠背没有延迟,然后它解决了问题。

似乎在php处理连接到memcache的方式中存在某种错误,它不再识别连接是否有效,并导致上述问题。

[root@php-pos-web ~]# netstat -natp | grep '11211'

tcp        1      0 10.181.16.33:58722          10.181.16.192:11211         CLOSE_WAIT  7574/httpd          
tcp      205      0 10.181.16.33:58753          10.181.16.192:11211         ESTABLISHED 7583/httpd          
tcp        1      0 10.181.16.33:58745          10.181.16.192:11211         CLOSE_WAIT  7578/httpd          
tcp        1      0 10.181.16.33:58749          10.181.16.192:11211         CLOSE_WAIT  7573/httpd          

在3.0.4的memcache pecl扩展中有一个bug。这在最新的稳定版本(2.2.7)中不会发生。我已经向团队报告了这个bug。我认为这与会话锁定有关。在memcached扩展中不会出现此错误。