数以百计/千TCP套接字的合理使用memcached的?
-
21-08-2019 - |
题
我使用的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个备用插座,这是更便宜的谈判在每次请求的内存缓存的连接。
我很抱歉,但我不知道红宝石,它看起来像你有线程的一个可怕的量或者你正在缓存是错误的。
祝你好运!