Утилиты для анализа серверной нагрузки
Jul 28, 2016 15:07 · 985 words · 5 minute read
Своевременный анализ нагрузки на сервер позволяет выявить и устранить причины медленной работоспособности, а также спланировать покупку и ввод в эксплуатацию дополнительных серверных мощностей.
Анализировать необходимо 4 основных «кита» — процессор, память, дисковую и сетевую подсистему. Давайте разберемся!
Прежде всего следует обратить внимание на процессор. Чаще всего для этого используется утилита top
:
top - 10:57:05 up 21 days, 1:55, 3 users, load average: 0.95, 0.83, 0.87
Tasks: 212 total, 1 running, 211 sleeping, 0 stopped, 0 zombie
%Cpu(s): 14.9 us, 3.1 sy, 0.0 ni, 80.9 id, 0.1 wa, 0.0 hi, 1.1 si, 0.0 st
KiB Mem: 12334660 total, 9825568 used, 2509092 free, 737240 buffers
KiB Swap: 3880956 total, 221236 used, 3659720 free. 4285304 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1516 mysql 20 0 4616644 2.346g 8788 S 17.3 19.9 6069:34 mysqld
30502 www-data 20 0 125848 9572 4960 S 3.3 0.1 5:35.14 nginx
11934 www-data 20 0 551548 186760 39692 S 2.0 1.5 0:40.68 apache2
14066 www-data 20 0 549132 177820 28576 S 2.0 1.4 0:01.66 apache2
1324 root 20 0 507240 13936 5388 S 1.7 0.1 323:58.69 fail2ban-server
Наиболее важными здесь являются следующие показатели:
us
— время обработки пользовательских процессов;id
— время простоя (неиспользуемые ресурсы);wa
— время ожидания операций ввода/вывода.
Аналогичную информацию в удобочитаемом виде можно получить утилитой htop
:
1 [|||||||| 8.8%] Tasks: 128, 80 thr; 2 running
2 [|||||||| 9.0%] Load average: 1.37 1.05 0.96
3 [||||||||||||||| 18.0%] Uptime: 21 days, 02:07:35
4 [|||||| 6.2%]
Mem[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 4699/12045MB]
Swp[||||| 216/3789MB]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
1516 mysql 20 0 4508M 2402M 8788 S 33.9 19.9 101h /usr/sbin/mysqld
13146 mysql 20 0 4508M 2402M 8788 S 17.7 19.9 9:36.63 /usr/sbin/mysqld
Более подробную статистику использования процессора можно получить с помощью утилиты mpstat
:
Linux 3.16.0-4-amd64 (example.com) 06/14/2016 _x86_64_ (4 CPU)
11:02:57 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:02:57 AM all 9.77 0.00 1.85 0.24 0.00 0.48 0.00 0.00 0.00 87.66
11:02:57 AM 0 9.26 0.00 1.90 0.21 0.00 1.71 0.00 0.00 0.00 86.93
11:02:57 AM 1 9.60 0.00 1.84 0.25 0.00 0.10 0.00 0.00 0.00 88.20
11:02:57 AM 2 10.14 0.00 1.86 0.25 0.00 0.06 0.00 0.00 0.00 87.69
11:02:57 AM 3 10.09 0.00 1.81 0.26 0.00 0.06 0.00 0.00 0.00 87.79
Утилита выводит детальную информацию по всем процессорам (ядрам) на сервере.
Определить количество используемой и занятой оперативной памяти можно утилитой free
, например так:
free -h
total used free shared buffers cached
Mem: 11G 9.4G 2.3G 403M 725M 4.1G
-/+ buffers/cache: 4.6G 7.2G
Swap: 3.7G 216M 3.5G
Для получения всей доступной информации об оперативной памяти используйте команду cat /proc/meminfo
:
cat /proc/meminfo
MemTotal: 12334660 kB
MemFree: 2464328 kB
MemAvailable: 8056308 kB
Buffers: 742876 kB
Cached: 4327512 kB
SwapCached: 153412 kB
Active: 5711008 kB
Inactive: 2798280 kB
...
SwapTotal: 3880956 kB
SwapFree: 3659720 kB
...
Примечание. В нормальном случае использование свопа должно стремиться к нулю.
Анализ дисковой подсистемы обычно начинают с проверки используемого/свободного места на носителях с помощью df -h
:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 16G 3.9G 12G 26% /
udev 10M 0 10M 0% /dev
tmpfs 2.4G 265M 2.1G 11% /run
tmpfs 5.9G 1.6M 5.9G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup
/dev/mapper/vg0-www 30G 23G 6.9G 77% /var/www
/dev/mapper/vg0-mysql 15G 10G 4.7G 69% /var/lib/mysql
/dev/mapper/vg0-home 15G 48M 15G 1% /home
/dev/mapper/vg0-log 9.8G 3.2G 6.6G 33% /var/log
Утилита iotop
выведет развернутую информацию о текущем использовании диска запущенными процессами:
Total DISK READ : 7.79 K/s | Total DISK WRITE : 23.38 K/s
Actual DISK READ: 7.79 K/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
27650 be/4 mysql 7.79 K/s 0.00 B/s 0.00 % 0.04 % mysqld --basedir=/usr --datadir=/var/lib/mysql/
14520 be/4 www-data 0.00 B/s 3.90 K/s 0.00 % 0.00 % apache2 -k start
4716 be/4 www-data 0.00 B/s 3.90 K/s 0.00 % 0.00 % apache2 -d /etc/apache2 -k start
30501 be/4 www-data 0.00 B/s 11.69 K/s 0.00 % 0.00 % nginx: worker process
30502 be/4 www-data 0.00 B/s 3.90 K/s 0.00 % 0.00 % nginx: worker process
Тут интересными являются показатели Actual DISK READ
(объем данных, читаемых с диска) и Actual DISK WRITE
(объем данных, записываемых на диск). Эти значения могут отличаться от показателей Total DISK READ
и Total DISK WRITE
из-за использования дискового кеша и низкоуровневой оптимизации.
Оценить сетевой трафик в реальном времени поможет утилита cbm
:
Interface Receive Transmit Total
eth0 30.04 kB/s 245.36 kB/s 275.39 kB/s
eth1 1.44 kB/s 456.55 B/s 1.90 kB/s
lo 86.62 kB/s 86.62 kB/s 173.24 kB/s
Увидеть «все и сразу» позволяет утилита dstat
:
dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
10 2 88 0 0 0| 211k 435k| 0 0 | 187B 156B|1328 1718
30 5 62 0 0 2| 0 100k| 99k 1041k| 0 0 |2628 2662
49 12 37 0 0 2| 0 32k| 97k 1194k| 0 0 |2863 2947
29 1 69 1 0 1| 0 6940k| 81k 410k| 0 0 |1897 2187
24 2 73 0 0 1| 0 132k| 168k 338k| 0 0 |2104 2356
6 2 92 0 0 1| 48k 156k| 90k 458k| 0 0 |2120 2673
13 1 86 0 0 1| 0 88k| 72k 383k| 0 0 |1568 2001
27 1 71 1 0 1| 0 56k| 54k 270k| 0 0 |1364 1279
16 1 83 0 0 0| 0 176k| 68k 126k| 0 0 |1323 1600
1 0 99 0 0 0| 0 144k| 34k 180k| 0 0 | 684 744
6 1 93 0 0 1| 0 56k| 81k 303k| 0 0 |1495 1968
Общая статистика сервера — использование процессора (total-cpu-usage
), использование дисковой (dsk/total
) и сетевой (net/total
) подсистемы выводится в реальном времени, данные обновляются ежесекундно.
Для автоматического отслеживания указанных параметров лучше использовать системы мониторинга, например New Relic и Prometheus.