JavaRush /Курси /SQL SELF /Системні метрики PostgreSQL

Системні метрики PostgreSQL

SQL SELF
Рівень 46 , Лекція 0
Відкрита

Уяви, що твій сервер PostgreSQL — це ресторан, а ми — ревізори. Щоб ресторан працював стабільно, треба враховувати, скільки інгредієнтів (CPU, памʼять, диск) використовується, як часто вони закінчуються і хто це все споживає. Якщо ми це проігноруємо, наш "ресторан" або візьме забагато замовлень і не впорається, або просто впаде посеред дня. Саме тому розуміння системних метрик життєво важливе.

Ключові метрики для моніторингу PostgreSQL:

  1. CPU: показує, скільки процесорного часу витрачається на виконання запитів.
  2. Памʼять (RAM): показує, як PostgreSQL використовує оперативну памʼять, включаючи кешування запитів.
  3. Дисковий простір: мабуть, найочевидніше: ти не можеш зберегти більше даних, ніж дозволяє диск.

Наша ціль — навчитися перевіряти та інтерпретувати системні метрики PostgreSQL, щоб уникнути проблем із продуктивністю та нестачею ресурсів.

Моніторинг використання CPU

Процесор — це серце твого сервера. PostgreSQL може навантажувати процесор як для виконання складних запитів, так і для фонових задач, таких як автоаналіз і автоочистка бази (autovacuum). Якщо твоя база даних схожа на ненаситного їдця, який жадібно "їсть" CPU, настав час втрутитися.

  1. Використання системних інструментів.
    Для початку визнач, скільки процесорного часу PostgreSQL споживає на рівні системи. На Linux можна використовувати команди top або htop.

Знайди процес PostgreSQL (зазвичай він містить імʼя твоєї бази даних). Наприклад, postgres: postgres [your_query].

Зверни увагу на колонку %CPU. Якщо вона постійно "зашкалює", це тривожний сигнал.

  1. Аналіз навантаження на CPU з PostgreSQL.

PostgreSQL надає вбудовані представлення для моніторингу навантаження. Найкорисніше тут — pg_stat_activity, яке показує активні запити.

Приклад запиту:

SELECT pid, usename, query, state, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;

Що тут важливо?

  • state = 'active' покаже тільки ті запити, які зараз виконуються.
  • duration покаже, скільки часу запити вже вантажать CPU.

Практична порада:

Якщо бачиш довгий запит, який не повинен займати стільки часу, перевір, які індекси використовуються. Також можна завершити проблемний процес за допомогою pg_terminate_backend.

Приклад завершення:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'active' AND duration > interval '10 minutes';

Моніторинг використання памʼяті

Памʼять — це другий за важливістю ресурс для PostgreSQL, особливо коли йдеться про кешування даних. PostgreSQL активно використовує оперативну памʼять (через параметри work_mem і shared_buffers) для прискорення операцій.

  1. Основні параметри PostgreSQL для використання памʼяті:
  • shared_buffers: Це основний блок памʼяті, виділений для роботи PostgreSQL. Зазвичай займає 25-40% всієї оперативної памʼяті сервера.
  • work_mem: Памʼять для виконання операцій сортування та хешування в одному запиті. Чим більше значення, тим більше тимчасових операцій можна виконати в памʼяті (а не на диску).
  1. Перевірка поточних налаштувань памʼяті.

Щоб побачити, які налаштування памʼяті активні для PostgreSQL, виконай команду:

SHOW shared_buffers;
SHOW work_mem;

Приклад виводу:

1GB
4MB

Це означає, що на сервер виділено 1 ГБ памʼяті для shared_buffers і по 4 МБ для кожної операції сортування/хешування.

  1. Моніторинг памʼяті з pg_stat_activity

Ти можеш перевірити, скільки памʼяті використовують поточні зʼєднання. Для цього є зручний запит:

SELECT pid, usename, state, backend_start, pg_size_pretty(pg_backend_memory_contexts_size(pid)) AS memory_used
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY memory_used DESC;

Цей запит покаже, скільки оперативної памʼяті використовує кожне активне зʼєднання.

Порада: якщо одне із зʼєднань споживає занадто багато памʼяті, перевір, чи є в запиті операції сортування або агрегації, які можна оптимізувати.

Моніторинг дискового простору

Диск — це фінальний резерв ресурсів для PostgreSQL. Навіть якщо у тебе достатньо памʼяті та процесорних ресурсів, PostgreSQL потребує дискового простору для зберігання даних, журналів транзакцій (WAL) і тимчасових файлів.

  1. Перевірка розміру бази даних.

Почнемо з базового: визначення розміру бази даних.

SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;

Що робить цей запит?

Він показує загальний розмір поточної бази у зручному форматі (MB, GB).

  1. Перевірка розміру таблиць та індексів.

Щоб визначити "важковаговиків" у базі даних, використовуй:

SELECT relname AS table_name, pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

Приклад виводу:

table_name total_size
orders 1 GB
customers 500 MB
transactions 300 MB
  1. Моніторинг WAL (журналів транзакцій).

Якщо у тебе активна база даних, журнали транзакцій можуть швидко розростатися. Перевірити їх розмір можна так:

SELECT pg_size_pretty(pg_xlog_location_diff(pg_current_wal_lsn(), '0/0')) AS wal_size;

Висновки

Тепер у тебе є інструменти і знання, щоб слідкувати за системними метриками PostgreSQL:

  1. Використовуй htop або pg_stat_activity для моніторингу навантаження на CPU.
  2. Налаштуй параметри shared_buffers і work_mem для оптимального використання памʼяті.
  3. Регулярно перевіряй розмір бази даних, таблиць та індексів, щоб уникнути нестачі дискового простору.

Ці навички знадобляться тобі, щоб уникнути неочікуваних збоїв і підтримувати сервер PostgreSQL у відмінній формі. Думаючи про сервер, памʼятай: правильно організовані ресурси зроблять твій продукт найпопулярнішим серед клієнтів (користувачів).

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ