Назад | Перейти на главную страницу

Средняя нагрузка высока, но ресурсы используются не полностью

Насколько я могу судить, средняя нагрузка на моем сервере (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 возникает конфликт блокировок / запросов, который увеличивает длину очереди выполнения вашего ядра.

У меня нет для вас полного решения, но у меня есть некоторые предположения.

  1. Кажется, что на вашем сервере mysql есть только что-то вроде пула 128 МБ. Если система LAMP использует базу данных приличного размера, это, похоже, мало. Это вызовет много операций ввода-вывода для дисков. Кроме того, если в mysql наблюдаются скачки ЦП, включите на время ведение журнала медленных запросов и посмотрите, что появится. Может быть, потребуется новый индекс или два.
  2. В качестве верхней замены, которая может считывать большинство компьютеров, работающих с процессами в современном ядре, я рекомендую поверх. Помимо прочего, он может отображать доступ к диску по процессам. Обратите внимание, что в atop есть запущенный демон как часть его установки, поэтому вы можете удалить его после того, как закончите.
  3. Будьте осторожны, каким цифрам использования ЦП вы доверяете. Они генерируются несколько другими методами. По моему опыту, чтобы показать общую загрузку ЦП, vmstat дает "лучшие" (== наиболее близкие к предполагаемой нагрузке) числа.
  4. Есть процессы apache, которые делают серьезную работу. Может быть, нужна некоторая оптимизация кода PHP?

Однако из приведенных выше данных для меня не очевидно, что с вашей настройкой что-то не так. Хотя вы, вероятно, можете выжать немного больше производительности из коробки, возможно, вы просто приближаетесь к пределу.

Обновить:

Разъяснение по поводу: комментарий ниже.

Типичный сетевой 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 не подходит для обслуживания статических файлов (в настоящее время я не думаю, что он подходит для чего-либо)