Сообщество - Postgres DBA

Postgres DBA

157 постов 27 подписчиков

Популярные теги в сообществе:

0

Экспериментальная проверка рекомендации DeepSeek по настройке autovacuum для PostgreSQL

Взято с основного технического канала Postgres DBA

Очередная иллюстрация -ЛЮБОЙ ответ нейросетей необходимо экспериментально проверять.

В случае использования советов нейросетей - древняя мудрость особенно актуальна.

В случае использования советов нейросетей - древняя мудрость особенно актуальна.

Вопрос DeepSeek

Как изменится производительность СУБД PostgreSQL при нагрузке создаваемой pgbench и количестве подключений от 5 до 100 для СУБД размером 300MB при ресурсах CPU = 2 и RAM = 2GB при изменении настроек автовакуума с настроек по умолчанию на агрессивные настройки ?

Ответ DeepSeek

Исходные параметры:

  • Размер БД: 300 MB

  • Ресурсы: 2 CPU, 2 GB RAM

  • Количество подключений: 5–100

  • Нагрузка: pgbench в режиме TPC-B (смесь SELECT/UPDATE).

  • Сравнение:
    Настройки по умолчанию:

autovacuum_vacuum_scale_factor = 0.2

autovacuum_vacuum_threshold = 50

autovacuum_vacuum_cost_delay = 20ms

autovacuum_vacuum_cost_limit = 200

Агрессивные настройки:

autovacuum_vacuum_scale_factor = 0.05 # Запуск при 5% изменений вместо 20%

autovacuum_vacuum_threshold = 25 # Нижний порог срабатывания

autovacuum_vacuum_cost_delay = 5ms # Меньшая задержка между операциями

autovacuum_vacuum_cost_limit = 1000 # Больше операций за один проход

Прогнозируемые результаты:

1. Низкая нагрузка (5–20 подключений):

  • По умолчанию:
    Автовакуум запускается редко. Мертвые кортежи накапливаются, но не критично. Производительность стабильна.
    TPS: ~600–800.

  • Агрессивные настройки:
    Автовакуум срабатывает чаще, но нагрузка от него незначительна. Мертвые кортежи удаляются своевременно.
    TPS: ~650–850 (+5–10%).

2. Средняя нагрузка (30–60 подключений):

  • По умолчанию:
    Накопление мертвых кортежей приводит к:
    Увеличению размера таблиц (из-за "раздувания").
    Замедлению SELECT (сканирование большего объема данных).
    Блокировкам при UPDATE из-за долгих вакуумных операций.
    TPS: падение до 400–500.

  • Агрессивные настройки:
    Частые, но короткие вакуум-сессии. Меньше "раздувания", быстрее доступ к данным.
    TPS: ~550–700 (+20–40%).

3. Высокая нагрузка (80–100 подключений):

  • По умолчанию:
    Критическое накопление мертвых кортежей. Автовакуум не успевает очищать данные, что вызывает:
    Резкое падение TPS (до 200–300).
    Рост времени отклика (блокировки, конкуренция за I/O).

  • Агрессивные настройки:
    Плюсы: Минимизация "раздувания", стабильный TPS (~450–600).
    Минусы: Конкуренция за ресурсы CPU между фоновым вакуумом и рабочими процессами. При 2 CPU возможны просадки из-за нехватки вычислительной мощности.

Ключевые метрики для сравнения:

  1. TPS (Transactions Per Second):
    Агрессивные настройки дадут прирост на 20–40% при 30–60 подключениях.
    При 80–100 подключениях рост TPS будет менее значительным (+10–15%) из-за ограничений CPU.

  2. Задержки (Latency):
    В агрессивном режиме задержки будут стабильнее, особенно в диапазоне 30–60 подключений.

  3. Размер таблиц (Table Bloat):
    Агрессивный автовакуум уменьшит "раздувание" на 40–60% по сравнению с настройками по умолчанию.

  4. Использование CPU:
    При агрессивных настройках нагрузка на CPU вырастет на 15–25% из-за частого выполнения вакуума.

Рекомендации:

  1. Для тестовой конфигурации (2 CPU, 2 GB RAM):
    Агрессивные настройки целесообразны при 20–60 подключениях.
    При 80–100 подключениях требуется мониторинг CPU: если загрузка достигнет 90–100%, производительность может ухудшиться.

  2. Оптимизация под высокую нагрузку:
    Увеличьте autovacuum_max_workers (если нужно параллелить вакуум).
    Настройте maintenance_work_mem (выделите 256–512 MB для операций вакуума).

  3. Дисковый I/O:
    Если диск медленный (HDD), агрессивный автовакуум может вызвать contention I/O. Используйте SSD для минимизации рисков.

Заключение:

Агрессивные настройки автовакуума улучшат производительность на 20–40% при 30–60 подключениях, предотвращая "раздувание" таблиц. Однако при экстремальной нагрузке (80–100 подключений) и ограниченных ресурсах CPU (2 ядра) возможна конкуренция за процессорное время, что снизит эффективность. Тестирование на реальной инфраструктуре с мониторингом CPU/I/O обязательно.

Результаты сравнительных экспериментов

Конфигурация виртуальной машины

CPU = 2RAM = 2GB

Версия СУБД:Postgres Pro (enterprise certified) 15.8.1 on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit

Сценарий нагрузки "Mix Without median time"

Эксперимент-1 : Настройки автовакуума по умолчанию

autovacuum_vacuum_scale_factor = 0.2

autovacuum_vacuum_threshold = 50

autovacuum_analyze_scale_factor = 0.1

autovacuum_analyze_threshold = 50

autovacuum_vacuum_cost_limit = -1

vacuum_cost_limit = 2000

autovacuum_vacuum_cost_delay = 2ms

Эксперимент-2 : "агрессивные" настройки автовакуума

autovacuum_vacuum_scale_factor = 0.01

autovacuum_vacuum_threshold = 25

autovacuum_analyze_scale_factor = 0.005

autovacuum_analyze_threshold = 10

autovacuum_vacuum_cost_limit = 2000

vacuum_cost_limit = 2000

autovacuum_vacuum_cost_delay = 2ms

maintenance_work_mem = 128MB

autovacuum_naptime = 5s

Результаты сравнительных экспериментов

Операционная скорость

Ось X - нагрузка на СУБД . Ось Y - операционная скорость

Ось X - нагрузка на СУБД . Ось Y - операционная скорость

Ожидания СУБД

Итоги и проверка гипотез DeepSeek

  1. Операционная скорость для данной СУБД и данных ресурсах ВМ - не увеличилась и даже уменьшилась до -5% при оптимальной нагрузке.

  2. Характерные ожидания - не изменились .

  3. Гипотеза нейросети о влиянии "агрессивной" настройки автовакуума на производительность СУБД - не подтвердилась:

Агрессивные настройки автовакуума улучшат производительность на 20–40% при 30–60 подключениях, предотвращая "раздувание" таблиц.

Показать полностью 3
3

Страшилка которой пугают всех DBA - очень большой размер shared_buffers

Вопрос : Какие события ожидания возникают при излишнем размере shared_buffers ?


Ответ ChatPPG:

При установке слишком большого значения для параметра shared_buffers в PostgreSQL могут возникнуть следующие проблемы и события ожидания:

1. Двойное кэширование (Double Buffering):
- Когда страница данных должна быть загружена в shared_buffers, она может сначала вытеснить существующую страницу, а затем операционная система (OS) может также вытеснить страницу, чтобы прочитать данные с диска. Это приводит к тому, что одна и та же страница хранится как в кэше PostgreSQL, так и в кэше OS, что приводит к избыточному использованию памяти и потенциально к более медленной производительности, так как страницы могут чаще читаться напрямую с диска, а не из кэша.

2. Нестабильность системы:
- Если shared_buffers установлен слишком высоко, это может привести к ошибкам нехватки памяти (out-of-memory errors) или активации механизма OOM (Out-Of-Memory) управляющего процессом, что может привести к нестабильности всей системы.

3. Затраты на очистку кэша после операций:
- После операций, таких как DROP TABLE, TRUNCATE или определенных команд COPY, PostgreSQL должна отменить большое количество буферов. При больших размерах кэша этот процесс может стать значительно более времязатратным и ресурсоемким.

4. События ожидания (Wait Events):
- Из-за избыточного использования памяти могут возникать события ожидания, связанные с операциями ввода-вывода (I/O). Например, события ожидания могут возникать из-за того, что система ожидает завершения операций чтения или записи данных с диска, что может замедлить общую производительность.

Для оптимизации использования памяти рекомендуется тщательно настроить значение shared_buffers относительно доступной оперативной памяти системы. Обычно рекомендуется устанавливать shared_buffers на значение, которое составляет от 25% до 40% от общего объема оперативной памяти, но не более 40%, чтобы избежать вышеупомянутых проблем.

Дополнительная информация о настройке shared_buffers доступна в документации PostgreSQL: [Memory Configuration](https://postgrespro.com/docs/postgrespro/15/runtime-config-r...).


Вывод - нейросеть ChatPPG не знает ответа на вопрос.
Либо , в PostgreSQL ожидания возникающие при большом размере shared_buffers не логируются. Как например , не логируются ожидания по причине утилизации CPU.


A вот ответ DeepSeek, гораздо интереснее , потому , что содержит конкретные названия событий ожидания (выделено мной):


При излишне большом размере `shared_buffers` в PostgreSQL могут возникать следующие события ожидания и проблемы:

### 1. **Увеличение времени поиска в буферном кеше**
- **Проблема**: Большой размер `shared_buffers` увеличивает время поиска данных в кеше из-за роста хеш-таблицы, управляющей буферами.
- **Ожидание**: `BufferPin` (задержки из-за конкуренции за доступ к буферам).

### 2. **Рост накладных расходов на блокировки**
- **Проблема**:
- Увеличение конкуренции за `LWLock` (легковесные блокировки), особенно за `buffer_mapping` и `buffer_content`.
- Блокировки на уровне буферов (`BufferLock`) становятся "узким местом".
- **Ожидания**:
- `LWLock: buffer_content`
- `LWLock: buffer_mapping`

### 3. **Неэффективное использование памяти**
- **Проблема**:
- Память отнимается у кеша ОС, что приводит к **двойному кешированию** (данные хранятся и в `shared_buffers`, и в кеше ОС).
- Нехватка памяти для рабочих процессов (`work_mem`, `maintenance_work_mem`).
- **Симптомы**: Увеличение операций I/O из-за отсутствия данных в кеше ОС.

### 4. **Проблемы с управлением грязными страницами**
- **Проблема**:
- При checkpoint требуется записать больше "грязных" страниц, что вызывает всплеск I/O-нагрузки.
- Увеличение времени завершения контрольных точек.
- **Ожидания**:
- `CheckpointWriteDelay` (принудительные задержки для регулировки записи).
- `WALWrite` (ожидание записи WAL).

### 5. **Деградация производительности при высокой конкуренции**
- **Проблема**:
- Множество процессов пытаются одновременно получить доступ к буферам.
- Увеличивается время освобождения буферов (`clock sweep` алгоритм замещения работает медленнее).
- **Ожидания**:
- `BufferPin`
- `IO: DataFileRead` (если данные не найдены в кеше).

### 6. **Снижение отзывчивости системы**
- **Проблема**:
- Избыточная память под `shared_buffers` может вызвать свопинг (swapping), если общая память сервера исчерпана.
- Увеличивается нагрузка на подсистему I/O и ЦП.

---

### Рекомендации:
1. **Оптимальный размер**:
- **15-25% от ОЗУ сервера** (но не более 40%).
- Пример: Для сервера с 64 ГБ ОЗУ — 8–16 ГБ.
2. **Мониторинг**:
- Следите за соотношением `cache hit ratio` в `pg_stat_bgwriter`. Если близок к 99% — увеличение `shared_buffers` не нужно.
- Анализируйте ожидания в `pg_stat_activity` и `pg_locks`.
3. **Настройка смежных параметров**:
- Увеличьте `checkpoint_timeout` и `max_wal_size` для снижения частоты контрольных точек.
- Настройте `bgwriter_delay` и `bgwriter_lru_maxpages` для эффективной записи грязных страниц.

### Пример диагностики:
```sql
-- Проверка hit ratio:
SELECT (sum(blks_hit) / sum(blks_hit + blks_read)) * 100 AS cache_hit_ratio
FROM pg_stat_database;

-- Поиск событий ожидания:
SELECT query, wait_event_type, wait_event
FROM pg_stat_activity
WHERE wait_event IS NOT NULL;
```

**Итог**: Слишком большой `shared_buffers` нарушает баланс между памятью, блокировками и I/O. Всегда тестируйте настройки под реальную нагрузку!


Самое занятное , что похоже DeepSeek тоже не знает ответа. Потому, что события BufferPin, BufferMapping, BufferContent возникают именно при недостаточном размере shared_buffers, что подтверждено экспериментально .


Итог : эксперименты нужно продолжать . Вполне может быть, что характерные ожидания , свидетельствующие о слишком большом размере shared_buffers не будут выявлены . Поживём - увидим.


Следует учитывать, что представление показывает только те ожидания, которые соответствующим образом обрабатываются в исходном коде. Если представление не показывает ожидание, это вообще говоря не означает со 100-процентной вероятностью, что процесс действительно ничего не ждет.

https://habr.com/ru/companies/postgrespro/articles/466199/


Показать полностью

Shared_buffers для очень большой БД

Вопрос:

Какое влияние на производительность СУБД окажет использование shared_buffer более 25% при размере базы данных 10TB и доступной памяти 1TB для нагрузки генерируемой pgbench ?

Ответ ChatPPG

При использовании shared_buffers более 25% от общего объема памяти, особенно в случае большой базы данных (10TB) и ограниченного объема доступной памяти (1TB), могут возникнуть следующие проблемы:

1. Двойное кэширование: Если размер shared_buffers превышает определенный порог, PostgreSQL может начать кэшировать данные, которые уже находятся в кэше операционной системы. Это приводит к тому, что одни и те же страницы данных хранятся в обоих кэшах, что ведет к избыточному использованию памяти и потенциально к снижению производительности.

2. Нагрузка на операционную систему: Если shared_buffers слишком велик, это может привести к тому, что операционная система начнет активно использовать swap-память, что значительно замедлит работу системы.

3. Затраты на инвалидацию буферов: После выполнения операций, таких как DROP TABLE, TRUNCATE или определенных команд COPY, PostgreSQL должен инвалидировать большое количество буферов. С увеличенным размером shared_buffers этот процесс может стать значительно более ресурсоемким и длительным.

4. Ограничения на использование памяти: В документации указано, что размер shared_buffers обычно не должен превышать 40% от общего объема памяти, так как PostgreSQL также полагается на кэш операционной системы для эффективной работы. [Memory Configuration](https://postgrespro.com/docs/postgrespro/15/runtime-config-r...)

Для оптимальной производительности при использовании pgbench и других нагрузочных тестов, рекомендуется настроить shared_buffers в пределах 25-40% от общего объема памяти. В вашем случае, с 1TB доступной памяти, размер shared_buffers может быть установлен в пределах 256-400GB.

Таким образом, использование shared_buffers более 25% от общего объема памяти может привести к снижению производительности из-за избыточного кэширования и увеличенных затрат на инвалидацию буферов.


Ответ DeepSeek

Использование `shared_buffers` более 25% от доступной памяти (1 ТБ) для СУБД PostgreSQL с базой данных 10 ТБ и нагрузкой от `pgbench` может оказать **неоднозначное или даже негативное влияние** на производительность. Разберем ключевые аспекты:

### 1. **Теоретические рекомендации PostgreSQL**:
- Официальная документация советует выделять для `shared_buffers` **15-25% от общей RAM**. Для 1 ТБ это 256 ГБ.
- Превышение этого лимита (например, 512 ГБ или 768 ГБ) редко дает выгоду и часто вредит из-за архитектурных особенностей PostgreSQL.

### 2. **Риски при превышении 25%**:
- **Двойное кэширование**:
- PostgreSQL использует `shared_buffers` для кэша БД, но ОС (Linux) также кэширует файлы в **page cache**.
- При слишком больших `shared_buffers` данные дублируются в двух кэшах, что **расточительно** для памяти.
- Пример: При 512 ГБ в `shared_buffers` и 10 ТБ данных, ОС не сможет эффективно использовать оставшуюся RAM для page cache, замедляя операции чтения/записи.
- **Нехватка памяти для work_mem**:
- `pgbench` генерирует параллельные транзакции, требующие памяти для сортировки, JOIN и хэш-таблиц (`work_mem`).
- Если `shared_buffers` займет >50% RAM, рабочим процессам не хватит памяти. Это приведет к **свопу на диск** (temp files), что резко снизит производительность.
- **Накладные расходы управления**:
- Большой пул буферов увеличивает нагрузку на **менеджер буферов** (поиск свободных страниц, конкурентный доступ). Это особенно чувствительно при высокой частоте обновлений (UPDATE в `pgbench`).

### 3. **Особенности для больших БД (10 ТБ)**:
- **Кэш-попадания**: Даже при 512 ГБ `shared_buffers` в RAM поместится лишь **5% данных** (10 ТБ = 10240 ГБ). Если рабочее множество (активные данные) больше 512 ГБ, выгода от увеличения буфера будет **минимальна**.
- **Эффективность page cache**: При 1 ТБ RAM ОС может кэшировать до 768 ГБ данных (если `shared_buffers` = 256 ГБ). Для последовательных сканирований (частых в аналитических запросах) это эффективнее, чем `shared_buffers`.

### 4. **Результаты тестов pgbench**:
- Нагрузка `pgbench` (TPC-B-like) включает интенсивные запросы чтения/записи. Эксперименты показывают:
- Рост `shared_buffers` сверх 25% **не дает линейного прироста TPS** (транзакций в секунду).
- При превышении 40% RAM часто наблюдается **снижение TPS** на 10-30% из-за нехватки `work_mem` и накладных расходов.
- Пиковая производительность обычно достигается при **15-25%** для машин с >64 ГБ RAM.

### 5. **Оптимальная конфигурация для 1 ТБ RAM**:
- **`shared_buffers`**: 256 ГБ (25%).
- **`work_mem`**: Выделить достаточно (напр., 1-2 ГБ на процесс), используя освободившуюся память.
- **`maintenance_work_mem`**: Увеличить для VACUUM/INDEXING (напр., 64 ГБ).
- **Кэш ОС**: Оставить ~768 ГБ для page cache — критично для больших таблиц.
- **Параметры диска**: Использовать SSD/NVMe, так как 10 ТБ не поместятся в RAM.

### Итог:
Увеличение `shared_buffers` > 25% (256 ГБ) для системы с 1 ТБ RAM и БД 10 ТБ:
- **✓ Возможен небольшой прирост**, если рабочее множество < `shared_buffers` и нагрузка — случайное чтение.
- **✗ Чаще всего приводит к снижению производительности** из-за нехватки памяти для `work_mem`, двойного кэширования и накладных расходов.

**Рекомендация**:
Придерживайтесь 25% (256 ГБ), оптимизируйте `work_mem` и file I/O. Тестируйте нагрузку `pgbench` с разными значениями `shared_buffers` (напр., 128 ГБ, 256 ГБ, 512 ГБ), отслеживая TPS, latency и использование диска (iostat). Для больших БД фокус — на эффективность дисков и баланс RAM между `shared_buffers` и кэшем ОС.


P.S. Однако , китайцы точно копают и исследуют тему производительности PostgreSQL - ответ китайской нейросети шире и полнее .


Показать полностью

Влияние размера тестовой БД pgbench на результаты нагрузочного тестирования СУБД PostgreSQL

Взято с основного технического канала Postgres DBA

Предыстория

Как размер тестовой базы данных pgbench влияет на производительность СУБД при проведении нагрузочного тестирования с использованием pgbench в качестве инструмента создания нагрузки ?

Ответ YandexGPT:

Таким образом, размер тестовой базы данных существенно влияет на производительность СУБД при нагрузочном тестировании с использованием pgbench. Увеличивая размер базы, можно наблюдать снижение производительности из-за роста времени обработки данных. Важно учитывать все параметры конфигурации и детали окружения для точного анализа и воспроизводимости тестов.

Ответ ChatPPG:

Таким образом, увеличение размера тестовой базы данных может привести к снижению производительности и количества транзакций в секунду, что важно учитывать при настройке и интерпретации результатов тестирования с использованием pgbench.

Ответ DeepSeek:

### 2. **Конфликты доступа (Contention)**
- **Маленькая база**: Выше вероятность конфликтов при параллельных обновлениях (например, в таблицах `accounts`). Это увеличивает время ожидания блокировок и снижает пропускную способность.
- **Большая база**: Данные распределены по большему числу строк, что снижает конкуренцию за одни и те же записи. Это особенно важно для тестов с высокой долей операций `UPDATE`.

...

Оптимальный размер тестовой базы зависит от целей тестирования. Для оценки максимальной производительности подходит маленькая база, а для имитации реальной нагрузки — база, сопоставимая с продакшеном по объему и структуре.

Сегодня будет интересный эксперимент по нагрузочному тестированию СУБД PostgreSQL

Результаты сравнительных экспериментов

1.Влияние размера тестовой базы данных на результаты нагрузочного тестирования СУБД PostgreSQL для слабых ВМ.

Производительность СУБД для тестовой БД большого размера - существенно ниже.

2. Влияние размера тестовой базы данных на результаты нагрузочного тестирования СУБД PostgreSQL для мощных ВМ.

Производительность СУБД для тестовой БД большого размера - существенно выше.

Общий итог

  1. Нагрузочное тестирование с использованием pgbench должно проводится с тестовой базой по размеру сопоставимой с продуктивной БД.

  2. По итогам наиболее близок к правильному и более полному результату оказался DeepSeek.

Показать полностью

Сегодня будет интересный эксперимент по нагрузочному тестированию СУБД PostgreSQL

Как обычно , для развлечения задал вопрос нейросетям :
Как размер тестовой базы данных pgbench влияет на производительность СУБД при проведении нагрузочного тестирования с использованием pgbench в качестве инструмента создания нагрузки ?

Ответ YandexGPT:

При проведении нагрузочного тестирования с использованием pgbench размер тестовой базы данных играет ключевую роль в определении производительности СУБД. Вот основные аспекты, которые следует учитывать:

Инициализация тестовой базы:

Инструмент pgbench позволяет инициализировать тестовую базу с определенным масштабом, используя параметр --scale=количество. Например, --scale=4000 задает базу размером 4000 записей.

Влияние размера базы на производительность:

Больше данных — ниже производительность: Увеличение размера базы данных может привести к снижению производительности, так как большее количество данных требует больше времени на обработку транзакций.

Кэширование: Если база данных помещается в кэш СУБД, операции могут выполняться быстрее за счет уменьшения времени доступа к диску. Однако при превышении объема кэша производительность может значительно упасть.

Внешние ключи и соединения:

При инициализации базы можно использовать параметр --foreign-keys для включения внешних ключей, что усложняет схему данных и может повлиять на время выполнения запросов.

Параметры нагрузки:

Нагрузочное тестирование с pgbench обычно включает циклы нагрузок с переменным числом клиентов (например, 1, 10, 20, 50, 100) в течение заданного времени (например, 600 секунд с параметром -T 600).

Результаты тестирования логируются в отдельные файлы, что позволяет строить графики зависимости показателей (например, транзакций в секунду или средней задержки) от числа клиентов.

Дополнительные метрики:

Помимо основных показателей, таких как TPS (транзакций в секунду), полезно отслеживать среднюю задержку (Latency average), которая показывает время выполнения транзакций.

Автоматизация с pg_perfbench:

Для точного фиксирования всех деталей окружения и результатов тестирования рекомендуется использовать инструмент pg_perfbench. Он автоматизирует сбор системной информации и генерацию отчетов, что упрощает сопоставление и анализ результатов различных тестов.

Таким образом, размер тестовой базы данных существенно влияет на производительность СУБД при нагрузочном тестировании с использованием pgbench. Увеличивая размер базы, можно наблюдать снижение производительности из-за роста времени обработки данных. Важно учитывать все параметры конфигурации и детали окружения для точного анализа и воспроизводимости тестов.


Ответ ChatPPG:

Размер тестовой базы данных может существенно влиять на результаты тестирования с использованием pgbench. Вот несколько ключевых моментов, которые стоит учесть:

1. **Коэффициент масштаба (-s)**:
- Параметр -s (или --scale) позволяет умножить количество строк в таблицах на заданный коэффициент. Например, с ключом -s 100 в таблицу pgbench_accounts будет записано 10 000 000 строк.
- Более крупные базы данных могут потребовать больше времени на выполнение операций вставки, обновления и выборки, что может повлиять на общую производительность и количество транзакций в секунду (TPS).

2. Размер таблиц и индексов:
- Большие таблицы и индексы могут увеличивать время выполнения запросов из-за увеличения времени поиска и обновления данных.
- В больших базах данных могут возникать дополнительные задержки из-за увеличения объема данных, которые нужно обрабатывать.

3. Память и кэширование:
- В больших базах данных может быть меньше данных, которые умещаются в памяти, что приводит к увеличению количества операций ввода-вывода (I/O) и замедлению производительности.
- Кэширование данных в памяти может быть менее эффективным, что также может сказаться на результатах тестирования.

4. Примеры результатов тестирования:
- В документации [pg_stat_statements](https://postgrespro.com/docs/postgresql/15/pgstatstatements#...) приведены примеры результатов тестирования с использованием pgbench. Например, при выполнении 300 транзакций с 10 клиентами можно увидеть, что время выполнения запросов может значительно различаться в зависимости от размера базы данных и количества операций.

Пример команды для инициализации базы данных с коэффициентом масштаба 10:
pgbench -i -s 10 bench


Пример команды для запуска тестирования с 10 клиентами и 300 транзакциями:
pgbench -c 10 -t 300 bench


Таким образом, увеличение размера тестовой базы данных может привести к снижению производительности и количества транзакций в секунду, что важно учитывать при настройке и интерпретации результатов тестирования с использованием pgbench.


Как обычно , в рассуждениях нейросети есть 2 принципиально слабых момента:
1-У нейросети нет результатов экспериментов и никаких фактов , только статистическая обработка текстов документации.
2-Нейросеть , в принципе не способна логически рассуждать , и не знает , что рост размера тестовой базы данных приводит к снижению количества тяжелых блокировок при выполнении update.


P.S. А вот ответ DeepSeek удивил, полнотой ответа и упоминанием влияния конкурентного обновления .


Размер тестовой базы данных в pgbench существенно влияет на производительность СУБД PostgreSQL во время нагрузочного тестирования. Вот основные аспекты этого влияния:

### 1. **Кеширование данных в памяти**
- **Маленькая база**: Если данные полностью помещаются в кеш (например, в `shared_buffers` или оперативной памяти), операции чтения выполняются быстрее, так как минимизируются обращения к диску. Это увеличивает TPS (транзакций в секунду) и снижает задержки.
- **Большая база**: При превышении объема данных над доступной памятью возникают промахи кеша, что приводит к частым чтениям с диска. Это замедляет выполнение запросов, особенно для операций `SELECT`.

### 2. **Конфликты доступа (Contention)**
- **Маленькая база**: Выше вероятность конфликтов при параллельных обновлениях (например, в таблицах `accounts`). Это увеличивает время ожидания блокировок и снижает пропускную способность.
- **Большая база**: Данные распределены по большему числу строк, что снижает конкуренцию за одни и те же записи. Это особенно важно для тестов с высокой долей операций `UPDATE`.

### 3. **Планирование запросов**
- На маленьких базах статистика, собираемая PostgreSQL, может быть недостаточно репрезентативной, что приводит к неоптимальным планам выполнения запросов (например, выбор полного сканирования вместо использования индекса).
- На больших базах оптимизатор чаще выбирает эффективные планы, так как статистика точнее отражает распределение данных.

### 4. **Нагрузка на подсистему ввода-вывода (I/O)**
- При больших размерах базы возрастает нагрузка на диск из-за:
- Чтения данных, не помещающихся в кеш.
- Записи WAL (Write-Ahead Log) и выполнения checkpoint’ов, которые требуют больше времени.
- Это может стать узким местом для write-heavy нагрузок.

### 5. **Эффективность индексов**
- Большие индексы (например, в таблице `accounts`) требуют больше ресурсов для обновления и поиска. Если они не помещаются в память, производительность снижается.

### 6. **Фоновые процессы**
- **Checkpoint**: На больших базах checkpoint’ы выполняются дольше, что может вызывать всплески нагрузки на диск.
- **Autovacuum**: Чаще срабатывает на больших базах, конкурируя с рабочими транзакциями за ресурсы.

### Примеры сценариев
- **Read-only тесты**:
- Маленькая база: Высокий TPS из-за кеширования.
- Большая база: Снижение TPS, если данные не помещаются в память.
- **Write-heavy тесты**:
- Маленькая база: Риск contention и частые блокировки.
- Большая база: Меньше конфликтов, но выше нагрузка на WAL и диск.

### Рекомендации
- Выбирайте размер базы, сопоставимый с реальными данными, чтобы тесты отражали эксплуатационные условия.
- Для тестирования предельной производительности в идеальных условиях используйте базу, которая помещается в память.
- Чтобы оценить работу с диском, задайте размер базы, превышающий доступную память.
- Увеличивайте масштабный фактор (`-s`) постепенно, анализируя, как меняется производительность.

### Заключение
Оптимальный размер тестовой базы зависит от целей тестирования. Для оценки максимальной производительности подходит маленькая база, а для имитации реальной нагрузки — база, сопоставимая с продакшеном по объему и структуре.

Показать полностью
0

Postgres Pro Machine

Интересное и перспективное направление. Но, те кто принимает решение вряд ли в ближайшее время обратят внимание.Очень ограниченный рынок . Текущие информационные системы созданы на базе старых платформ. Конечно же , переделывать никто не будет - нет бюджетов.


Postgres Pro Machine: +30% к мощности баз данных и восстановление из бэкапа на скорости 20 ТБ/ч

Представляем первую на российском рынке машину баз данных, которая объединит СУБД для работы с различными типами нагрузки.

В рамках Postgres Pro Machine из единого интерфейса можно:

🔹Управлять работой высоконагруженных транзакционных БД
🔹Горизонтально масштабировать базы данных большого размера
🔹Оркестрировать большое количество БД среднего размера
🔹Организовать работу с аналитическими запросами

⚡️За аппаратную часть отвечает Delta Computers. Postgres Pro Machine на заключительной стадии тестирований, пилотные внедрения запланированы на вторую половину 2025 года.

https://vk.com/wall-101507899_2107

Показать полностью

PG_HAZEL : Влияние checkpoint_timeout на производительность/скорость СУБД PostgreSQL - итог

Взято с основного технического канала Postgres DBA

Для лучшей скорости необходима настройка под конкретные условия трассы .

Для лучшей скорости необходима настройка под конкретные условия трассы .

Задача

Определить качественное и количественное влияние на производительность тестовой СУБД изменения параметра checkpoint_timeout для сценария нагрузки "Mix".

checkpoint_timeout (integer)

Максимальное время между автоматическими контрольными точками в WAL. Если это значение задаётся без единиц измерения, оно считается заданным в секундах. Допускаются значения от 30 секунд до одного дня. Значение по умолчанию — пять минут (5min).

Postgres Pro Enterprise : Документация: 15: 19.5. Журнал предзаписи : Компания Postgres Professional

Предварительный эксперимент

PG_HAZEL : влияние изменения checkpoint_timeout на производительности СУБД - часть 1.

Сравнительные эксперименты:

  1. Уменьшенное значение: checkpoint_timepout = 60 (1 минут).

  2. Значение по умолчанию: checkpoint_timepout = 300 (5 минут).

  3. Увеличенное значение: checkpoint_timepout = 900 (15 минут).

PG_HAZEL : Сценарий смешанной нагрузки "Mix" - для сравнения скорости СУБД.

Результаты экспериментов

Ось X - общая нагрузка на СУБД. Ось Y - апроксимированные значения операционной скорости.

Ось X - общая нагрузка на СУБД. Ось Y - апроксимированные значения операционной скорости.

Ось X - общая нагрузка на СУБД. Ось Y - операционная скорость.

Ось X - общая нагрузка на СУБД. Ось Y - операционная скорость.

Итог:

Для данной СУБД в сценарии смешанной нагрузки "Mix":

  1. Максимальная скорость СУБД достигается при значении параметра checkpoint_timeout = 60 при общей нагрузке 18 соединений.

  2. Максимальная нагрузка , после которой скорость СУБД начинает снижаться достигается при значении параметра checkpoint_timeout = 300 при общей нагрузке 26 соединений.

  3. При предельной общей нагрузке 111 соединений наибольшая скорость СУБД достигается при значении параметра checkpoint_timeout = 900.

Показать полностью 2
2

PG_HAZEL : ожидания СУБД PostgreSQL при избытке индексов

Взято с основного технического канала Postgres DBA

Классическая дилемма использования индексов - либо быстрее читать, либо быстро добавлять.

Классическая дилемма использования индексов - либо быстрее читать, либо быстро добавлять.

Начало экспериментов :

PG_HAZEL : ожидания СУБД PostgreSQL при отсутствии индексов.

Задача эксперимента

Определение и анализ характерных ожиданий, вызванных использованием индексов при массовых операциях INSERT.

Сравнительные эксперименты

Эксперимент-1 : Стандартный сценарий "Insert only"

Эксперимент-2 : Cценарий "Insert only" с использование индексов на таблице.

Сценарий "Insert only"

INSERT INTO pgbench_history (tid, bid, aid, delta, mtime)

VALUES ( current_tid , current_bid , current_aid , current_delta , CURRENT_TIMESTAMP );

Тестовая таблица

Table "public.pgbench_history"

Column | Type | Collation | Nullable | Default

--------+-----------------------------+-----------+----------+---------

tid | integer | | |

bid | integer | | |

aid | integer | | |

delta | integer | | |

mtime | timestamp without time zone | | |

filler | character(22) | | |

Foreign-key constraints:

"pgbench_history_aid_fkey" FOREIGN KEY (aid) EFERENCES pgbench_accounts(aid)

"pgbench_history_bid_fkey" FOREIGN KEY (bid) REFERENCES pgbench_branches(bid)

"pgbench_history_tid_fkey" FOREIGN KEY (tid) REFERENCES pgbench_tellers(tid)

Тестовая таблица с добавленными индексами (индексы по столбцам aid , delta, mtime)

Table "public.pgbench_history"

Column | Type | Collation | Nullable | Default

--------+-----------------------------+-----------+----------+---------

tid | integer | | |

bid | integer | | |

aid | integer | | |

delta | integer | | |

mtime | timestamp without time zone | | |

filler | character(22) | | |

Indexes:

"pgbench_history_idx1" btree (aid)

"pgbench_history_idx2" btree (delta)

"pgbench_history_idx3" btree (mtime)

Foreign-key constraints:

"pgbench_history_aid_fkey" FOREIGN KEY (aid) REFERENCES pgbench_accounts(aid)

"pgbench_history_bid_fkey" FOREIGN KEY (bid) REFERENCES pgbench_branches(bid)

"pgbench_history_tid_fkey" FOREIGN KEY (tid) REFERENCES pgbench_tellers(tid)

Операционная скорость и медианное время тестового SQL запроса

Сравнительная таблица операционной скорости и медианного времени выполнения тестового запроса

Сравнительная таблица операционной скорости и медианного времени выполнения тестового запроса

Ось X - нагрузка . Ось Y - операционная скорость.

Ось X - нагрузка . Ось Y - операционная скорость.

Ось X - нагрузка. Ось Y - медианного время выполнения.

Ось X - нагрузка. Ось Y - медианного время выполнения.

Результат

Создание дополнительных индексов ухудшило скорость на 16-18% и увеличило время на 24-28%.

Корреляция между типами ожиданий и ожиданиями СУБД

Сравнительная таблица ожиданий и корреляции для экспериментов

Сравнительная таблица ожиданий и корреляции для экспериментов

Результат

  1. Использование индексов резко увеличивает ожидания типа IO и LWLock.

Корреляция между типом ожидания и событиями ожидания при выполнении тестового запроса

Тип ожидания "IO"

Сравнительная таблица по ожиданиям и корреляциям тестового запроса по типу ожидания IO

Сравнительная таблица по ожиданиям и корреляциям тестового запроса по типу ожидания IO

Результат

  • Резкий рост корреляции с ожиданием DataFileRead

Тип ожидания "Lock"

Сравнительная таблица по ожиданиям и корреляциям тестового запроса по типу ожидания Lock

Сравнительная таблица по ожиданиям и корреляциям тестового запроса по типу ожидания Lock

Тип ожидания "LWLock"

Сравнительная таблица по ожиданиям и корреляциям тестового запроса по типу ожидания LWLock

Сравнительная таблица по ожиданиям и корреляциям тестового запроса по типу ожидания LWLock

Относительное изменение ожиданий по типу LWLock

Относительное изменение ожиданий по типу LWLock

Результат

Резкий рост корреляции с событием ожидания CheckpointerComm.

Итог и результаты анализа

Отключение индексов при массовых операциях вставки данных дает прирост операционной скорости 16-18% .

Характерными признаками наличия лишних индексов при преобладании операция вставки по таблице являются:

  1. Высокое значение коэффициента корреляции с событием ожидания IO/DataFileRead , LWLock/BufferMapping и LWLock/CheckpointerComm

BufferMapping : Ожидание при связывании блока данных с буфером в пуле буферов.

CheckpointerComm : Ожидание при управлении запросами fsync.

Показать полностью 9
Отличная работа, все прочитано!