Анализ нагрузки на сервер

Руководство по мониторингу за нагрузкой на вашем сервере

Нагрузка на сервер — процент загрузки характеристик ресурсов хостинга, а именно процессора (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

file

Анализ нагрузки на процессор.

Если показатель загрузки процессора (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— загрузка сети

Если у Вас возникли трудности или появились дополнительные вопросы, вы всегда можете обращаться в нашу службу поддержки через систему тикетов.

Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам