代码之家  ›  专栏  ›  技术社区  ›  davetron5000

memcache连接的数量从未下降,而且还在不断增长

  •  9
  • davetron5000  · 技术社区  · 15 年前

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

    其中两个都做得很好,可以处理数万个读写操作,同时每个连接都不超过12个(根据 memcache-top ).

    我们有第三个memcache服务器,它负责存储管理客户端会话数据(使用 PHPs built in memcache session handler )以及一些随机的应用数据。由于某些原因,这个盒子上的连接数永远不会减少,只会随着时间的推移而增加。例如,我们最近重启了服务器,一小时后memcache最多记录了300个连接。

    代码库混合使用了持久连接和动态连接,但是我无法想出一个简单的例子来重现连接永不消亡的情况。第三个memcache服务器实际上承载了web应用程序中最不活跃的部分,从memcache顶部可以看到:

    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 回复  |  直到 15 年前
        1
  •  4
  •   Richard Levasseur    15 年前

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

        2
  •  2
  •   Barnabas Kendall    15 年前

    你在用PHP5吗?很可能是的。这里有一个可能的陷阱 PHP session_set_save_handler documentation

    在对象之后调用处理程序 对象或引发异常。这个 但是,对象析构函数可以使用 会议。

    会话\u write_close()来自 破坏者来解决这只鸡和 鸡蛋问题。

    您认为memcache会话处理程序在这次更改之前没有被重新访问过吗?作为一种解决方案或至少是诊断方法,我建议您编写自己的memcached session open/close/read/write和destroy函数(而不是object),将它们与session_set_save_处理程序连接起来,并跳过使用内置的函数。至少你可以记录下内部情况。

        3
  •  1
  •   davetron5000    15 年前

    一些Linux发行版覆盖这些值并添加cronjob来清除会话。你的问题可能是由这种行为引起的。