У меня действительно странная проблема с моими серверами. У меня два сервера, оба с одинаковыми процессорами, жесткими дисками и всем остальным, кроме ОЗУ. Первый имеет 16 ГБ DDR3, второй - 32 ГБ. На первом ОС - сервер Ubuntu 10.04.4, на втором - сервер Ubuntu 11.04.
Итак .. вот в чем проблема. У меня на обоих работает относительно тяжелое приложение php / mysql. На первом у меня 3 экземпляра приложения, на втором только один, но второй сервер работает намного медленнее. (Я трижды проверил файлы конфигурации для apache, mysql и php), и они абсолютно одинаковы. Когда я запускаю ab на первом с localhost:
ab -n 1000 -c 100 http: // local_page /
Concurrency Level: 100
Time taken for tests: 5.056 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 26133000 bytes
HTML transferred: 25721000 bytes
Requests per second: 197.77 [#/sec] (mean)
Time per request: 505.642 [ms] (mean)
Time per request: 5.056 [ms] (mean, across all concurrent requests)
Transfer rate: 5047.15 [Kbytes/sec] received
На втором ситуация другая:
Concurrency Level: 100
Time taken for tests: 20.593 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 28437000 bytes
HTML transferred: 28024000 bytes
Requests per second: 48.56 [#/sec] (mean)
Time per request: 2059.296 [ms] (mean)
Time per request: 20.593 [ms] (mean, across all concurrent requests)
Transfer rate: 1348.54 [Kbytes/sec] received
Из того, что я вижу, второй вариант, который должен работать лучше, намного медленнее. У меня больше нет идей, что нужно настроить, чтобы ускорить работу второго сервера. Я знаю, что это снято в темноте, но не могли бы вы указать мне на несколько общих руководств, чтобы проверить, что не так?
На первом сервере, когда у меня много пользователей, у меня высокая загрузка процессора и оперативной памяти (как и ожидалось), на втором - даже когда много пользователей подключено, у меня около 50% использования верхнего процессора и около 50% используемой оперативной памяти. Чтение с диска не интенсивное. Наиболее часто используемый процесс - это mysql, который на втором сервере редко превышает 50% использования процессора и 5% использования оперативной памяти в соответствии с top
. Возможно, лучшая идея на данный момент - заставить mysql использовать как можно больше ресурсов.
Здесь так много возможностей, что трудно понять, с чего начать. Вы даже не используете одну и ту же ОС, поэтому версии все будет отличаться от настроек по умолчанию, с которыми вы работаете.
На самом деле, все, что я могу предложить, это играть в поисках узкого места. Я бы склонился к ненастроенному серверу MySQL, так как это, как правило, первая точка вызова, поскольку конфигурации MySQL по умолчанию ужасно не соответствуют требованиям современного оборудования. Однако действительно трудно сказать наверняка, поскольку количество потенциальных переменных настолько велико.
Я бы порекомендовал запустить Apache в режиме одного ребенка и запустить strace
на нем с -tt
вариант. Команда будет выглядеть примерно так:
sudo strace -f -tt -T -s 500 -o httpd.trace httpd -X
То, что вы ищете, - это большой разрыв между системными вызовами или системный вызов, который занимает много времени.
Основываясь на вашем разговоре о MySQL, я подозреваю, что это будет опрос () или несколько из них. Если проблема окажется в MySQL, вы сможете выяснить, что ее вызывает, включив журнал медленных запросов, установив для long_query_time значение, например 1 секунду или 0,1 секунды, и включив log_queries_not_using_indexes.
Вы также можете найти различия в производительности серверов, используя инструменты мониторинга и построения графиков, такие как Munin, Cacti или Zabbix. Настоятельно рекомендую установить один, если таковой.
Ограничение 50% ЦП ужасно похоже на настройку PHP open_basedir
Не зная, какое приложение вы используете, я не могу ничего предложить.
Но имейте в виду, что такой короткий тест, скорее всего, будет проверять только создание / порождение потоков, а не производительность самого приложения. Это также будет поражать оперативную память больше, чем что-либо еще из-за дисковых буферов / кеша, поэтому, если у вас есть более оптимальная конфигурация памяти на одном сервере по сравнению с другим (например, трехканальный или одноканальный), это будет иметь ОГРОМНОЕ влияние. .
Запустите загрузочную версию memtest
на каждой машине, и это даст вам приблизительное представление о пропускной способности памяти. Если на одной машине его намного меньше, то вот ваш ответ.
Я бы посоветовал вам изучить тот факт, что контроллеры памяти Intel уменьшают частоту по мере того, как вы устанавливаете слоты памяти внутри машины. Например, у вас есть 3 ветви для каждого канала памяти (9 диммов), если вы заполните только 1 ветвь, частота памяти останется на уровне 1,6 ГГц, если вы заполните все диммы, она будет снижена до 1,06 ГГц. Убедитесь в этом, просто удалив половину памяти и сохранив те же конфигурации на второй машине. Часто больше не значит лучше;)