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

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

Обновлено 9 сентября 2022 г.