Большинство высоконагруженных сервисов, к которым, без сомнения, относится сервис SAAS интернет-магазинов, используют Memcached как высокопроизводительное хранилище данных в оперативной памяти сервера.
Сервис Memcached позволяет кэшировать в памяти результаты запросов к базам данных, к API сервисов, готовые страницы HTML, файлы и другую информацию, к которой нужен быстрый доступ.
Заметим, что кэшированные данные исчезнут из памяти при перезапуске сервиса или при перезагрузке сервера. Если такое недопустимо в вашем проекте, рассмотрите возможность применения Redis.
Как и другие важные сервисы, сервис Memcached необходимо контролировать. Прежде всего, проверять, что сервис работает.
Также требуется постоянно следить за использованием области оперативной памяти, выделенной для хранилища Memcached.
Если памяти выделено слишком мало, старые данные будут вытесняться из кэша, что снижает эффективность его использования. Но нет смысла выделять для Memcached слишком много памяти, так как память нужна и для других сервисов.
В этой статье мы расскажем о том, как установить Memcached, как контролировать работу сервиса Memcached вручную, а также с помощью Zabbix.
Исходный код Memcached, а также инструкцию по установке из пакетов и исходных текстов можно найти на github.
Для ОС Debian и Ubuntu используйте такую команду:
# apt-get install memcached
Если вы работаете с CentOS, Redhat или Fedora, используйте yum:
# yum install memcached
После установки проверьте порт 11211:
# netstat -tap | grep memcached
tcp 0 0 localhost:11211 0.0.0.0:* LISTEN 424288/memcached
tcp 0 0 localhost:11211 localhost:38090 ESTABLISHED 424288/memcached
Чтобы изменить конфигурацию сервиса Memcached, отредактируйте файл /etc/memcached.conf
. Ниже мы показали содержимое этого файла в сокращенном виде:
-d
logfile /var/log/memcached.log
daemon default
-m 4096
-p 11211
-u memcache
-l 127.0.0.1
-I 4m
-P /var/run/memcached/memcached.pid
Здесь обратите внимание на параметр -m, задающий объем оперативной памяти в мегабайтах, выделенной для хранилища Memcached. В данном случае выделено целых 4 Гбайт, что может быть слишком много для вашего проекта. По умолчанию выделяется только 64 или 256 Мбайт в зависимости от версии сервиса, а этого не всегда достаточно.
Анализируя результаты мониторинга Memcached, вы сможете определить оптимальный объем для своих серверов и запущенных на них приложений.
Параметр -I позволяет задать максимальный размер данных, который можно записать в Memcached. По умолчанию он равен 1 Мбайт, но вы можете уменьшить этот размер до 1 Кбайт или увеличить до 1024 Мбайт.
Справку по всем параметрам можно посмотреть так:
$ memcached -h
Изменив параметры Memcached, перезапустите сервис командой:
# service memcached restart
Чтобы получить статистику по работе сервиса Memcached, используйте такую команду:
# echo -e "stats\nquit" | nc -q2 127.0.0.1 11211
Команда покажет на консоли большое количество значений, по которым можно судить о текущем состоянии сервиса:
STAT pid 424288
STAT uptime 2044178
STAT time 1660289827
STAT version 1.6.9
STAT libevent 2.1.12-stable
STAT pointer_size 64
STAT rusage_user 14554.311622
STAT rusage_system 62062.712599
STAT max_connections 1024
STAT curr_connections 14
STAT total_connections 14178603
STAT rejected_connections 0
STAT connection_structures 160
STAT response_obj_oom 0
STAT response_obj_count 1
STAT response_obj_bytes 65536
STAT read_buf_count 12
STAT read_buf_bytes 196608
STAT read_buf_bytes_free 114688
STAT read_buf_oom 0
STAT reserved_fds 20
STAT cmd_get 978627238
STAT cmd_set 51999972
STAT cmd_flush 0
STAT cmd_touch 0
STAT cmd_meta 0
STAT get_hits 947938861
STAT get_misses 30688377
STAT get_expired 2298
STAT get_flushed 0
STAT delete_misses 27970
STAT delete_hits 7698
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 1231813377109
STAT bytes_written 3070645118747
STAT limit_maxbytes 4294967296
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 21
STAT hash_bytes 16777216
STAT hash_is_expanding 0
STAT slab_reassign_rescues 4125
STAT slab_reassign_chunk_rescues 2
STAT slab_reassign_evictions_nomem 9284
STAT slab_reassign_inline_reclaim 2
STAT slab_reassign_busy_items 1
STAT slab_reassign_busy_deletes 0
STAT slab_reassign_running 0
STAT slabs_moved 13
STAT lru_crawler_running 0
STAT lru_crawler_starts 87135
STAT lru_maintainer_juggles 134763706
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT unexpected_napi_ids 0
STAT round_robin_fallback 0
STAT bytes 3739115081
STAT curr_items 2793471
STAT total_items 52004097
STAT slab_global_page_pool 0
STAT expired_unfetched 190272
STAT evicted_unfetched 147835
STAT evicted_active 0
STAT evictions 219236
STAT reclaimed 384
STAT crawler_reclaimed 296312
STAT crawler_items_checked 3253437482
STAT lrutail_reflocked 1541
STAT moves_to_cold 16038024
STAT moves_to_warm 5957296
STAT moves_within_lru 161607
STAT direct_reclaims 219236
STAT lru_bumps_dropped 0
END
Описание параметров из этого списка можно найти здесь (раздел «General-purpose statistics»).
Состав списка параметров, полученный с помощью команды stats, зависит от версии Memcached. Рассмотрим самые интересные с точки зрения мониторинга параметры.
Значение с именем limit_maxbytes показывает максимальный объем памяти, которую Memcached может использовать для хранения значений. В файле конфигурации /etc/memcached.conf максимальный размер хранилища задается параметром -m.
Очень важно контролировать значение evictions. Этот параметр показывает количество объектов, которые пришлось удалить из хранилища для размещения там новых данных. Если он стал большим и все время растет, то имеет смысл оптимизировать использование памяти или добавить больше памяти для сервиса Memcached.
Устройство и оптимизация памяти в Memcached описаны здесь. А на этой странице вы найдете описание механизма выделения памяти.
В процессе настройки вам может потребоваться изменить следующие параметры в файле конфигурации /etc/memcached.conf
:
-f, --slab-growth-factor фактор роста chunk (по умолчанию равен 1.25);
-n, --slab-min-size минимальный размер chunk (по умолчанию равен 48);
-L, --enable-largepages подготовка памяти для Memcached при старте для использования страниц памяти большого размера;
-I, --max-item-size установка максимального значения размера элемента данных (по умолчанию: 1 Мбайт, можно задать значение от 1 Кбайт до 1024 Кбайт)
Если вы решили выделить для Memcached больше памяти, измените значение параметра -m. Убедитесь предварительно, что на сервере установлено достаточно оперативной памяти, и она не занята вся другими сервисами и программами.
Вам также могут быть интересны параметры, приведенные в табл.1.
Табл. 1. Некоторые параметры из результатов работы команды stats
Значение |
Описание |
get_misses |
Количество запрошенных, но не найденных в хранилище Memcached элементов |
get_hits |
Количество запрошенных и найденных в хранилище Memcached элементов |
get_expired |
Количество элементов, которые были запрошены, но оказались удалены из-за истечения срока хранения |
bytes_read |
Общий объем данных в байтах, полученный сервисом из сети |
bytes_written |
Общий объем данных в байтах, записанный сервисом в сеть |
curr_connections |
Количество открытых соединений с сервисом Memcached |
total_connections |
Общее количество установленных соединений с момента запуска сервиса memcached |
Эти параметры позволят вам судить об эффективности использования хранилища Memcached, а также об интенсивности работы приложений с сервисом Memcached.
Если вы используете Zabbix версии 6.2 и установили Zabbix agent 2, то сможете очень легко настроить мониторинг Memcached. Для этого достаточно добавить к серверу шаблон Memcached by Zabbix agent 2, описанный здесь.
Заметим, что этот шаблон не требует дополнительной установки скриптов или внесения изменений в файл конфигурации агента Zabbix с последующим перезапуском агента.
Прежде всего, нужно убедиться, что установленная у вас версия агента Zabbix содержит плагин Memcached. Для этого на консоли вашего сервера Zabbix введите такую команду:
# zabbix_get -s xxx.xxx.xxx.xxx -k memcached.ping
1
Здесь вместо xxx.xxx.xxx.xxx
укажите адрес IP контролируемого хоста. Если плагин подключен, команда выведет на консоль значение единицы.
Шаблон Memcached by Zabbix agent 2 использует несколько макросов, которые обычно не требуется редактировать. Чтобы их увидеть, откройте список хостов в Web-интерфейсе Zabbix и щелкните напротив нужного хоста ссылку шаблона Memcached by Zabbix agent 2. Далее откройте вкладку Macros (рис. 1.).
Если вы запускаете сервис Memcached на нестандартном порту, отличном от 11211, то вам нужно будет отредактировать соответствующим образом макрос {$MEMCACHED.CONN.URI}.
Другие макросы используются в условиях триггеров, и вы можете настраивать триггеры, изменяя соответствующие значения.
Шаблон Memcached by Zabbix agent 2 собирает практически всю информацию, которую выдает команда stats.
Если открыть раздел Latest data для нужного вам сервера, появится большой список данных. Чтобы оставить в нем только данные от упомянутого шаблона, наберите в поле Name фильтра поиска строку Memcached, а затем щелкните строку Apply. На странице останутся только данные, полученные от шаблона Memcached by Zabbix agent 2 (рис. 2).
Щелкнув ссылку Graph, вы можете увидеть график изменения соответствующего значения. Например, на рис. 3 показано количество успешных запросов к хранилищу Memcached.
В шаблоне Memcached by Zabbix agent 2 предусмотрено несколько триггеров, в условиях срабатывания которых используются перечисленные выше макросы (рис. 4).
Самый высокий уровень серьезности Average здесь установлен для триггера Memcached: Service is down, и это понятно — остановка кэширования может резко увеличить нагрузку на сервер и СУБД.
Этот триггер позволит вам отследить аварийное завершение сервиса Memcached, например, если какая-то другая программа или сервис заберет для себя всю оперативную память сервиса. В этом случае после анализа и нормализации ситуации с памятью нужно будет снова запустить сервис Memcached.
Остальные триггеры уровня предупреждения Warning предполагают плановый анализ ситуации системным администратором в кооперации с разработчиком приложения, данные которого кэшируются.
Если по каким-то причинам вы не можете обновить сервер или агент Zabbix до новой версии, есть вариант мониторинга сервиса Memcached собственным шаблоном, предполагающим использование скрипта.
Создайте на вашем сервере Zabbix каталог /etc/zabbix/scripts/ и запишите в него файл memcache.sh
с таким содержимым:
#!/bin/bash
echo -e "stats\nquit" | nc 127.0.0.1 11211 | grep "STAT $1 " | awk '{print $3}'
Файл можно загрузить здесь.
Сделайте скрипт memcache.sh
исполняемым:
# chmod +x /etc/zabbix/scripts/memcache.sh
Теперь допишите в конец файла конфигурации агента Zabbix /etc/zabbix/zabbix_agentd.conf
строку:
UserParameter=memcache[*],/etc/zabbix/scripts/memcache.sh $1
Перезапустите агент Zabbix:
# service zabbix-agent restart
Далее загрузите на сервер Zabbix и добавьте к вашим серверам, на которых нужно контролировать сервис Memcached, шаблон Shop2YOU Memcache Lite.
В шаблоне Shop2YOU Memcache Lite определены все основные параметры, которые можно получить с помощью команды stats (рис. 5).
С помощью ссылок Graph вы можете посмотреть графики изменений соответствующих значений.
В этом шаблоне определен только один триггер с высоким уровнем серьезности High и названием Memcache service is down on {HOSTNAME}:
last(/Shop2YOU Memcache Lite/net.tcp.service[tcp,,11211])=0
Он срабатывает, если сервис Memcached становится недоступным. Вы можете добавить свои триггеры, аналогичные показанным на рис. 4.
на главную сниппетов