Релиз Memcached 1.6.0 с включением поддержки внешнего хранилища

Состоялся значительный релиз системы кэширования данных в оперативной памяти Memcached 1.6.0, оперирующей данными в формате ключ/значение и отличающейся простотой использования. Memcached обычно применяется как легковесное решение для ускорения работы высоконагруженных сайтов путём кэширование доступа к СУБД и промежуточным данным. Код поставляется под лицензией BSD.

В новой версии стабилизирована реализация хранилища «extstore», которое теперь собирается по умолчанию (для отключения в скрипте configure предусмотрена опция »--disable-extstore»), но требует явной активации при запуске (старые установки после обновления продолжат работу без изменения). Несмотря не то, что в целом хранилище «extstore» признано стабильным, рекомендуется соблюдать осторожность при его внедрении в очень крупных системах.

Extstore позволяет использовать SSD/Flash-накопители для расширения размера кэша. Как и при использовании оперативной памяти, хранилище на Flash не является постоянным и сбрасывается при перезапуске. В качестве области применения нового режима называется обеспечения эффективного кэширования данных большого размера. При использовании «extstore» ключи и метаданные, как и раньше, хранится только в оперативной памяти, но связанные с ключами большие данные, размер которых превышает установленный порог, сохраняются во внешнее хранилище, а в ОЗУ остаётся только указатель.

Если с ключом связываются данные небольшого размера, то Memcached работает как обычно, держит данные в памяти и не обращается к внешнему хранилищу. Если свободной памяти много, то наиболее востребованные данные дополнительно могут полностью находиться в кэше в оперативной памяти (например можно указать, чтобы на Flash сбрасывались только объекты больше 1024 байт, к которым не было обращений 3600 секунд»).

Реализация оптимизирована для обеспечения максимальной производительности и минимальной нагрузки на CPU, в ущерб эффективности хранения (большой уровень фрагментации). Для продления ресурса Flash-накопителей данные буферизируются и сбрасываются в хранилище последовательно. Для сохранения состояния кэша между перезапусками может применяться появившаяся в выпуске 1.5.18 возможность сброса дампа с кэшем в файл. При следующем запуске можно восстановить кэш из данного файла для исключения пиков нагрузки на обработчики контента из-за незаполненности кэша (кэш сразу становится «тёплым»).

Вторым важным изменением в Memcached 1.6 стала переработка кода для сетевого взаимодействия, который адаптирован для автоматической обработки пакетных обращений в рамках одного системного вызова. Раньше, при передаче нескольких команд «GET» в одном TCP-пакете, memcached отправлял результаты с выполнением отдельных системных вызовов. В Memcached 1.6 ответы агрегируются и возвращаются через отправку одного системного вызова. Как результат, в среднем теперь приходится 1.5 ключа на системный вызов, что демонстрирует в тестах снижение нагрузки на CPU до 25% и сокращение задержек на несколько процентов.

Переработка сетевой подсистемы также позволила перейти к динамическому выделению буферов по необходимости, вместо статического назначения буферов. Данная оптимизация сократила потребление памяти в режиме ожидания новых команд через установленное клиентом соединение с 4.5 Кб до 400–500 байт, а также дала возможность избавиться от многих вызовов malloc, realloc и free, приводящих к лишней фрагментации памяти на системах с большим числом соединений. Каждый рабочий поток теперь обрабатывает свой пул буферов для чтения и записи для активных клиентских соединений. Для настройки размера этих буферов предусмотрены опции »-o resp_obj_mem_limit=N» и »-o read_buf_mem_limt=N».

В ветке 1.6 также объявлено о переводе в разряд устаревших бинарного протокола взаимодействия с сервером. Сопровождение бинарного протокола и исправление ошибок будет продолжено, но новые возможности и обновления существующих функций переноситься не будут. Текстовый протокол продолжит развитие без изменений. На смену бинарному протоколу пришёл новый протокол meta (текстовый вариант протокола с компактными meta-командами), демонстрирующий оптимальное сочетание производительности и надёжности. Новый протокол охватывает все операции, ранее доступные через текстовый и бинарный протоколы.

Источник: http://www.opennet.ru/opennews/art.shtml? num=52507

© OpenNet