У меня есть сервер (2x Hexa-Core Xeon E5649 2,53 ГГц с HT с 32 ГБ ОЗУ и пропускной способностью 20000 ГБ) под управлением Ubuntu Server 12.04 LTS. Сервер работает под управлением LAMP и обслуживает только один веб-сайт, ориентировочное количество пользователей должно быть ~ 15 000 одновременно.
На данный момент у меня около 2000 онлайн-пользователей, каждый из которых выполняет 50 запросов MySQL (небольшие значения, в основном, выбирают и вставляют) с начала до конца сеанса. Загрузка ЦП сервера высока при таком количестве подключений, в то время как использование ОЗУ составляет почти 1 ГБ из 32 ГБ, стоит отметить, что сервер работал очень быстро без каких-либо проблем, но меня беспокоит средняя загрузка. http://s12.postimage.org/z7hi6mz3h/photo.png
top - 03:02:43 up 9 min, 2 users, load average: 50.83, 30.14, 12.83
Tasks: 432 total, 1 running, 430 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 66.5%id, 33.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32939992k total, 3111604k used, 29828388k free, 84108k buffers
Swap: 2048280k total, 0k used, 2048280k free, 1621640k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2860 root 20 0 25820 2288 1420 S 3 0.0 0:11.18 htop
1182 root 20 0 0 0 0 D 2 0.0 0:01.46 kjournald
1935 mysql 20 0 12.3g 161m 7924 S 1 0.5 102:31.45 mysqld
11 root 20 0 0 0 0 S 0 0.0 0:00.38 kworker/0:1
1822 www-data 20 0 247m 25m 4188 D 0 0.1 0:01.81 apache2
2920 www-data 20 0 0 0 0 Z 0 0.0 0:01.20 apache2 <defunct>
2942 www-data 20 0 247m 23m 3056 D 0 0.1 0:00.20 apache2
3516 www-data 20 0 247m 23m 3028 D 0 0.1 0:00.06 apache2
3521 www-data 20 0 247m 23m 3020 D 0 0.1 0:00.09 apache2
3664 www-data 20 0 247m 23m 3132 D 0 0.1 0:00.09 apache2
3674 www-data 20 0 247m 23m 3252 D 0 0.1 0:00.06 apache2
3713 www-data 20 0 247m 23m 3040 D 0 0.1 0:00.09 apache2
1 root 20 0 24328 2284 1344 S 0 0.0 0:03.09 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:00.01 ksoftirqd/0
6 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0
7 root RT 0 0 0 0 S 0 0.0 0:00.00 watchdog/0
8 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/1
9 root 20 0 0 0 0 S 0 0.0 0:00.00 kworker/1:0
root@server:~/codes# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
19 0 0 29684012 86112 1689844 0 0 19 590 254 231 48 0 47 5
23 0 0 29704812 86128 1697672 0 0 4 320 11100 8121 77 1 22 0
33 0 0 29671044 86156 1705308 0 0 0 5440 13190 9140 95 1 4 0
33 3 0 29670088 86160 1706288 0 0 0 32932 12275 7297 99 0 1 0
35 0 0 29693456 86188 1710724 0 0 4 676 12701 7867 98 1 1 0
^C
Я не менял ни одну из конфигураций по умолчанию, поставляемых с Ubuntu. Нормальна ли такая нагрузка для такого мощного сервера? Могу ли я оптимизировать Apache / MySQL, чтобы минимизировать нагрузку? Что вы порекомендуете ?
РЕДАКТИРОВАТЬ: СРЕДНЯЯ ЗАГРУЗКА на 52 !!!!!!! http://zertux.com/IMG_0117.PNG
**** ОБНОВЛЕНИЕ **** Оказывается, администратор базы данных не добавлял индексы в таблицы, после добавления индексов средняя загрузка резко упала с 93 до 1,2 :) Все супер, спасибо всем за помощь!
Мне кажется, это нормально.
У вас 12 ядер ... на двух 6-ядерных процессорах. Таким образом, при 100% производительности средняя загрузка должна быть 12.
Средняя нагрузка смешная. Я не думаю, что это означает то, что вы думаете.
Средняя нагрузка на самом деле является показателем того, сколько процессов выполняется одновременно, в среднем за 1, 5 и 15 минутные окна.
Мне кажется, ты немного перегружен, но не сильно.
Возможно использование http://mysqltuner.pl/mysqltuner.pl чтобы получить некоторое представление о том, как ваши настройки mysqld соответствуют реальным объемам использования.
Следующим логическим шагом, конечно же, является разделение MySQL и Apache на разные блоки. Я еще не уверен, что вы на этом уровне, потому что у вас еще есть штаны оперативной памяти, свободной для MySQL. Вы можете найти некоторую выгоду в увеличении кешей запросов и ключевых буферов и, вероятно, более внимательно изучить Журнал медленных запросов MySQLи посмотрите, сможете ли вы вообще оптимизировать таблицы.
Существует масса информации о том, как считывать средние значения нагрузки, и на самом деле более разумно разделить среднее значение нагрузки на количество ядер, чтобы вы имели некоторое представление о том, как на самом деле используется сервер.
Теперь я вижу, что у вас 33% iowait. Я подозреваю ... что у вас довольно большая база данных для записи, и это приводит к блокировке таблиц, когда вы пишете, а это означает, что одновременная запись невозможна.
Имея понюхал на my.cnf похоже, что max_connections довольно велико, но это не вызывает большого беспокойства, но это означает, что если вы используете их все, вам понадобится 27 ГБ ОЗУ, чтобы это разрешить. Это много, но опять же не большая проблема.
Рассматривать превращение на PHP APC Opcode кеширование.
** редактировать **
Теперь, просмотрев журнал запросов, я склонен думать, что есть несколько вещей, которые могут принести пользу серверу.
Без более глубокого понимания того, что, черт возьми, происходит, на самом деле сказать сложно.
Возможно, стоит попробовать NewRelic для PHP. Это бесплатно в течение месяца и дает хорошее представление о неприятных запахах кода.
Кроме того, я доступен для консультации;)
В вашем главном выводе есть одна поразительная особенность - это количество процессов в состоянии D. Хороший кусок apache2 и даже kjournald даже в состоянии D. Известно, что процессы состояния D увеличивают нагрузку на ЦП.
Чаще всего процесс переходит в состояние D, когда ожидает ввода-вывода. После получения IO он снова переходит в состояние R или состояние S из D. Следующее, что вы можете сделать для выполнения отладки в реальном времени, - это проверить, сколько времени выполняются эти процессы состояния D. Если на какое-то время проблема.
В любом случае, ваша проблема, если это высокая средняя нагрузка, заключается в IOwait, поскольку 33,1% - это значение iowait, указанное top. % usr и% sys не так уж и много, поэтому мы можем спокойно игнорировать тот факт, что процессы выходят из строя, либо процессор не работает, либо есть узкое место с памятью. Проблема, видимо, в iowait. Я в основном работаю с RHEL, поэтому я не уверен на 100% в Ubuntu и в наличии встроенных инструментов.
В основном я собираю несколько итераций top, vmstat в течение некоторого времени, iostat в течение некоторого времени (с соответствующими переключателями, которые показывают разрушение устройства), одну итерацию ps и ps -xv и проверяю их. Часто из этого можно сделать первый уровень отладки. Затем я мог бы собрать некоторые выходные данные oprofile, perf в зависимости от версии RHEL, но это уже другая история.
Независимо от этого, пожалуйста, проверьте все команды отладки одновременно, чтобы получить более детальное представление.
Я подозреваю, что процесс, возможно, ожидает ввода-вывода, что может привести к увеличению средней нагрузки. В конце концов, средняя загрузка зависит от очереди запущенных процессов для процессора. Видите ли вы какое-нибудь высокое значение в команде iostat?
У меня была такая ситуация раньше, когда в основном при минимальной нагрузке на сервер веб-сайт, кажется, очень медленно реагировал.
Top не использовал процесс, который потребляет слишком много оперативной памяти или процессора. Но настораживает сервер Лаод и время ожидания процессора. Как и в вашем случае это 33%.
В моем случае проблема оказалась в компании, занимающейся хостингом серверов. Их SAN работала очень медленно в течение нескольких недель, прежде чем они наконец решили сменить хранилище. Только после того, как мой сервер заработал нормально.
У меня был VPS, а не выделенный сервер.
У меня была аналогичная проблема с настольной версией Ubuntu 12.04 (она использовалась в качестве сервера (не мой выбор)).
Если вы установили на своем компьютере диспетчер рабочего стола, вы можете обнаружить, что проблема заключается в vsync.
Unity dm вызывал у меня постоянно повышенную нагрузку на процессор, и я мгновенно отключил vsync, и это исправило. Я не знаю, вызывают ли эту проблему и другие DM.