Мониторинг потребления системных ресурсов Linux

Contents
Introduction
Мониторинг потребления памяти
Потребление памяти отдельными процессами
free
df

Introduction

Данные о системных ресурсах можно получить из виртуальных файлов в директории

/proc

ls /proc

1 18 21 31279 43 629 acpi kallsyms self 10 18349 22 32 44 659 asound kcore slabinfo 1051 18421 23 327 45 660 buddyinfo keys softirqs 1055 19 2375 33 46 662 bus key-users stat 11 19194 24 368 482 675 cgroups kmsg swaps 11527 19359 2400 369 4925 676 cmdline kpagecount sys 11529 19402 2402 379 499 680 consoles kpageflags sysrq-trigger 11532 19570 279 380 517 684 cpuinfo loadavg sysvipc 11762 19711 282 393 5677 686 crypto locks timer_list 11764 2 283 394 571 7 devices mdstat timer_stats 11765 20 284 395 575 8 diskstats meminfo tty 11818 20027 285 396 577 8413 dma misc uptime 11819 20182 2858 397 579 8419 driver modules version 13 20311 287 398 581 8790 execdomains mounts vmallocinfo 14 20374 289 399 583 8815 fb mtrr vmstat 14600 20415 291 4 5834 8817 filesystems net zoneinfo 15 20475 292 400 5836 9 fs pagetypeinfo 16 20518 29343 401 585 9214 interrupts partitions 1672 20712 2996 402 588 9250 iomem sched_debug 1694 20839 30 403 6 9251 ioports schedstat 17 20840 31 41 60 97 irq scsi

meminfo содержит информацию о памяти

cat meminfo

MemTotal: 8009160 kB MemFree: 5474752 kB MemAvailable: 7043488 kB Buffers: 2108 kB Cached: 1830824 kB SwapCached: 0 kB Active: 1191552 kB Inactive: 907404 kB Active(anon): 310848 kB Inactive(anon): 45940 kB Active(file): 880704 kB Inactive(file): 861464 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB …

cpu содержит информацию о процессоре

cat cpuinfo

processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 142 model name : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz stepping : 12 cpu MHz : 2304.012 cache size : 8192 KB …

В Linux есть удобная программа top которая может в реальном времени показывать данные из этих виртуальных файлов, а также утилита free которая показывает свободные системные ресурсы.

В этом руководстве используются знания из следующих статей:

Мониторинг общего потребления памяти

Мониторить общее потребление памяти и процессора с помощью top

#!/bin/bash top -b | grep '%Cpu(s)\|KiB Mem'

Обратите внимание, на выдачу вашего top. В CentOS у вас может стоять по умолчанию KiB а в Ubuntu MiB

Если предполагается делать какие-то вычисления - нужно разобраться с тем, что же выдаёт top

top - 14:41:49 up 20:18, 2 users, load average: 0.51, 0.32, 0.22 Tasks: 386 total, 1 running, 385 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.8 us, 1.0 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st KiB Mem : 8008504 total, 4713352 free, 1021040 used, 2274112 buff/cache KiB Swap: 8257532 total, 8257532 free, 0 used. 6646096 avail Mem

Из руководства по top можно сделать следующие выводы:

  1. Использованная CPU это 100 минус значение id (idle)
  2. Использованная память это значение used в строке, которая начинается с KiB Mem
us, user time running un-niced user processes
sy, system time running kernel processes
ni, nice time running niced user processes
id, idle time spent in the kernel idle handler
wa, IO-wait time waiting for I/O completion
hi time spent servicing hardware interrupts
si time spent servicing software interrupts
st time stolen from this vm by the hypervisor

Исходя из этих соображений, можно воспользоваться sed , awk и bc чтобы вытащить из выдачи top нужные величины и вычислить расход ресурсов.

#!/bin/bash IDLE=$(top -b -n 1 | grep '%Cpu(s)' | sed 's/id.*//;s/^.*\,//') MEM=$(top -b -n 1 | grep 'KiB Mem' | awk '{print $8}') CPU=$(echo "100-$IDLE" | bc -l) echo "$(date '+%Y-%m-%d %H:%M:%S.%3N'),$CPU, $MEM" >> log.txt

Комментарии к скрипту

  1. Строка 1: объявление bash скрипта
  2. Строка 2:
  3. Значение перед id нужно присвоить переменной IDLE
  4. top запускается в batch режиме (-b) один раз (-n 1)
  5. grep выделяет из выдачи top строку с %Cpu(s)
  6. Первое условие sed отбрасывается всё, что правее id, включая сам id
  7. Второе условие sed отбрасывает всё, что слева от последней запятой
  8. Строка 3:
  9. top запускается в batch режиме (-b) один раз (-n 1)
  10. awk находит нужный столбец
  11. Строка 4:
  12. bc помогает вычислить разность чисел
  13. Строка 5:
  14. Дата, расход ЦПУ и расход памяти записываются в log.txt

Потребление памяти отдельными процессами

Пример, скрипта, который в течении определённого количества секунд будет из показаний top выделять данные об использовании памяти и процессора несколькими определёнными процессами.

#!/bin/bash START=$(date +%s) DURATION=2 let COUNTER=$(date +%s)-$START while [ $COUNTER -lt $DURATION ]; do echo $(date '+Y-%m-%d %H:%M:%S,%3N') >> log3.txt top -b -n 1 | grep 'node\|postgres\|nginx' | awk '{print $9,$10}' >> log.txt let COUNTER=$(date +%s)-$START done

По умолчанию top выводит столбцы в следующем порядке

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

free

Узнать количество свободной памяти можно с помощью команды free

free

total used free shared buff/cache available Mem: 32538152 7937972 19124512 423056 5475668 23841896 Swap: 2097148 0 2097148

Если совместить free с watch получится настоящий мониторинг

watch free -m

Every 2.0s: free -m Sun Jan 17 16:20:10 2021 total used free shared buff/cache available Mem: 7820 1121 4339 56 2359 6361 Swap: 8063 0 8063

Каждые две секунды значение будет обновляться

df

Состояние дисков

df
df -t ext4

-h human readable format

df -h

Filesystem Size Used Avail Use% Mounted on devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 89M 3.8G 3% /run tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/mapper/centos-root 17G 9.1G 8.0G 54% / /dev/sda1 1014M 238M 777M 24% /boot tmpfs 783M 0 783M 0% /run/user/1000

Статьи о Bash
Bash
Bash Scripting
-eq -gt …: Операторы сравнения
if else: Условные операторы
Цикл while
date
Переход на новую строку
Арифметические операции
Передать файл или пароль по SFTP в Bash скрипте
Errors Bash
Share in social media: