Нагрузка на сервер — процент загрузки характеристик ресурсов хостинга, а именно процессора (CPU), оперативной памяти (RAM или ОЗУ) и дискового пространства, расходуемых во время выполнения текущих задач. Анализ нагрузки на сервер позволит быстро понять причины медленной работы.
Аппаратная часть любого сервера состоит из 4 основных компонентов:
- Процессор
- Память
- Диск
- Сетевой интерфейс
Анализ нагрузки на сервер заключается в сборе и обработке статистики каждой из этих компонентов.
Процессор.
В первую очередь необходимо проверить процессор.
Например можно использовать утилиту top:
root@dsde1139-22869:~# top
top - 13:29:39 up 7 days, 1:10, 1 user, load average: 0.03, 0.03, 0.00
Tasks: 104 total, 2 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 1.0 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 1.3 si, 0.3 st
MiB Mem : 969.5 total, 68.8 free, 635.9 used, 264.8 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 106.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
823 mysql 20 0 1852008 401812 0 S 1.0 40.5 81:24.20 mysqld
13 root 20 0 0 0 0 R 0.3 0.0 26:11.00 rcu_sched
695 redis 20 0 66776 4216 2100 S 0.3 0.4 19:55.21 redis-server
1 root 20 0 166044 8396 5084 S 0.0 0.8 3:30.21 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.09 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
Необходимо обратить внимание на выделенные участки, загрузка процессора обычно не должна превышать 10...20%.
Следующие показатели наиболее важные для анализа:
- us — пользовательские процессы. Высокий показатель означает, что наше приложение нагружает сервер.
- id — неиспользуемые ресурсы процессора. Этот показатель должен быть высоким (нормальные значения от 80 до 100).
- wa — ожидание операций ввода/вывода. Высокий показатель означает, что процессор очень долго ждёт ответы от устройств ввода/вывода. Чаще всего это связано с большим количеством операций на диске.
Более развёрнутую статистику можно получить используя утилиту mpstat из пакета sysstat:
apt-get install sysstat
mpstat -P ALL
Просмотр деталей по всем процессорам на сервере:
root@dsde1139-22869:~# mpstat -P ALL
Linux 5.15.0-46-generic (dsde1139-22869.fornex.org) 09/06/2022 _x86_64_ (1 CPU)
02:37:21 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:37:21 PM all 0.90 0.00 0.74 0.13 0.00 0.96 0.32 0.00 0.00 96.95
02:37:21 PM 0 0.90 0.00 0.74 0.13 0.00 0.96 0.32 0.00 0.00 96.95
Утилита htop покажет нагрузку на процессор в удобном виде:
apt-get install htop
htop
Анализ нагрузки на процессор.
Если показатель загрузки процессора (us в top'e) превышает 20%, необходимо оценить возможность оптимизации приложения, если возможная оптимизация уже была выполнена, необходимо приобретать дополнительные сервера.
В случае высокого показателя ожидания I/O (wa в top'e), необходимо провести дальнейший анализ дисковой и сетевой подсистемы (ниже).
Память.
Необходимо определить количество занятой и свободной памяти.
free
Инструмент free покажет данные об использовании памяти:
root@dsde1139-22869:~# free
total used free shared buff/cache available
Mem: 992724 655200 73968 86748 263556 104972
Swap: 0 0 0
Важно обратить внимание на значение free - это количество свободной памяти.
Очень важным показателем является Swap - это используемое место на диске в том случае, когда оперативной памяти перестаёт хватать.
Более подробную информацию об использовании оперативной памяти можно получить так:
cat /proc/meminfo
Мы увидим такие сведения:
root@dsde1139-22869:~# cat /proc/meminfo
MemTotal: 992724 kB
MemFree: 73192 kB
MemAvailable: 104864 kB
Buffers: 10856 kB
Cached: 226868 kB
SwapCached: 0 kB
Active: 95644 kB
Inactive: 686204 kB
Active(anon): 29728 kB
Inactive(anon): 610212 kB
Active(file): 65916 kB
Inactive(file): 75992 kB
Unevictable: 27624 kB
Mlocked: 27624 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 272 kB
Writeback: 0 kB
AnonPages: 571784 kB
Mapped: 99156 kB
Shmem: 86748 kB
KReclaimable: 26500 kB
Slab: 54816 kB
SReclaimable: 26500 kB
SUnreclaim: 28316 kB
KernelStack: 2668 kB
PageTables: 5548 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 496360 kB
Committed_AS: 7313844 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 17592 kB
VmallocChunk: 0 kB
Percpu: 552 kB
HardwareCorrupted: 0 kB
AnonHugePages: 2048 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
FileHugePages: 0 kB
FilePmdMapped: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 171884 kB
DirectMap2M: 876544 kB
Анализ использования памяти.
Малое количество свободной оперативной памяти не является проблемой, но такая ситуация является предлогом для пристального наблюдения за сервером.
В случае же, если начинает расти Swap, необходимо срочно принимать меры:
- Добавлять оперативную память.
- Приобретать новые сервера и распределять нагрузку между ними.
Диски.
Дисковая подсистема может быть нагружена, когда приложение работает с файлами. Кроме этого, диски может нагружать работа с базой данных.
Начать анализ дисков следует с проверки свободного места:
df -h
Покажет результат по всем разделам:
root@dsde1139-22869:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 97M 732K 97M 1% /run
/dev/vda1 9.8G 8.5G 846M 92% /
tmpfs 485M 0 485M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 97M 0 97M 0% /run/user/0
Колонка Use покажет занятое место.
Инструмент iotop умеет показывать развёрнутую загрузку диска.
apt-get install iotop
iotop
Также будет видно распределение по процессам, которые работают с диском:
root@dsde1139-22869:~# iotop
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s ?unavailable? init
2 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [rcu_gp]
4 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [rcu_par_gp]
5 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [netns]
7 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kworker/0:0H-events_highpri]
9 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [mm_percpu_wq]
10 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [rcu_tasks_rude_]
11 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [rcu_tasks_trace]
12 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [ksoftirqd/0]
13 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [rcu_sched]
14 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [migration/0]
15 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [idle_inject/0]
17 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [cpuhp/0]
18 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kdevtmpfs]
19 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [inet_frag_wq]
20 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kauditd]
21 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [khungtaskd]
22 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [oom_reaper]
23 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [writeback]
24 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kcompactd0]
25 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [ksmd]
26 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [khugepaged]
72 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kintegrityd]
73 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kblockd]
74 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [blkcg_punt_bio]
75 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [tpm_dev_wq]
76 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [ata_sff]
77 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [md]
78 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [edac-poller]
79 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [devfreq_wq]
80 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [watchdogd]
82 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kworker/0:1H-kblockd]
83 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kswapd0]
84 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [ecryptfs-kthrea]
86 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [kthrotld]
87 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [acpi_thermal_pm]
90 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [scsi_eh_0]
91 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [scsi_tmf_0]
92 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [scsi_eh_1]
93 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [scsi_tmf_1]
95 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [vfio-irqfd-clea]
96 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [mld]
97 be/4 root 0.00 B/s 0.00 B/s ?unavailable? [ipv6_addrconf]
keys: any: refresh q: quit i: ionice o: active p: procs a: accum
sort: r: asc left: SWAPIN right: COMMAND home: TID end: COMMAND
CO
Необходимо обратить внимание на показатели:
- Actual DISK READ — суммарное фактическое количество данных, читаемых с диска. Отличается от Total DISK READ из-за дискового кэша и оптимизации операций низкого уровня.
- Actual DISK WRITE — суммарное фактическое количество данных, записываемое на диск. Может отличаться от Total DISK WRITE по той же причине.
Анализ дисковой подсистемы.
Если диск подвержен большому количеству чтений, правильными вариантами поведения будут:
- В случае, если большинство чтений происходит из приложения, необходимо включить кэширование APC.
- В случае базы данных убедитесь в правильной настройке её параметров.
- Если чтения происходят в результате обращения к Web серверу, обдумайте возможность использования HTTP кэша.
Большое количество записей на диск обычно свидетельствуют о необходимости масштабироваться.
- Убедитесь, что у Вас отключены все логи доступа и отладки.
- Большинство записей на диск скорее всего будет генерировать база данных.
- Большое количество записей также могут генерировать загружаемые файлы.
Сеть.
Утилита cbm позволяет увидеть сетевой трафик в реальном времени:
apt-get install cbm
cbm
Увидим данные об объёме приёма и передачи в секунду:
Interface Receive Transmit Total
lo 0.00 B/s 0.00 B/s 0.00 B/s
eth0 35.90 kB/s 758.75 B/s 36.65 kB/s
Высокий сетевой трафик сам по себе не является проблемой. Но близкие к пиковым показатели указывают на необходимость масштабироваться в ближайшем будущем.
Общая статистика.
Утилита dstat покажет общую статистику сервера в реальном времени:
apt-get install dstat
dstat
Увидим данные о системе с интервалом в одну секунду:
root@dsde1139-22869:~# dstat
You did not select any stats, using -cdngy by default.
--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
2 1 97 0 0| 35k 29k| 0 0 | 0 0 | 683 702
1 0 99 0 0| 124k 0 | 39k 1162B| 0 0 |1003 822
3 4 86 6 1|3580k 8776k| 37k 522B| 0 0 |1161 1018
2 2 95 1 0|3888k 0 | 37k 2808B| 0 0 |1054 995
3 0 96 0 1| 0 0 | 34k 444B| 0 0 | 919 810
4 0 96 0 0| 756k 72k| 31k 702B| 0 0 | 872 790
5 2 93 0 0| 0 0 | 25k 624B| 0 0 | 739 724
1 1 97 0 1| 0 0 | 22k 436B| 0 0 | 622 638
1 1 98 0 0| 0 0 | 17k 770B| 0 0 | 520 599
1 0 99 0 0| 0 0 | 13k 436B| 0 0 | 449 572
1 0 99 0 0| 0 0 |9005B 504B| 0 0 | 376 533
0 1 98 0 1| 0 0 |7293B 648B| 0 0 | 332 495
3 1 95 1 0| 288k 244k|6697B 770B| 0 0 | 371 562
2 0 98 0 0| 0 0 |6435B 350B| 0 0 | 349 520
0 1 99 0 0| 0 0 |6971B 640B| 0 0 | 334 513
3 1 96 0 0| 0 0 | 13k 342B| 0 0 | 498 625
1 0 99 0 0| 0 0 | 22k 770B| 0 0 | 692 744
2 1 96 0 1| 0 0 | 33k 598B| 0 0 | 900 810
Внимание следует обратить на:
- total-cpu-usage — загрузка процессора
- dsk/total — загрузка диска
- net/total— загрузка сети
Если у Вас возникли трудности или появились дополнительные вопросы, вы всегда можете обращаться в нашу службу поддержки через систему тикетов.