Мой рабочий сервер - Windows Server 2012 R2, Apache 2.4, PHP 5.6 и MariaDB (не уверен в версии, возможно, не имеет значения). У меня есть настроенный сайт, работающий на Silverstripe 3.5.
В последнее время я получаю нелепые TTFB с определенными действиями, в первую очередь с входом в систему (более 30 секунд) или иногда случайным образом при просмотре серверной части. Любопытно, что этого не происходит на нашем сервере разработки, который настроен аналогичным образом, и наш ИТ-отдел собирается переполнить httpd.conf
и php.ini
чтобы увидеть, есть ли какие-либо различия, которые могут быть проблемой.
Я включил расширение Zend OpCache в надежде, что оно поможет, но я не вижу каких-либо значительных улучшений.
Я установил XDebug и запустил профилирование при входе в систему (добавив скрытое поле формы с именем XDEBUG_PROFILE через инспектор DOM), но в выводе при просмотре в WinCachegrind говорится, что выполнение PHP в совокупности заняло не более 5 секунд, т. Е. Общее совокупное время в main.php
было 4.x секунды. Кажется, нет заметных узких мест в логике фреймворка или доступе к базе данных.
httpd.exe
занимает 14% моего ЦП на время выполнения запроса. Просмотр журналов с помощью Powershell's gci -Wait
показывает, что запрос не авторизован access.log
до тех пор, пока не будет отправлен ответ (не уверен, что нормальное поведение) и не появятся ошибки.
Я не понимаю, почему Apache так долго обрабатывает запрос, который, как утверждает PHP, занимает всего 4 секунды для выполнения логики. Хотя потенциальные решения могут быть оценены по достоинству, я действительно хотел бы знать, где еще я могу посмотреть с точки зрения диагностики, чтобы выяснить, что вызывает такое замедление Apache, например доступ к файлам, отслеживание выполнения и т. д.? Я понятия не имею, с чего начать поиск.
База данных была не узкое место. Как ни странно, это был тайник - это известная проблема, которая Zend_Cache_Backend_File
кеширование на основе отвратительно медленных, если на сайте есть много данных, шаблонов и изображений для кеширования. Конечно же, в моей папке silverstripe-cache на сервере было более 5000 файлов.
Добавление следующей строки в ./mysite/_config.php
отключение кеширования привело к немедленным, ошеломляющим улучшениям (35-секундный TTFB при входе в систему до менее 0,5 секунды!):
SS_Cache::set_cache_lifetime('default', -1, 100);
тем не мение, это временное решение. Мы рассмотрим возможность реализации более постоянного, более практичного решения для обработки кеширования, такого как использование RAM-диска в сочетании с серверной частью файловой системы или использование серверной части, которая использует пулы памяти, такие как XCache или Memcached, а также работать над переходом на Silverstripe 4.x, который сбрасывает Zend_Cache
в пользу symfony/cache
.
Но, поскольку мой офис любит позволять бюрократии мешать всему ... возможно, это произойдет немного раньше.