Настройка производительности приложения CakePHP

StackOverflow https://stackoverflow.com/questions/1805317

  •  05-07-2019
  •  | 
  •  

Вопрос

Я только что получил это довольно большое приложение CakePHP (около 20 тыс. строк кода), которое не очень чистое и не содержит никакой документации. Приложение запущено в производство, но у него действительно серьезные проблемы с производительностью.

Сервер является четырехъядерным процессором с 8 ГБ ОЗУ, но приложение может обслуживать только около 3-4 запросов / с, что очень и очень плохо. Каждый запрос занимает около 20-30% от всех четырех процессоров.

Когда я пытаюсь выполнить даже небольшой нагрузочный тест, такой как ab -n 100 -c 10 ... , средний отклик увеличивается до 7000 мс. Тем не менее, я никогда не делал это более 800 МБ ОЗУ, поэтому для некоторой настройки есть как минимум 6 ГБ свободной памяти.

Проблема в том, что я еще не смог создать работающий экземпляр разработки, поэтому мне нужно настроить его на производстве ...

Что вы посоветуете для easy повышения производительности, не слишком углубляясь в исходный код?

Это было полезно?

Решение

Шаг 1. Убедитесь, что это приложение, а не веб-сервер

Создайте простой файл hello world вне иерархии Cake

<?php
echo 'Hello World';

И посмотри, сколько времени это займет, чтобы бежать. Иногда легко обвинить приложение в том, что происходит на уровне сервера / сети.

Предполагая, что test.php рендерит за разумное время, перейдите ко второму шагу.

Шаг 2. Резервное копирование всего

Игра с производственным кодом - всегда опасная игра. Прежде чем начать, сделайте полную резервную копию базы данных на случай, если вы испортите что-то, что не подлежит восстановлению, и скопируйте все дерево каталогов тортов. Всякий раз, когда вы закончите день, рассмотрите содержимое рабочего каталога и вашей копии (используя инструмент с графическим интерфейсом или командную строку)

diff -r production-cake copy-of-cake

Шаг 3. База данных почти всегда является вашим первым узким местом со стеком LAMP

PHP-приложения генерируют множество SQL-запросов, особенно когда люди используют модель стиля ActiveRecord, которая скрывает большую часть фактических SQL-запросов. Вы захотите настроить Cake up для регистрации запросов в файле и / или в таблице базы данных. здесь есть инструкции по этому поводу, хотя я бы порекомендовал выйти из простого файла и / или системного журнала вместо базы данных. Ведение журнала запросов к базе данных удвоит количество запросов на загрузку страницы.

Я бы также порекомендовал добавить проверку IP, чтобы она регистрировала только запросы, приходящие с вашего IP-адреса. Таким образом, ваша регистрация не сильно мешает регулярному запуску приложения.

Как только это произойдет, сделайте один запрос, а затем посмотрите на генерируемый SQL. Ищите идентичные запросы, повторяющиеся снова и снова, как место, где вы можете добавить некоторое кэширование для повышения производительности. Также ищите последовательные запросы

select * from foo where id = 5
select * from foo where id = 6
etc...

Которые указывают, что кто-то загружает модели в цикле, не понимая, что происходит за кулисами.

Шаг 4. Если это не база данных, это системные вызовы

Если база данных не является узким местом, а PHP / Apache функционируют должным образом, следующее, что нужно искать, это системные вызовы . Обстрел - это быстрый и грязный способ добиться цели, но это очень дорогая операция. Получите один или два из них в цикле, и все готово.

Запустите top или ps на своем производственном сервере и найдите программы, которые запускаются и останавливаются, а затем ищите в базе кода эти команды.

Шаг 4. Копирование каждого контроллера

У вас будет несколько контроллеров

/app/controllers/posts_controller.php
/app/controllers/other_controller.php
etc...

который будет соответствовать URL

http://www.example.com/posts/methodName
http://www.example.com/other/methodName
etc...

Всякий раз, когда вам нужно отладить конкретный запрос, чтобы выяснить, почему такой медленный, сделайте копию контроллера.

/app/controllers/debugposts_controller.php

и вручную сделать запрос

http://www.example.com/debugposts/methodName

Затем вы можете добавить в файл контроллера столько операторов отладки / печати, сколько захотите. Если вам «повезло», первоначальные разработчики, вероятно, заклинили много логики в файлах контроллера. Если это так, то теперь вы можете сыграть в "закомментировать половину кода". игры.

Другие советы

Вы можете установить уровень DEBUG в app / config / core.php и посмотреть, что происходит. Недостатком является то, что так могут все ваши пользователи. С отладкой вы легко сможете увидеть медленные запросы. За исключением этого, включите SQL Slow Query Log и установите отсечение относительно низким (потому что Cake любит делать много-много запросов, чтобы отвечать на казалось бы простые вопросы).

Думаю, ты не сможешь немного покопаться, боюсь. Вам нужно будет определить узкие места, по крайней мере, компоненты, которые вызывают нагрузку. Например, массовый доступ к плохо проиндексированным таблицам mySQL может свести с ума сервер. В моем опыте это частая причина проблем с производительностью.

Лучше всего было бы настроить среду отладки / профилирования, но список процессов вашего сервера уже должен дать вам приблизительное представление о том, кто вызывает такое напряжение. Это действительно процессы PHP или есть какая-то активность в базе данных?

  

Проблема в том, что я еще не смог создать работающий экземпляр разработки

Это проблема, которую вам нужно решить. Пусть приложение работает независимо от его среды (например, убедитесь, что вся конфигурация среды находится в одном файле и что этот файл содержит только конфигурацию среды). Решив это, вы можете взломать все, что вам нравится в разработке.

Чтобы проверить, связаны ли вы с файловой системой, памятью или процессором, попробуйте vmstat и iostat . Для вашего приложения, если вы этого еще не сделали, используйте memcached или APC , чтобы ускорить процесс. Кроме того, попробуйте установить xdebug и профилировать код, чтобы увидеть, где он работает медленно. Большое количество вызовов функций всегда подозрительно, как и длительное время выполнения. Может оказаться, это ваша база данных. Может быть, вы можете добавить кеширование на несколько запросов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top