Являются ли сотни / тысячи сокетов tcp разумными с memcached? - PullRequest
0 голосов
/ 11 мая 2009

Я использую Merb :: Cache для хранения txt / xml и заметил, что чем дольше я оставляю свои слияния работающими, тем больше у меня открытых открытых сокетов 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

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

Ответы [ 2 ]

1 голос
/ 12 мая 2009

k Я разобрался с некоторыми вещами ..

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

2) если вы похожи на меня, у вас есть только 1 сервер memcached, работающий прямо сейчас, и пара ублюдков / прогонщиков, бегающих вокруг, заботящихся о запросах .. поэтому ваши соединения с memcache должны проверяться. быть не больше, чем количество монгрелей / тин, которые вы используете (при условии, что вы кэшируете только 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!

указывает на то, что мне подсказывает, что соединения memcache часто начинаются с

0 голосов
/ 12 мая 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. </p>

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

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

Удачи!

...