Здравствуйте.
Размещая пользователей с интернет-магазинами на Cs-cart на хостинге, не однократно сталкивались с таким моментом. Например, владелец сайта очищает кеш из админ-панели CMS или же переключает его со стандартного file, database на redis, в результате чего, первое открытие всегда на порядок дольше (это понятно нам, хоть и не понятно владельцеам магазинов). И до тех пор пока кеш не сгенерируется в полном объёме, веб-сайт не будет открываться, а будет “висеть” при каждом заходе пользователя или любого другого HTTP запроса на домен веб-сайта.
Суть вопроса. В момент первой генерации кеша, не важно, будь то установка модуля администратором сайта с авто-очисткой кеша или переключение кеша, происходит следующее:
Первый посетитель своим HTTP запросом провоцируют генерацию кеша. В этот момент могут одновременно зайти ещё 10-20 человек или более (на крупных магазинах это в порядке вещей).
В результате, мы получаем в такой ситуаци с сайтом достаточно большую нагрузку на сервер, свыше ~1200% 1 CPU - 12 ядер. При этом используются 12 ядерные процессоры Xeon по 2шт в платформе, в сумме получаем 24 ядер/потоков на сервере. Один веб-сайт, с лёгкостью утилизирует свыше 12 ядер под 100% каждое ядро процессор при создании кеша по причине того, что для каждого посетителя запускается параллельная/повторная генерация кеша, когда предыдущая ещё не завершена, в итоге процесс создания кеша от обычных 15-30 секунд растягивается до минуты, а то и более если нагружен сервер в этот момент. Нагрузка на CPU при этом всё так же растёт от каждого дочернего apache процесса, которые длительное время не могут выполниться и завершиться (идёт создание кеша).
Из чего можно сделать вывод, что это не совсем нормальное поведение и это что-то схожее с так называемым “Race Condition”, когда каждый новый заход посетителя на сайт (обновление страницы) или заход поисковых ботов (по другому новый поток), провоцирует всё новую и новую попытку пересоздать кеш, тем самым попросту приводя к колоссальной нагрузке на CPU и как результат, повышенную нагрузку на сервере. Начинает расти Load Average до 25 и выше со всеми вытекающими для остальных веб-сайтов в случае если таковые имеются на том же сервере.
Эта проблема замечалась нами на протяжении нескольких лет при анализе причин кратковременной повышенной нагрузки CS-cart, но мы до конца не могли понять что именно является причиной такого скачка нагрузки на CPU. Есть мысли попытаться как-то совместно этот вопрос решить. Зачем? Обычные владельцы интернет-магазинов сразу же считают, что текущий сервер им не подходит и плохой (их понять можно) и они могут выкидывать запредельные суммы средств всё на новый и новый более мощный сервер, который если и поможет, то только отчасти, во-вторых, бывает сложно объяснять технические сложные моменты таким пользователям из-за чего это происходит и как с этим следует бороться.
Так как на первый взгляд это может показаться не совсем багом, а скорее особенностью, чтобы облегчить возможный дальнейший ход поиска решения проблемы, можно попытаться придумать нечто следующее. Возможно в том участке кода CS-Cart, который отвечает за генерацию кеша, попробовать добавить какое-либо условие, которое не давало бы возможности параллельно инициировать запуск генерации кеша.
Простой пример:
При попытке открыть веб-сайт без созданного кеша (в момент возможного горячего посещения его), в корне веб-сайта создавать некий файл .cache-delay, когда запускается участок кода, ответственный за генерацию кеша, в головном роуте/логике ядра CS-Cart устанавливается условие, что до тех пор, пока существует файл .cache-delay, на любые последующие HTTP запросы к сайту, он возвращает, например, ошибку - заглушку “503 - Магазин на обслуживании, зайдите позже…” (некая временная асинхронность). А как только завершается сценарий создания кеша, в коде срабатывает условие, которое проверяет наличие файла .cache-delay и удаляет его. В итоге получаем в теории отсутствие некого Race Condition, отсутствие длительного создания кеша и проблем с большой нагрузкой от этого действия на посещаемом сайте.
Ниже будет пример на видео, снаятое на тапочек. Показатели нагрузки в мониторинге и top в момент когда происходит подобная проблема. Да, возможно генерация посещений с помощью host-tracker не совсем корректна, но это не меняет сути. Можно тоже самое воспроизвести, просто открывая по соседству 5-10 вкладок с сайтом в момент первого создания кеша.
yadi.sk/i/npfxxBfu3ViSbk
железо
Конфиг железа:
2 x Xeon 2.4Ghz
32GB RAM
SSD 1TB RAID1