Настройка производительности приложения CakePHP - PullRequest
5 голосов
/ 26 ноября 2009

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

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 26 ноября 2009

Шаг 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

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

1 голос
/ 26 ноября 2009

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

0 голосов
/ 27 ноября 2009

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

0 голосов
/ 26 ноября 2009

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

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

0 голосов
/ 26 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...