Насколько я могу судить, средняя нагрузка на моем сервере (Ubuntu Linux 8.04.1) слишком высока, и на практике я вижу, что она замедляется или перестает обслуживать в часы пик.
Это довольно стандартная ЛАМПА, обслуживающая один сайт (хостинг изображений), который, очевидно, обслуживает много контента (изображений) с диска, но для их обслуживания им необходимо пройти через PHP. Помимо общего совета по использованию для этого подхода кэширования / прокси, я не понимаю, почему он, по-видимому, использует менее половины доступных ресурсов (4 ГБ ОЗУ, это Linode 4096).
Я новичок в Linux, поэтому спрашивайте, что может быть полезно. Это часть htop
(MySQL показывает использование ЦП 98,9%, но это было незначительно, он использует 0. *% Почти все время):
1 [||||||||||||||||||||||||||||||||||| 69.0%] Tasks: 355 total, 6 running
2 [||||||||||||||||||||||| 44.8%] Load average: 18.32 15.02 11.58
3 [|||||||||||||||||||||||||||||||||||| 71.9%] Uptime: 01:10:22
4 [||||||||||||||||||||||||||||| 57.9%]
Mem[||||||||||||||||||||||||||||||||||||||2190/4096MB]
Swp[| 0/127MB]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
2345 mysql 18 0 177M 72640 5140 S 98.9 1.7 7:47.58 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
9350 www-data 16 0 48940 24304 4376 R 13.7 0.6 0:01.05 /usr/sbin/apache2 -k start
9301 mysql 15 0 177M 72640 5140 S 10.0 1.7 0:00.17 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
9186 mysql 17 0 177M 72640 5140 S 10.0 1.7 0:00.22 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
9150 www-data 15 0 58400 33900 4476 S 8.1 0.8 0:02.03 /usr/sbin/apache2 -k start
9077 mysql 15 0 177M 72640 5140 S 8.1 1.7 0:00.39 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
9270 mysql 15 0 177M 72640 5140 S 7.5 1.7 0:00.12 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
9037 mysql 16 0 177M 72640 5140 S 7.5 1.7 0:00.45 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
9333 www-data 15 0 35724 11260 4560 S 6.2 0.3 0:03.88 /usr/sbin/apache2 -k start
Это текущий apache2.conf
, хотя я перепробовал множество комбинаций и спрашивали здесь в прошлом:
Timeout 90
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 3
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 5
MaxClients 275
ServerLimit 275
MaxRequestsPerChild 1250
</IfModule>
ОБНОВИТЬ: Как и просили, это часть top
:
top - 15:07:31 up 1:46, 2 users, load average: 12.83, 10.64, 10.14
Tasks: 223 total, 17 running, 206 sleeping, 0 stopped, 0 zombie
Cpu(s): 84.3%us, 8.8%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 1.0%si, 5.9%st
Mem: 4194528k total, 3555696k used, 638832k free, 27748k buffers
Swap: 131064k total, 588k used, 130476k free, 1458672k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2345 mysql 17 0 180m 76m 5140 S 55 1.9 13:09.79 mysqld
12479 www-data 18 0 73224 47m 4552 S 48 1.2 0:03.74 apache2
12294 www-data 17 0 71788 46m 4472 R 39 1.1 0:05.78 apache2
12382 www-data 17 0 73744 48m 4460 R 33 1.2 0:03.19 apache2
ОБНОВИТЬ: Как было предложено (Кристофер Карел, спасибо), вот активные процессы (вывод из ps -efl | cut -c3- | egrep -v "^S"
). В среднем 1-5 apache2
процессы. Имеет ли это смысл с учетом моего текущего apache2.conf
а нагрузка средняя?
T root 12519 12508 0 75 0 - 612 finish 15:07 pts/1 00:00:00 top
R www-data 18677 2774 1 76 0 - 17130 - 16:23 ? 00:00:04 /usr/sbin/apache2 -k start
R www-data 18965 2774 2 76 0 - 13397 - 16:26 ? 00:00:04 /usr/sbin/apache2 -k start
R www-data 19047 2774 2 76 0 - 11613 - 16:28 ? 00:00:00 /usr/sbin/apache2 -k start
R www-data 19088 2774 55 76 0 - 10482 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start
R www-data 19091 2774 0 81 0 - 8579 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start
R www-data 19092 2774 0 81 0 - 8355 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start
R www-data 19093 2774 0 82 0 - 8322 - 16:29 ? 00:00:00 /usr/sbin/apache2 -k start
R root 19094 18557 0 77 0 - 593 - 16:29 pts/2 00:00:00 ps -efl
R root 19095 18557 0 78 0 - 729 - 16:29 pts/2 00:00:00 -bash
R root 19096 18557 0 78 0 - 729 - 16:29 pts/2 00:00:00 -bash
У меня была такая же проблема. mytop показал множество запросов в очереди. Я добавил индексы в свои таблицы, и проблема исчезла.
Вы можете включить Apache mod_status ( http://httpd.apache.org/docs/2.0/mod/mod_status.html ), чтобы вы могли точно видеть, что происходит на вашем веб-сервере. В частности, вы получите цифры по потреблению ЦП по запросу.
Не повредит и несколько снимков из vmstat / iostat.
Кроме того, вы используете таблицы MyISAM или InnoDB? Когда вы получаете один из этих всплесков нагрузки, что вы получаете от "SHOW FULL PROCESSLIST \ G" в MySQL? У меня такое ощущение, что в MySQL возникает конфликт блокировок / запросов, который увеличивает длину очереди выполнения вашего ядра.
У меня нет для вас полного решения, но у меня есть некоторые предположения.
Однако из приведенных выше данных для меня не очевидно, что с вашей настройкой что-то не так. Хотя вы, вероятно, можете выжать немного больше производительности из коробки, возможно, вы просто приближаетесь к пределу.
Обновить:
Разъяснение по поводу: комментарий ниже.
Типичный сетевой TCP-сервер состоит из демона, у которого есть слушающий сокет и несколько открытых подключений к клиентам. На каждом из этих сокетов есть процесс, ожидающий его (один процесс может ожидать на нескольких сокетах). Эти процессы будут в спящем состоянии и будут разбужены ОС при поступлении некоторых данных. Если он эффективен (скажем, статический веб-сервер), вы, возможно, никогда не поймаете его работающим, поскольку требуется всего около 100 микросекунд, чтобы проснуться, обработать некоторые данные и вернуться в режим сна.
Обновление 2:
Современная ОС выделяет свободную память новым дисковым буферам до тех пор, пока в ней не закончится память, а затем повторно использует наименее используемые буферы. Таким образом, память всегда будет заполнена. Более того, существует несколько способов, которыми два процесса могут сообщать одну и ту же страницу памяти как часть своего размера. Результатом этого является то, что а) в современной ОС постоянно не хватает памяти и б) трудно точно сказать, как используется память. Лучшим простым показателем является стремление к буферным и кэшированным числам как к большой части физической памяти. В этом ящике более 30% памяти находится в кэшированных данных на диске.
Любая команда, не находящаяся в состоянии S (спящий режим), будет считаться активным процессом. Сюда входят те, кто находится в рабочем состоянии R и в состоянии блокировки D. (Последнее обычно происходит, когда он ожидает ввода-вывода с диска или сетевого устройства). У вас также могут быть процессы Zombie, которые постоянно работают, увеличивая среднюю нагрузку.
Чтобы найти их список, попробуйте следующую команду: ps -efl | cut -c3- | egrep -v "^S"
У вас не так много времени в расписании iowait, так что это могут оказаться зомби.
Использование mysqld на 100% также может объяснить ваши периодические зависания. (Может быть, это только «иногда»?) Средняя нагрузка может быть отвлекающим маневром или не основной причиной вашей проблемы.
Кроме того, похоже, что ваша машина использует 3,5 ГБ из 4 ГБ вашей оперативной памяти. free -m
может дать вам немного лучшее представление о том, что вам нужно.
Если вы обслуживаете в основном изображения (статические файлы), вероятно, было бы лучше переключиться на NGINX, и если вы используете PHP для изменения размера изображений, вероятно, вам следует использовать memcached (напрямую обслуживающий NGINX, вы можете установить это в файле confing NGINX). имел бы огромное влияние. Apache не подходит для обслуживания статических файлов (в настоящее время я не думаю, что он подходит для чего-либо)