Нагрузка на сервер — процент загрузки характеристик ресурсов хостинга, а именно процессора (CPU), оперативной памяти (RAM или ОЗУ) и дискового пространства, расходуемых во время выполнения текущих задач. Анализ нагрузки на сервер позволит быстро понять причины медленной работы.

    Аппаратная часть любого сервера состоит из 4 основных компонентов:

    • Процессор
    • Память
    • Диск
    • Сетевой интерфейс

    Анализ нагрузки на сервер заключается в сборе и обработке статистики каждой из этих компонентов.

    Процессор.

    В первую очередь необходимо проверить процессор.
    Например можно использовать утилиту top:

    [email protected]:~# 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  
    

    Просмотр деталей по всем процессорам на сервере:

    [email protected]:~# 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 покажет данные об использовании памяти:

    [email protected]:~# free  
                   total        used        free      shared  buff/cache   available
    Mem:          992724      655200       73968       86748      263556      104972  
    Swap:              0           0           0  
    

    Важно обратить внимание на значение free - это количество свободной памяти.
    Очень важным показателем является Swap - это используемое место на диске в том случае, когда оперативной памяти перестаёт хватать.

    Более подробную информацию об использовании оперативной памяти можно получить так:

    cat /proc/meminfo  
    

    Мы увидим такие сведения:

    [email protected]:~# 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  
    

    Покажет результат по всем разделам:

    [email protected]:~# 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  
    

    Также будет видно распределение по процессам, которые работают с диском:

    [email protected]:~# 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  
    

    Увидим данные о системе с интервалом в одну секунду:

    [email protected]:~# 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— загрузка сети

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