Thank you for reading this post, don't forget to subscribe!
Анализ нагрузки на сервер позволит быстро понять причины медленной работы. Это необходимо делать еще и для того, чтобы вовремя планировать покупку новых серверов.
Аппаратная часть любого сервера состоит из 4 основных компонент:
- Процессор
- Память
- Диск
- Сетевой интерфейс
Анализ загруженности сервера заключается в сборе и обработке статистики каждой из этих компонент.
Процессор
Первым делом следует проверить процессор. Самый быстрый способ — использовать top:
1 2 3 4 5 6 7 8 9 |
top - 22:20:45 up 67 days, 8:04, 2 users, load average: 0.05, 0.03, 0.05 Tasks: 88 total, 1 running, 87 sleeping, 0 stopped, 0 zombie %Cpu(s): <b>0.0 us</b>, 0.0 sy, 0.0 ni,<b>100.0 id</b>, <b>0.0 wa</b>, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 508936 total, 461096 used, 47840 free, 43056 buffers KiB Swap: 0 total, 0 used, 0 free, 237892 cached PID USER PR NI VIRT RES SHR S <b>%CPU</b> %MEM TIME+ COMMAND 8867 www-data 20 0 80316 3256 1012 S 0.3 0.6 0:16.06 nginx 30809 mysql 20 0 844m 63m 3332 S 0.3 12.9 38:30.93 mysqld |
Необходимо обратить внимание на выделенные участки. Загрузка процессора обычно не должна превышать 10…20%. Исключение составляют сервера специального назначения (например, пережиматоры фоток или медиа данных). Следующие показатели наиболее важные для анализа:
- Показатель us — пользовательские процессы. Высокий показатель означает, что наше приложение нагружает сервер.
- Показатель id — неиспользуемые ресурсы процессора. Этот показатель должен быть высоким (нормальные значения от 80 до 100).
- Показатель wa — ожидание операций ввода/вывода. Высокий показатель означает, что процессор очень долго ждет ответы от устройств ввода/вывода. Чаще всего это связано с большим количеством операций на диске.
mpstat
Более развернутую статистику можно получить используя утилиту mpstat из пакета sysstat:
1 2 |
yum install sysstat mpstat -P ALL |
Покажет детали по всем процессорам на сервере:
1 2 3 |
10:30:26 PM CPU <b>%usr</b> %nice %sys <b>%iowait</b> %irq %soft %steal %guest %gnice <b>%idle</b> 10:30:26 PM all 0.47 0.00 0.22 0.07 0.00 0.01 0.03 0.00 0.00 99.20 10:30:26 PM 0 0.47 0.00 0.22 0.07 0.00 0.01 0.03 0.00 0.00 99.20 |
htop
Инструмент htop умеет показывать нагрузку на процессор в удобном виде:
1 2 |
yum install htop htop |
1 2 3 4 5 6 7 |
<b>CPU[<strong>|</strong>| 11.3%]</b> Tasks: 62, 93 thr; 1 running Mem[<strong>|</strong><strong>|</strong><strong>|</strong><strong>|</strong><strong>|</strong><strong>|</strong><strong>|</strong>||170/497MB] Load average: 0.15 0.05 0.06 Swp[ 0/0MB] Uptime: 67 days, 08:22:09 PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 9377 root 20 0 24596 2064 1372 R 0.5 0.4 0:00.22 htop 9458 www-data 20 0 315M 7328 2824 S 0.0 1.4 0:00.50 php-fpm: pool www |
Анализ нагрузки на процессор
Если показатель загрузки процессора (us в top'e) превышает 20%, необходимо оценить возможность оптимизации приложения. Если возможная оптимизация уже была выполнена, необходимо приобретать дополнительные сервера.
В случае высокого показателя ожидания I/O (wa в top'e), необходимо провести дальнейший анализ дисковой и сетевой подсистемы (ниже).
Память
Прежде всего необходимо определить количество занятой и свободной памяти:
1 |
free |
Покажет данные об использовании памяти:
1 2 3 4 |
total used <b>free</b> shared buffers cached Mem: 508936 480540 <b>28396</b> 0 47552 258912 -/+ buffers/cache: 174076 334860 <b>Swap: 0 0 0</b> |
# Результат команды free
Важно обратить внимание на значение free. Это количество свободной памяти. Очень важным показателем является Swap. Это используемое место на диске в том случае, когда оперативной памяти перестает хватать.
Более подробную информацию об использовании оперативной памяти можно получить так:
1 |
cat /proc/meminfo |
Среди прочего увидим такие сведения:
1 2 3 4 5 6 7 8 9 10 |
MemTotal: 508936 kB <b>MemFree: 28148 kB</b> Buffers: 47836 kB Cached: 259388 kB SwapCached: 0 kB Active: 245556 kB Inactive: 178600 kB ... <b>SwapTotal: 0 kB</b> ... |
Анализ использования памяти
Малое количество свободной оперативной памяти не является проблемой. Но такая ситуация является предлогом для пристального наблюдения за сервером.
В случае же, если начинает расти Swap, необходимо срочно принимать меры:
- Добавлять оперативную память.
- Приобретать новые сервера и распределять нагрузку между ними.
Старайтесь всегда удерживать используемый своп нулевым.
Диски
Дисковая подсистема может быть нагружена, когда приложение работает с файлами. Кроме этого, диски может нагружать работа с базой данных.
Начать анализ дисков следует с проверки свободного места:
1 |
df -h |
Покажет результат по всем разделам:
1 2 3 4 |
Filesystem Size Used Avail <b>Use%</b> Mounted on rootfs 20G 2.4G 17G <b>13%</b> / udev 10M 0 10M <b>0%</b> /dev tmpfs 5.0M 0 5.0M <b>0%</b> /run/lock |
Колонка Use покажет занятое место. Для основных разделов старайтесь удерживать значение не выше 90%.
iotop
Инструмент iotop умеет показывать развернутую загрузку диска.
1 2 |
apt-get install iotop iotop |
Также будет видно распределение по процессам, которые работают с диском:
1 2 3 4 5 |
Total DISK READ : <b>0.00 B/s</b> | Total DISK WRITE : <b>2.10 M/s</b> Actual DISK READ: <b>0.00 B/s</b> | Actual DISK WRITE: <b>218.22 K/s</b> TID PRIO USER <b>DISK READ DISK WRITE</b> SWAPIN IO> COMMAND 30835 be/4 mysql <b>0.00 B/s 2.95 K/s</b> 0.00 % 0.07 % mysqld 10273 be/4 www-data <b>0.00 B/s 194.63 K/s</b> 0.00 % 0.00 % php-fpm: pool www |
В примере два процесса — mysqld и php-fpm (это php приложение) — используют операции записи на диск. Необходимо обратить внимание на показатели:
- Actual DISK READ — суммарное фактическое количество данных, читаемых с диска. Отличается от Total DISK READ из-за дискового кэша и оптимизации операций низкого уровня.
- Actual DISK WRITE — суммарное фактическое количество данных, записываемое на диск. Может отличаться от Total DISK WRITE по той же причине.
Анализ
Чтение
Если диск подвержен большому количеству чтений, правильными вариантами поведения будут:
- В случае, если большинство чтений происходит из приложения, необходимо включить кэширование APC. Если Ваше приложение читает большое количество файлов, продумайте возможность переноса их данных в кэш.
- В случае базы данных убедитесь в правильной настройке ее параметров.
- Если чтения происходят в результате обращения к Web серверу (отдача большого количества файлов), обдумайте возможность использования HTTP кэша.
Запись
Большое количество записей на диск обычно свидетельствуют о необходимости масштабироваться.
- Убедитесь, что у Вас отключены все логи доступа и отладки. Например, access_log в Nginx'e.
- Большинство записей на диск скорее всего будет генерировать база данных. В таком случае необходимо подумать о выносе ее на отдельный сервер. Дальнейшими шагами будет ее масштабирование на несколько серверов.
- Большое количество записей также могут генерировать загружаемые файлы. Читайте о масштабирование в таких случаях на примере хранилища изображений.
Сеть
Утилита cbm позволяет увидеть сетевой трафик в реальном времени:
1 2 |
yum install cbm cbm |
Увидим данные об объеме приема и передачи в секунду:
1 2 3 |
Interface Receive Transmit Total lo 10.07 MB/s 10.07 MB/s 20.13 MB/s eth0 73.15 kB/s 2.44 MB/s 2.51 MB/s |
Высокий сетевой трафик сам по себе не является проблемой. Но близкие к пиковым показатели указывают на необходимость масштабироваться в ближайшем будущем. Например, средний трафик в 95 Мбит на интерфейсе в 100 Мбит скорее всего будет означать, что текущего сервера вскоре будет недостаточно.
Общая статистика
Удобная утилита dstat покажет общую статистику сервера в реальном времени:
1 2 |
yum install dstat dstat |
Увидим данные о системе с интервалом в одну секунду:
1 2 3 4 5 6 7 8 9 10 |
----<b>total-cpu-usage</b>---- -<b>dsk/total</b>- -<b>net/total</b>- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 0 0 99 0 0 0| 873B 18k| 0 0 | 0 0 | 33 75 0 0 100 0 0 0| 0 48k| 640B 1550B| 0 0 | 31 80 0 0 100 0 0 0| 0 0 | 422B 1110B| 0 0 | 29 66 0 0 100 0 0 0| 0 0 | 590B 1110B| 0 0 | 32 70 1 0 99 0 0 0| 0 0 | 478B 1110B| 0 0 | 31 66 0 0 100 0 0 0| 0 0 | 814B 1110B| 0 0 | 34 63 0 0 100 0 0 0| 0 0 | 814B 1110B| 0 0 | 39 70 0 0 100 0 0 0| 0 20k| 814B 1110B| 0 0 | 40 75 |
Внимание следует обратить на:
- total-cpu-usage — загрузка процессора
- dsk/total — загрузка диска
- net/total — загрузка сети