600+ проблем с memcache req / s - помогите! - PullRequest
9 голосов
/ 21 июля 2011

Я запускаю memcached на моем сервере, и когда он достигает 600+ запросов / с, он становится нестабильным и вызывает большую нагрузку.Появляется, когда частота запросов становится такой высокой, мои PHP-приложения в случайное время не могут подключиться к серверу memcache, что приводит к медленной загрузке, что приводит к сбою в работе nginx и php-fpm, и я получаю кучу 104: Сброс соединения по пируошибки в моих журналах nginx.

Я хотел бы отметить, что на моем сервере memcache у меня есть «горячие объекты» - объекты, которые время от времени получают 90% запросов memcache.Я также заметил, что когда так много запросов попадают в один объект, это немного увеличивает время загрузки всей страницы (когда ее удается загрузить).

Я был бы очень признателен за любую помощь в решении этой проблемы.Большое спасибо!

Ответы [ 3 ]

7 голосов
/ 01 августа 2011

Отключитесь от использования сокетов TCP и переходите на сокеты UNIX (при условии, что вы находитесь на сервере на основе Unix)

Запустите memcached с включенным сокетом: Добавьте -s /tmp/memcached.socket в строку запуска memcached (обратите внимание, сокеты отключают поддержку сети)

Затем в PHP подключитесь с помощью постоянных подключений и к новому сокету memcache:

$memcache_obj = new Memcache;
$memcache_obj->pconnect('unix:///tmp/memcached.socket', 0);

Еще одна рекомендация, если у вас есть несколько «типов» кэшируемых объектов, запустите экземпляр memcached для каждого «типа» и распределите между ними ваши горячие элементы.

Drupal делает это, вы можете увидеть, как их конфигурационный файл и memcached init настроены здесь .

Кроме того, мне кажется, что ваш тайм-аут memcached установлен в значение WAY на высокое. Если оно превышает 1 или 2 секунды, вы можете заблокировать скрипты. Тайм-аут должен быть достигнут, и сценарий должен по умолчанию получить объект с помощью другого метода (SQL, файл и т. Д.)

Другое дело, убедитесь, что ваш memcache не помещается в файл подкачки, если ваш кэш меньше среднего свободного RAM, попробуйте запустить memcache с опцией -k, это заставит его кэш всегда оставаться в баран и не может быть обменен.

Если у вас многоядерный сервер, также убедитесь, что memcached скомпилирован с поддержкой потоков, и включите его, используя -t <numcores>

1 голос
/ 21 июля 2011

600 запросов в секунду крайне низко для memcached.

Если вы устанавливаете соединение для каждого запроса, вы тратите больше времени на соединение, чем на запрос, и очень быстро прожигаете свои эфемерные порты, что может быть проблемой, с которой вы сталкиваетесь.

0 голосов
/ 21 июля 2011

Вы можете попробовать несколько вещей:

  • Если у вас запущен memcached локально, вы можете использовать именованный сокет localhost вместо 127.0.0.1
  • Использовать постоянные соединения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...