我使用的Merb ::缓存用于存储TXT / XML和已经注意到了,不再是我离开我的merbs运行较大的开放TCP套接字的量我已经打开 - 我相信这是造成一些重大的性能问题。

lsof | grep 11211 | wc -l
494
merb      27206       root   71u     IPv4   13759908                 TCP localhost.localdomain:59756->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   72u     IPv4   13759969                 TCP localhost.localdomain:59779->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   73u     IPv4   13760039                 TCP localhost.localdomain:59805->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   74u     IPv4   13760052                 TCP localhost.localdomain:59810->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   75u     IPv4   13760135                 TCP localhost.localdomain:59841->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   76u     IPv4   13760823                 TCP localhost.localdomain:59866->localhost.localdomain:11211 (ESTABLISHED)
merb      27206       root   77u     IPv4   13760951                 TCP localhost.localdomain:52095->localhost.localdomain:11211 (ESTABLISHED)

等...

我的相关代码是:

    if !exists?(:memcached) then
      register(:memcached, Merb::Cache::MemcachedStore, :namespace => 'mynamespace', :servers => ['127.0.0.1:11211'])
    end

&&

    when :xml
      unless @hand_xml = Merb::Cache[:memcached].read("/hands/#{@hand.id}.xml")
        @hand_xml = display(@hand)
        Merb::Cache[:memcached].write("/hands/#{@hand.id}.xml", @hand_xml)
      end
      return @hand_xml

是这样的代码直出错误或我使用内存缓存的版本错误??

我的memcached 1.2.8 和有以下几点:

libmemcached-0.25.14.tar.gz 分布式缓存-0.13.gem

这是一种快把我逼疯了的..

有帮助吗?

解决方案

K I想出一些东西..

1),它可以是合理的有数百/千连接到memcached的假设你使用了利用epoll的还是其他什么东西图书馆插座 - 但是,如果您使用的红宝石喜欢我,我不知道一个lib的利用东西比其他选择()或poll() - 因此这个打击这个问题/立刻想出来的。

2)如果你像我一样,你只有现在正在运行1个memcached服务器和几个杂种的/变薄跑来跑去取requests..therefore你的内存缓存的连接应概率的照顾。不大于杂种的数量更多/变薄已运行(假定仅缓存1组或两组的东西) - 这是我的情况

这里的修复:

通过memcached的宝石,而不是Merb的缓存:: memcache的设置(LIB您正在使用的实际包装任何内存缓存

MMCACHE = Memcached.new("localhost:11211")

get / set方法的值:

  @cache = MMCACHE.clone
  begin
    @hand_xml = @cache.get("/hands/#{@hand.id}.xml")
  rescue
    @hand_xml = display(@hand)
    @cache.set("/hands/#{@hand.id}.xml", @hand_xml)
  end
  @cache.quit

坐下来,喝,现在感冒的原因之一,当你做到这一点:

lsof | grep 11211 | wc -l

您看到类似2或3,而不是2036!

道具收帆以在对着我诉说什么,它的情况并不少见内存缓存的连接是持久的开始与

其他提示

我也许可以帮助,但我需要讲一个故事来做到这一点。这

从前一次有10阿帕奇的集群(SSL)服务器构造成具有每个正好100个线程。此外,还为10台分布式缓存服务器(在同一个盒子)集群,它们都似乎的和平共处。无论Apache的与分布式缓存的被邪恶的 monit的守护进程守护着。

于是王安装了11阿帕奇(SSL)的服务器和分布式缓存的开始随机重新启动每隔几个小时!国王开始调查,并没有什么他发现?有PHP的内存缓存模块文档,所述该内存缓存连接对象的默认构造是一个错误的持久的,但显然它是。实际情况是,每个PHP线程(并有像他们一样的1000),打开每一个在游泳池memcached的时候,他需要一个连接,并举行了它。有10个* 100连接到每一个memcached服务器,这是好的,但有11台服务器,它是1100和1024 <1100。开放式插座的memcached的最大数量为1024时拍摄的所有套接字,monit的守护进程无法连接,所以他重新启动分布式缓存。

每一个故事都必须有道德。那么,是什么,王都做了这一切?他禁用持久连接,他们都永远幸福地生活在一起,对集群峰值连接数在5(五)。这些服务器都提供数据服务的hudge量,所以我们不能有1000个备用插座,这是更便宜的谈判在每次请求的内存缓存的连接。

我很抱歉,但我不知道红宝石,它看起来像你有线程的一个可怕的量或者你正在缓存是错误的。

祝你好运!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top