2009-11-24 49 views
9

我们为我们的Web应用程序设置了三个memcache服务器。内存缓存连接数永不丢失,持续增长

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

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

代码库使用持久连接和动态连接的混合,但我一直无法想出一个简单的例子来重新创建连接永远不会死的情况。这第三个内存缓存服务器实际上承载我们的web应用程序的最不活跃的部分,你可以从内存缓存,最高见:

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 

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

+1

Q1。那第三个“麻烦”的服务器碰巧是* BSD,而那些2个“好”的服务器 - Linux? Q2。所有3个memcache的CPU使用率是多少? – chronos 2009-12-03 14:26:49

回答

4

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

1

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

2

您使用的是PHP5吗?很可能是的。下面是来自PHP session_set_save_handler documentation可能的陷阱:

由于PHP 5.0.5的写入和关闭 处理程序对象 破坏后调用,因此不能使用 对象或抛出异常。对象析构函数可以使用 会话。

有可能调用 session_write_close()从 析构函数来解决这个鸡蛋问题和 鸡蛋问题。

你有多想打赌内存缓存的会话处理器还没有被此更改之前重新审视?作为一个解决方案或至少是诊断,我建议编写自己的memcached会话open/close/read/write并销毁函数(不是对象),用session_set_save_handler挂接它们并跳过使用内置函数。至少你可以记录内部信息。

+0

作为记录/调试您的自定义会话处理程序的旁注 - 您需要沿着** file_put_contents()**的行使用某些内容,因为write()方法在内容刷新到页面后发生。 – 2009-12-07 18:01:47