memcache连接的数量永远不会下降,不断增长

时间:2009-11-24 04:59:01

标签: php memcached

我们为我们的Web应用程序设置了三个memcache服务器。

两个人做得很好,处理成千上万的读写操作,同时每个连接保持不超过12个连接(根据memcache-top)。

我们有第三个memcache服务器,负责存储管理客户端会话数据(使用PHPs built in memcache session handler)和一些随机应用程序数据。由于某种原因,此盒子上的连接数量永远不会下降,只会随着时间的推移而增加。例如,我们最近重新启动了服务器,一小时后memcache-top记录了~300个连接。

代码库使用持久连接和动态连接的混合,但我无法想出一个简单的例子来重新创建连接永远不会死的情况。第三个内存缓存服务器实际上托管了我们Web应用程序中活动最少的部分,正如您在memcache-top中看到的那样:

memcache-top v0.6  (default port: 11211, color: on, refresh: 3 seconds)

INSTANCE         USAGE  HIT %  CONN  TIME   EVICT/s READ/s  WRITE/s  
memcache1:11211  15.7%  83.5%    10  1.2ms      0.0  24.9K    34.5K  
memcache2:11211  15.8%  81.3%    10  1.0ms      0.0  19.1K    31.6K  
memcache3:11211  0.1%   0.0%    354  1.1ms      0.0      4      321  

AVERAGE:    10.5%  55.0%  124  1.1ms  0.0  14.7K  22.1K  

TOTAL:    0.6GB/  6.0GB    374  3.2ms  0.0  44.0K  66.4K

所以我的问题是:为什么这个memcache实例的连接永远不会死?

3 个答案:

答案 0 :(得分:4)

PHP中的持久连接将为每个apache工作进程分配一个连接。 Apache设置是否允许~354个工作进程?

答案 1 :(得分:2)

您使用的是PHP5吗?很可能是的。这是PHP session_set_save_handler documentation

可能存在的陷阱
  

从PHP 5.0.5开始编写并关闭   处理程序在对象之后调用   破坏因此无法使用   对象或抛出异常。该   然而,对象析构函数可以使用   会话。

     

可以打电话   session_write_close()来自   析构函数来解决这个鸡和   鸡蛋问题。

自从此次更改之前,还没有重新访问memcache会话处理程序,您想要多少赌注?作为解决方案或至少是诊断,我建议编写自己的memcached会话打开/关闭/读/写和销毁函数(不是对象),使用session_set_save_handler将它们连接起来并跳过使用内置的。至少你可以记录内部结构。

答案 2 :(得分:1)

您的session.gc_probability和session.gc_divisor设置为什么? 某些Linux发行版会覆盖这些值并添加一个cronjob来清除会话。您的问题可能是由此行为引起的。