0

我正在使用 Merb::Cache 来存储 txt/xml,并注意到我让我的 merb 运行的时间越长,我打开的打开 tcp 套接字的数量就越大——我相信这会导致一些主要的性能问题。

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

ETC...

我的相关代码是:

    如果 !exists?(:memcached) 那么
      register(:memcached, Merb::Cache::MemcachedStore, :namespace => 'mynamespace', :servers => ['127.0.0.1:11211'])
    结尾

&&

    什么时候:xml
      除非@hand_xml = Merb::Cache[:memcached].read("/hands/#{@hand.id}.xml")
        @hand_xml = 显示(@hand)
        Merb::Cache[:memcached].write("/hands/#{@hand.id}.xml", @hand_xml)
      结尾
      返回@hand_xml

这段代码是直接错误的还是我使用了错误版本的内存缓存?

我有 memcached 1.2.8 并具有以下内容:

libmemcached-0.25.14.tar.gz memcached-0.13.gem

这有点让我发疯..

4

2 回答 2

1

k 我想出了一些东西..

1) 假设您使用的是使用 epoll 或其他东西的库,那么将成百上千个套接字连接到 memcached 是合理的——但是,如果您像我一样使用 ruby​​,我不知道使用某些东西的库除了 select() 或 poll() - 因此这会引发这个问题/想要立即退出

2)如果你像我一样,你现在只有 1 个 memcached 服务器在运行,并且有几个 mongrels/thins 在运行以处理请求。因此你的 memcache 连接应该有问题。不超过你运行的杂种/瘦的数量(假设你只缓存 1 或两组东西)——这是我的情况

这是修复:

通过 memcached gem 而不是 merb::cache 设置 memcache(它实际上包装了您正在使用的任何 memcache lib

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

获取/设置您的值:

  @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 的东西!

礁的道具让我知道,memcache 连接从一开始就保持持久性并不少见

于 2009-05-12T19:13:22.207 回答
0

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

曾几何时,有一个由 10 个 apache(ssl) 服务器组成的集群,每个服务器配置为正好有 100 个线程。还有一个由 10 个 memcached 服务器组成的集群(在同一个盒子上),它们似乎都过着平静的生活。apache 和 memcached 都受到邪恶的monit 守护进程的保护。

然后 King 安装了第 11 个 apache(ssl) 服务器,memcached 每隔几个小时就开始随机重启!国王开始调查,他发现了什么?php memcache 模块文档中有一个错误,说 memcache 连接对象的默认构造函数不是持久的,但显然它是。发生的事情是,每个 php 线程(大约有 1000 个)在需要时打开了与池中每个 memcached 的连接,并且它持有它。每个 memcached 服务器有 10*100 个连接,这很好,但是对于 11 个服务器,它是 1100,并且 1024<1100。memcached 的最大打开套接字数为 1024。当所有套接字都被占用时,monit 守护进程无法连接,因此他重新启动了 memcached。

每个故事都必须有道德。那么,国王对这一切做了什么?他禁用了持久连接,他们从此过上了幸福的生活,集群上的连接数达到了 5(五个)的峰值。这些服务器正在处理大量数据,所以我们不能有 1000 个备用套接字,而且在每个请求上协商 memcache 连接更便宜。

很抱歉,但我不知道 ruby​​,看起来你有大量线程,或者你缓存错误。

祝你好运!

于 2009-05-11T23:21:19.547 回答