Разумны ли сотни / тысячи сокетов TCP с memcached?

Я использую Merb :: Cache для хранения 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

этот код прямо неправильный, или я использую неправильную версию memcache ??

У меня memcached 1.2.8 и есть следующее:

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

это вроде сводит меня с ума ..


person eyberg    schedule 11.05.2009    source источник
comment
Я чертовски уверен, что ответ на этот вопрос - большой жирный нет, поскольку существуют жесткие ограничения на количество сокетов, которые вы можете иметь.   -  person eyberg    schedule 12.05.2009


Ответы (2)


k Я кое-что понял ..

1) МОЖЕТ быть разумным иметь сотни / тысячи сокетов, подключенных к memcached, если вы используете библиотеку, которая использует epoll или что-то еще - однако, если вы используете ruby, как я, я не знаю о библиотеке, которая что-то использует иначе, чем select () или poll () - поэтому этот вопрос / запрос немедленно отменяется.

2) если вы похожи на меня, у вас сейчас работает только 1 сервер memcached и пара ублюдков / тонких людей, которые заботятся о запросах ... поэтому ваши соединения с кэшем памяти должны быть проблемными. быть не больше, чем количество запущенных вами дворняжек / худых (при условии, что вы кэшируете только 1 или два набора вещей) - что было в моем случае

вот исправление:

настроить memcache через memcached gem, а не через merb :: cache (который фактически обертывает любую библиотеку memcache, которую вы используете

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!

props to reef за то, что подсказал мне, что соединения кэша памяти с самого начала могут быть постоянными

person eyberg    schedule 12.05.2009

Возможно, я смогу помочь, но для этого мне нужно рассказать историю. Вот.

Когда-то был кластер из 10 серверов apache (ssl), сконфигурированных так, чтобы каждый имел ровно 100 потоков. Также был кластер из 10 серверов memcached (на одних и тех же ящиках), и все они казалось жили мирно. И apache, и memcached охранялись злобным демоном monit.

Затем Король установил 11-й сервер apache (ssl), и memcached начал случайным образом перезапускаться каждые несколько часов! Король начал расследование и что он нашел? В документации модуля php memcache была ошибка, в которой говорилось, что конструктор по умолчанию для объекта подключения memcache не постоянный, но, видимо, так и было. Случилось так, что каждый поток php (а их было около 1000) открывал соединение с каждым memcached в пуле, когда он нуждался в нем, и оно его удерживало. Было 10 * 100 подключений к каждому серверу memcached, и это было нормально, но с 11 серверами это было 1100 и как 1024 ‹1100. Максимальное количество открытых сокетов для memcached было 1024. Когда все сокеты были заняты, демон monit не смог подключиться, поэтому он перезапустил memcached.

В каждой истории должна быть мораль. Итак, что король со всем этим сделал? Он отключил постоянные соединения, и все они жили долго и счастливо, число соединений в кластере достигло 5 (пяти). Эти серверы обслуживали огромное количество данных, поэтому у нас не могло быть 1000 запасных сокетов, и было дешевле согласовывать соединение кэша памяти при каждом запросе.

Извините, но я не знаю Ruby, похоже, у вас было ужасное количество потоков или вы неправильно кешировали его.

Удачи!

person Paweł Polewicz    schedule 11.05.2009
comment
ну, я думаю, что merb :: cache - это двойная проблема - у меня сейчас работает только 1 сервер memcached, и у нас есть 5 мербов (каждый обрабатывает по 1 соединению, afaik) - это, конечно, постоянное, но я думаю, что открывает больше чем это должно начинаться с ... например, у нас должно быть не более 5 потоков, верно ?? - person eyberg; 12.05.2009