Производительность и мониторинг
Редактировать на GitHubfree. Почему доступной (available) памяти сейчас 2919, если свободной (free) памяти 843?Что такое buffer/cache память? Для чего нужна?Практические вопросыЕсть сервер с 32 ГБ оперативной памяти. Раньше PostgreSQL утилизировал всю память (до 99 %), но после включения HugePages он не может занять больше 16 ГБ, хотя настройки PostgreSQL не менялись. Почему?Теоретические вопросы
Что такое LA? В каких единицах измеряется?
LA (load average) -- параметр, определяющий среднюю нагрузку на систему за период времени (1 мин, 5 минут, 15 минут). Изменяется в количестве задач на одно ядро процессора. На нагрузку системы также влияет количество задач ввода-вывода и задержка сети. Также влияние на расчета LA оказывает: 1. Технология Hyper-Threading, которая делит одно физическое ядро на 2 логических, 2. Технология Turbo Bust, которая позволяет разгонять тактовую частоту процессора и работать на частоте выше заявленной, т.е. выше номинальной частоты (время на обработку одной задачи уменьшается).
Что будет если на сервере LA = 100?
Вероятно, что на сервере будет наблюдаться замедленная работа сервисов, но если параметр LA равен количеству ядер в системе или количеству потоков в системе, то данная нагрузка является нормальной.
Почему при высоких показателях значения LA на сервере может не наблюдаться проблем (консоль ssh отзывается, сервисы работают в обычном режиме)?
На параметр нагрузки LA влияет также и ожидание ввода-вывода (параметр wa в утилите top) в дисков и задержка сети. Данные параметры могут не влиять на работу основных сервисов в системе, но учитываются при расчете общей нагрузки на систему.
На основе каких параметров строится Load Average (LA)?
Ответ:
Load Average (LA) — это среднее число процессов в очереди за 1, 5 и 15 минут. Считаются все процессы, которые находятся в состояниях:
- R (Running / Runnable) — выполняются прямо сейчас на CPU или ожидают в очереди на выполнение.
- D (Uninterruptible sleep) — процессы, ожидающие завершения операций ввода-вывода (I/O wait).
📌 Итог:
LA показывает не «загруженность CPU», а сколько процессов конкурируют за CPU или ждут I/O.
Почему процесс может попадать в состояние ожидания?
Ответ:
Процесс попадает в состояние ожидания (sleep/wait), если он не может продолжить выполнение без внешнего ресурса.
Основные причины:
- Ожидание ввода-вывода (I/O wait) — диск, сеть, файловая система.
- Ожидание блокировок — mutex, семафоры, блокировка файла.
- Ожидание завершения дочернего процесса (
wait()в POSIX). - Ожидание освобождения CPU — процесс в очереди на планировщик.
- Системные вызовы, которые приостанавливают процесс (
sleep(),pause(), ожидание события).
📌 Итог: Процесс ждёт, если у него нет доступа к нужному ресурсу (CPU, I/O, синхронизация).
Можно ли выключить swap для конкретного процесса?
Ответ:
Напрямую — нет, swap в Linux управляется на уровне ядра и страниц памяти, а не отдельных процессов.
Но есть обходные способы:
- mlock()/mlockall() — системные вызовы, которые «прикрепляют» память процесса к RAM и запрещают выгрузку её страниц в swap.
- cgroups (memory cgroup) — можно настроить
memory.swappiness = 0для группы процессов, чтобы минимизировать их вытеснение в swap. - Отключить swap глобально (
swapoff -a), но это затронет все процессы.
📌 Итог:
Выключить swap только для одного процесса напрямую нельзя, но можно использовать mlock/ulimit или cgroups, чтобы его память не выгружалась.
Как в top посмотреть нагрузку на ядра процессора?
В утилите top нажать 1, чтобы отобразить все ядра в системе.
Как в top понять, какой командой был запущен процесс?
В утилите top нажать c, чтобы отобразить команды, которыми были запущены процессы.
Как посмотреть нагрузку на диски?
Нагрузку на диски можно смотреть несколькими способами:
iostat(часть пакетаsysstat) — показывает загрузку дисков, количество операций ввода-вывода, скорость чтения/записи:
iostat -x 1iotop— утилита наподобиеtop, но для дисков; отображает процессы, которые создают нагрузку:
iotopdstat— универсальный инструмент для мониторинга ресурсов, в том числе ввода-вывода:
dstat -d- Для быстрой оценки использования места на диске (но это не нагрузка, а именно занятое пространство):
df -hПредставлен вывод команды top. Что означает каждая запись в выводе?
top - 21:29:24 up 14:18, 1 user, load average: 0,78, 1,48, 1,10
Tasks: 277 total, 3 running, 274 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12,4 us, 2,5 sy, 0,1 ni, 84,8 id, 0,1 wa, 0,0 hi, 0,1 si, 0,0 st
KiB Mem : 7106404 total, 306972 free, 3127144 used, 3672288 buff/cache
KiB Swap: 8191996 total, 8191996 free, 0 used. 3270520 avail Mem- top - название утилиты.
- 21:29:24 - текущее время системы.
- up 14:18 - сколько часов:минут система работает с момента последнего запуска.
- 1 user - количество пользователей авторизованных в системе.
- load average: 0,78, 1,48, 1,10 - параметр средней нагрузки на систему за период времени 1 минута, 5 минут, 15 минут.
- 277 total - всего процессов в системе.
- 3 running - количество процессов в работе.
- 274 sleeping - количество процессов в состоянии sleeping: ожидает какого-либо события или сигнала.
- 0 stopped - количество приостановленных процессов сигналом STOP или выполнением трассировки.
- 0 zombie - количество зомби-процессов, которые завершили своё выполнение, но присутствующие в системе, чтобы дать родительскому процессу считать свой код завершения.
| Параметр | Описание |
|---|---|
| us (user) | Использование процессора пользовательским процессами |
| sy (system) | Использование процессора системным процессами |
| ni (nice) | Использование процессора процессами с измененным приоритетом с помощью команды nice |
| id (idle) | Простой процессора. Можно сказать, что это свободные ресурсы |
| wa (IO-wait) | Говорит о простое, связанным с вводом/выводом |
| hi (hardware interrupts) | Показывает сколько процессорного времени было потрачено на обслуживание аппаратного прерывания |
| si (software interrupts) | Показывает сколько процессорного времени было потрачено на обслуживание софтверного прерывания |
| st (stolen by the hypervisor) | Показывает сколько процессорного времени было «украдено» гипервизором |
KiB Mem - количество оперативной памяти в кибибайтах (кратно 1024): 7106404 total -- всего доступно оперативной памяти в системе, 306972 free -- свободно оперативной памяти для использования, 3127144 used -- использовано оперативной памяти, 3672288 buff/cache -- буферизовано/закешировано оперативной памяти.
KiB Swap - количество swap-памяти в кибибайтах (кратно 1024), которые выделено на диске: 8191996 total - всего выделено swap-памяти, 8191996 free - свободно swap-памяти 0 used - использовано swap-памяти, 3270520 avail Mem - доступно для использования swap-памяти.
Представлен вывод команды free. Почему доступной (available) памяти сейчас 2919, если свободной (free) памяти 843?
$ free -m
total used free shared buff/cache available
Mem: 6930 3598 843 183 2489 2919
Swap: 15999 4 15995- Total. Эта цифра представляет всю существующую память.
- Used вычисление общего значения оперативной памяти системы за вычетом выделенной свободной, разделяемой, буферной и кэш-памяти.
used = total - free - buff/cache- Free – свободная память в системе.
- Shared – память, используемая (преимущественно) в tmpfs
- Buffer, и Cache идентифицируют память, используемую для нужд ядра / операционной системы. Буфер и кеш складываются вместе, а сумма указывается в разделе «buff/cache».
- Available – примерное количество оперативной памяти, доступное для запуска новых приложений без использования ими раздела подкачки. В отличие от поля free, это поле принимает в расчёт страницу cache и также то, что не вся рекуперируемая (пригодная для повторного использования) память будет возвращена для рекуперации из-за того, что элементы используются в данный момент.
Что такое buffer/cache память? Для чего нужна?
buff/cache память - рассчитанная память, которая зарезервирована, но может быть освобождена при необходимости и используется для быстрого доступа программами к данным, которые находятся в оперативной памяти (быстрой памяти).
buffers — буферы в памяти — страницы памяти, зарезервированные системой для выделения их процессам, когда они затребуют этого, так же известна как heap-memory; cached — файлы, которые недавно были использованы системой/процессами и хранящиеся в памяти на случай если вскоре они снова потребуются.
Практические вопросы
Есть сервер с 32 ГБ оперативной памяти. Раньше PostgreSQL утилизировал всю память (до 99 %), но после включения HugePages он не может занять больше 16 ГБ, хотя настройки PostgreSQL не менялись. Почему?
После включения HugePages PostgreSQL стал использовать только память, выделенную под большие страницы.
Количество доступных hugepages задаётся параметром ядра vm.nr_hugepages.
Если, например, выделено 8192 страниц, а каждая HugePage = 2 МБ, то PostgreSQL сможет использовать только 8192 × 2 МБ = 16 ГБ.
Даже если в системе есть ещё свободная оперативка, PostgreSQL не сможет выйти за пределы заранее выделенных hugepages.
Проверить:
grep Huge /proc/meminfoРешение:
Увеличить количество hugepages: sysctl -w vm.nr_hugepages=16384 # для 32 ГБ
Последнее обновление: 7 окт. 2025 г., 08:07:55