Одна из страниц в одном из моих приложений работает на веб-сервере очень медленно по сравнению с моим локальным тестовым сервером. Есть некоторые радикальные различия в средах, которые могут объяснить это, но я надеюсь на более решаемое решение, чем это.
Сервер:
Solaris 10
Apache 2.2.9 Prefork
PHP 5.2.6
Сервер работает на кластере из 4 ящиков Sun, которым не исполнилось даже года, и не должно иметь никаких проблем с производительностью.
Локальный тестовый сервер:
Windows XP
Apache 2.2.14 WinNT
PHP 5.3.1
На самом деле это мой собственный компьютер - приличная машина, но должна бледнеть по сравнению с коробками Sun.
Приложение написано с помощью CodeIgniter, и я использовал функции профилирования, чтобы отследить замедление до Model :: Model (). Например, Model :: Model () выполняется за 0,0006 с локально и 0,0045 с на сервере. Когда вы загружаете на страницу сотни моделей, это, очевидно, проблема.
Я разместил это здесь из ServerFault, так как потенциально он может быть более тесно связан с CodeIgniter.
Из локального загрузка страницы занимает 2-3 секунды. С сервера 11-15.
Модули на локальном, но не удаленном:
Модули удаленно, а не локально:
Редактировать:
Я постепенно опускал свой бенчмаркинг, уровень за уровнем, и обнаружил, что наибольшее несоответствие лежит в этом фрагменте кода (который находится в функции CodeIgniter Model :: _ assign_libraries и вызывается во время конструктора модели):
$time = microtime()*1000;
foreach (array_keys(get_object_vars($CI)) as $key)
{
if ( ! isset($this->$key) AND $key != $this->_parent_name)
{
// In some cases using references can cause
// problems so we'll conditionally use them
if ($use_reference == TRUE)
{
$this->$key = NULL; // Needed to prevent reference errors with some configurations
$this->$key =& $CI->$key;
}
else
{
$this->$key = $CI->$key;
}
}
}
if (get_class($this) == 'SeatType')
echo sprintf('%.5f ms|', (microtime()*1000 - $time));
Локально это печатает около 0,48 мс на каждой итерации. В кластере он печатает около 3,9 мс на каждой итерации.
Я начинаю задумываться, не связана ли эта проблема с Apache / PHP - я скопировал файлы php.ini и htconf на свой локальный сервер, и (после удаления mod_dtrace и почти ничего другого) я действительно увидел повышение производительности. (Приведенная выше проверка теперь печатает 0,2 мс локально.)
Мы обнаружили, что хотя серверы SPARC выглядят так, как будто они должны работать лучше, чем четырехъядерный процессор core2 на моем ПК, они делают это полностью за счет потоковой передачи. Любой отдельный поток на самом деле будет работать хуже. Вероятно снижение производительности из-за этого.
Я полагаю, вы сравнивали настройки PHP / apache и загруженные модули?
Вы уверены, что это веб-сервер / PHP? Я недостаточно знаком с CI, чтобы знать наверняка, но похоже, что Model подключается к базе данных.
Если он действительно подключается к БД, попробуйте проверить