Redis кеш под WordPress сожрал всю память, что делать?
Всем привет!
Думаю про плагин Object Cache Pro для WordPress слышали все, кто в теме.
У меня возник следующий вопрос про использование выделенной памяти: я установил для Redis 128 мегабайт. Оно постепенно начало её заполнять и спустя пару дней уже заняло 127 Мб. У меня на сайте около 3 тысяч товаров, 20 страниц, куча записей, в общем, база данных весит около 1 ГБ.
Я так понимаю, что ему сколько не выдели памяти - он всё сожрет? Как быть, добавить ещё или просто периодически очищать его?
Дополнительно
Refguser @Refguser Делаю ИМ и другие решения Нет поводов для волнений, но можно увеличить объём памяти для редиса (см в конце.)
Насколько будет заполнение кеша зависит от настроек (что кешировать. на сколько и тп), трафика и пр. и будет ровно столько сколько нужно для эффективной работы сайта, но не больше выделенного.
Не по вопросу:
У меня на сайте около 3 тысяч товаров, 20 страниц, куча записей, в общем, база данных весит около 1 ГБ.
Вангую база не оптимизирована. У моего клиента товаров побольше (включая вариации), но база немногим больше 500мб.
А вот у того же клиента вывод redis-cli info memory
>redis-cli info memory # Memory used_memory:141958480 used_memory_human:135.38M used_memory_rss:173039616 used_memory_rss_human:165.02M used_memory_peak:635899776 used_memory_peak_human:606.44M used_memory_peak_perc:22.32% used_memory_overhead:1240328 used_memory_startup:809688 used_memory_dataset:140718152 used_memory_dataset_perc:99.69% allocator_allocated:142341576 allocator_active:145608704 allocator_resident:155316224 total_system_memory:25203458048 total_system_memory_human:23.47G used_memory_lua:41984 used_memory_lua_human:41.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction allocator_frag_ratio:1.02 allocator_frag_bytes:3267128 allocator_rss_ratio:1.07 allocator_rss_bytes:9707520 rss_overhead_ratio:1.11 rss_overhead_bytes:17723392 mem_fragmentation_ratio:1.22 mem_fragmentation_bytes:31143136 mem_not_counted_for_evict:0 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:311440 mem_aof_buffer:0 mem_allocator:jemalloc-5.2.1 active_defrag_running:0 lazyfree_pending_objects:0 |
>redis-cli info memory # Memory used_memory:141958480 used_memory_human:135.38M used_memory_rss:173039616 used_memory_rss_human:165.02M used_memory_peak:635899776 used_memory_peak_human:606.44M used_memory_peak_perc:22.32% used_memory_overhead:1240328 used_memory_startup:809688 used_memory_dataset:140718152 used_memory_dataset_perc:99.69% allocator_allocated:142341576 allocator_active:145608704 allocator_resident:155316224 total_system_memory:25203458048 total_system_memory_human:23.47G used_memory_lua:41984 used_memory_lua_human:41.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction allocator_frag_ratio:1.02 allocator_frag_bytes:3267128 allocator_rss_ratio:1.07 allocator_rss_bytes:9707520 rss_overhead_ratio:1.11 rss_overhead_bytes:17723392 mem_fragmentation_ratio:1.22 mem_fragmentation_bytes:31143136 mem_not_counted_for_evict:0 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:311440 mem_aof_buffer:0 mem_allocator:jemalloc-5.2.1 active_defrag_running:0 lazyfree_pending_objects:0
Ида. Тут используется W3T. У него наиболее тонкие возможности настроек.
- Многие используют W3 Total Cache, он наверное лучше?
- Богдан Герасименко, каждому своё. Не все обладают знаниями чтобы его грамотно настроить.
Ответы:
Не понимаю вашей проблемы. Redis будет удалять самые старые записи, если он заполнен. Если ничего не делать, он всё ещё будет хорошо работать в качестве кэша.
1 ГБ - это слабая загруженность, на самом деле. Такой объём можно полностью уместить в Redis или Tarantool. Роман Страх @Kypidon4ik Фрилансер, Wordpress developer Такая же ситуация была, с хостером решали этот вопрос вместе. Сайт с 200к+ записями. Нам в какой-то момент 32 гб стало мало при TTL кеша редис в 86400. Было решено просто добавить еще 1 плашку на 32 гб.
PS Скажу сразу что редис очень не любит когда его ограничивают в ОЗУ. При ограничении в ОЗУ начинает страдать ЦП. Замкнутый круг получается.
Итог: или откажитесь от объектного кеша или разрешите брать столько ОЗУ сколько надо или попробуйте уменьшить TTL кеша (но это тоже спорно)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
То, что Redis постепенно занял почти весь лимит 128 МБ, само по себе не означает проблему. Redis cache обычно так и работает: заполняет выделенную память объектами, а затем вытесняет старые ключи по политике eviction. Важно не «пустой Redis», а чтобы не было ошибок
OOM command not allowedи чтобы политика вытеснения была настроена.Проверьте:
redis-cli INFO memory redis-cli CONFIG GET maxmemory redis-cli CONFIG GET maxmemory-policy
Для object cache обычно нужна политика вроде:
maxmemory-policy allkeys-lru
или:
maxmemory-policy allkeys-lfu
Если стоит
noeviction, Redis при заполнении памяти начнёт отказывать в записи, и сайт может работать хуже.Для WooCommerce с 3000 товаров 128 МБ может быть мало, особенно если много вариаций, фильтров, запросов и объектный кэш хранит большие массивы. Можно увеличить до 256-512 МБ, но сначала посмотрите hit rate и evicted keys.
Также проверьте, нет ли в кэше огромных transient/query результатов. Иногда плагины складывают в object cache большие ответы API, RSS или массивы товаров. Redis должен ускорять сайт, а не становиться мусорным хранилищем.
Итог: настройте eviction policy, смотрите
used_memory,evicted_keys,keyspace_hits/misses. Если ошибок нет, заполнение памяти до лимита — нормальное поведение.