powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Настройка postgresql.conf для 20GB памяти
19 сообщений из 19, страница 1 из 1
Настройка postgresql.conf для 20GB памяти
    #39263784
NewBie77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток дорогие форумчане.

Помогите настроить postgresql.conf для 20GB памяти ,по моим расчетам и с помощью online pgtune получается такой конфиг :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ОС : CentOS 6.4
Версия : Postgresql 9.2

max_connections = 100
shared_buffers = 5GB
effective_cache_size = 15GB
work_mem = 52428kB
maintenance_work_mem = 1280MB
checkpoint_segments = 32
checkpoint_completion_target = 0.7
wal_buffers = 16MB
default_statistics_target = 100
 
(/etc/sysctl.conf):
 
kernel.shmmax=10737418240
kernel.shmall=2621440



К базе подключен OpenERP и ORM очень часто использует ORDER BY и GROUP BY. Посоветуйте пожалуйста какой конфиг сделать.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39263877
Jonhson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1 к вопросу
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39263889
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewBie77,

А вас производительность беспокоит или просто так спрашиваете?
Покажите vmstat -SM 2 и iostat 2. Без этого советы про shared_buffers нельзя раздавать.
work_mem кажется очень большим, но на этот счет нужно смотреть ваши запросы.

--
Вам бы обновиться прежде всего, 9.2 - старая.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39263900
NewBie77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tadminNewBie77,

А вас производительность беспокоит или просто так спрашиваете?
Покажите vmstat -SM 2 и iostat 2. Без этого советы про shared_buffers нельзя раздавать.
work_mem кажется очень большим, но на этот счет нужно смотреть ваши запросы.

--
Вам бы обновиться прежде всего, 9.2 - старая.
Да для производительности, на данный момент память 12GB ночью планируем поднять до 24GB и 20GB дать базе

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
[root@m~]# vmstat -SM 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5  0    680    683     11   4074    0    0    36    24    0    5  3  0 97  0  0
 3  0    680    693     11   4076    0    0     8  8136 9212 13748 25  1 73  1  0
 2  0    680    731     11   4063    0    0     0     0 1427 1899  7  0 93  0  0
 1  1    680    731     11   4063    0    0   396     4 2054 2739 10  0 89  1  0
 1  0    680    722     11   4065    0    0   632   138 12270 25668  7  1 91  1  0
^C
[root@m ~]# iostat 2
Linux 2.6.32-279.el6.x86_64 (m)         06/28/2016      _x86_64_        (12 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.67    0.02    0.27    0.22    0.00   96.82

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              16.44       864.14       586.38  571842094  388035004
sdb               0.20         7.84         0.86    5186586     569064



avg-cpu: %user %nice %system %iowait %steal %idle
11.92 0.00 2.10 1.34 0.00 84.63

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 2.50 40.00 0.00 80 0
sdb 0.00 0.00 0.00 0 0

avg-cpu: %user %nice %system %iowait %steal %idle
28.39 0.00 2.44 1.30 0.00 67.87

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 1.50 96.00 0.00 192 0
sdb 0.00 0.00 0.00 0 0
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39263983
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewBie77,
Теоретически память у вас еще есть, но лучше сильно выше 6-8G buffer cache не задирать (если сейчас 12Gb RAM).

Процент попаданий в кеш можно посмотреть так:
Код: plsql
1.
SELECT pg_size_pretty(pg_database_size(datname)),(100.0*blks_hit/NULLIF(blks_hit+blks_read, 0))::numeric(5,3) AS hitrate___ FROM pg_stat_database where datname = current_database();


Если у вас база небольшая, то и shared_buffers большой не нужен.

Вот так совсем детально, только нужно ставить модуль.
Код: plsql
1.
2.
3.
4.
5.
select pg_size_pretty(CAST(current_setting('block_size') AS int8) * max(bufferid) ) as buffersize,
(sum(case when isdirty then 1 else 0 end)*100/count(*))::numeric(5,3) as dirtypcnt,
(sum(case when usagecount >0 then 1 else 0 end)*100/count(*))::numeric(5,3) as onehitpages,
(sum(case when usagecount >=5 then 1 else 0 end)*100/count(*))::numeric(5,3) as tophitpages
from pg_buffercache where isdirty is not null;




Сколько у вас реально клиентских процессов pg?
При max_connections = 100 и work_mem = 52428kB у вас половина памяти может быть прихвачена одними лишь клиентскими соединениями.

Стоит смотреть планы медленных запросов (log_min_duration = 100)и решать, можно ли уменьшить для них work_mem в пользу shared_buffers


Обновитесь!
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39264353
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39264354
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimonz80NewBie77,




http://pgtune.leopard.in.ua/
OOps! Пост не читай, коменты пиши)
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39264500
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewBie77,

Начнём с ядра. Я смотрю на вывод:
Код: sql
1.
2.
cat /sys/kernel/mm/transparent_hugepage/enabled
sysctl -a|egrep '^vm.(dirty|swap|over)'


Параметры `vm.overcommit_memory = 2` и `vm.swappiness=0` можно прописать в /etc/sysctl.conf, vm.dirty% там же (советую почитать про эти параметры детальней).
“Прозрачные гигантские страницы” выключаются как-то так:
Код: sql
1.
2.
3.
echo >> /etc/rc.local
echo "# Stop using Transparent Huge Pages (THP)" >> /etc/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local



Теперь база. Для 20Гб я бы начал с `shared_buffers=2GB`, не больше. Тут несколько причин:
весь ввод-вывод идёт только через шареные буфера

Postgres работает через кэш операционки, поэтому горячие данные будут в кэше (либо там, либо тут) в любом случае

Если у вас высокая пишущая нагрузка, то в кэше очень быстро накапливаются грязные станицы. Это приводит к: (1) более интенсивным контрольным точкам, (2) читающие сессии могут тормозить, ибо вынуждены сбрасывать грязные страницы из кэша
Проще заставить писателей конкурировать за "холодную" часть кэша и пистаь на диск грязные страницы.
Я предпочитаю дать базе меншье шаренных буферов, нежели отдать "как можно больше" — так меньше шансов схлопотать "затыки", когда система "внезапно" блокируется на IO. Понятно, что решение основывается на нагрузочных тестах. (Кстати, тут подход "как в ORACLE" не работает, совсем.)

Независимо от размера шареных буферов, я настраиваю bgwriter как можно более аггресивно и растягиваю чекпойнты:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
alter system set bgwriter_delay = '100ms';
alter system set bgwriter_lru_maxpages = 1000;
alter system set bgwriter_lru_multiplier = 4;

alter system set wal_level to 'hot_standby';
alter system set wal_buffers to '16MB';
alter system set wal_log_hints = on;
alter system set checkpoint_segments to 64;
alter system set checkpoint_timeout to '15min';
alter system set checkpoint_completion_target to 0.8;



Обязательно аггресивный autovacuum и логгирование:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
alter system set log_destination = 'csvlog';
alter system set logging_collector = on;
alter system set log_checkpoints = on;
alter system set log_connections = on;
alter system set log_disconnections = on;
alter system set log_lock_waits = on;
alter system set log_temp_files = 0;
alter system set log_min_duration_statement = 100;
alter system set log_min_messages = 'info';
alter system set log_min_error_statement = 'warning';
alter system set log_filename = 'postgresql-%a.log';
alter system set log_truncate_on_rotation = 'on';

alter system set autovacuum = on;
alter system set autovacuum_max_workers = 20;
alter system set autovacuum_vacuum_scale_factor = 0.005;
alter system set autovacuum_analyze_scale_factor = 0.02;
alter system set log_autovacuum_min_duration = 1000;



И ещё, про память:

`maintenance_work_mem` требуется (у меня) в основном при создании индексов, что нечасто. Ставлю в 1GB.

`autovacuum_work_mem` ставлю так, чтобы autovacuum_max_workers * autovacuum_work_mem оставляло бы достаточно памяти для нормальной работы базы, и в тоже время позволяло бы не тормозить на больших таблицах.

`effective_cache_size` не сильно влияет, потому ставлю в 80% от реально свободной памяти (free -m) для системы, проработавшей какое-то время.

`work_mem` показывает сколько памяти может съесть каждый узел в плане. Т.е. если у вас сложный запрос с хэшами и сортировками, то этот параметр можно умножать на 5,7,... — по потребности (понятно, что это для каждой сессии ). Соответственно, если держать его "высоко", то можно легко уйти в своп. Параметр планировщика, т.е. на этапе планирования выбирается либо более долгий алгоритм, работающий с диском (временные файлы), либо более шустрый, но жадный до памяти. При исполнении запроса переключения на что-то другое не произойдёт (не реализовано совсем).
Этот параметр самый "опасный" что-ли. И т.к. он пользовательского контекста (можно в сессии поменять), то я держу его на 6MB и выкручиваю по необходимости для индивидуальных запросов.

Обязательно настраиваю мониторинг, чтобы видеть дисковую нагрузку, нагрузку от контрольных точек и bgwriter-а. Анализирую логи и самые проблемные (индивидуально и суммарно) запросы, правлю настройки соответственно.
Тюнерами не пользуюсь. Предпочитаю делать так для новых систем:

настраиваю логи, bgwriter, checkpoint'ы и autovacuum как выше

собираю анамнез несколько типичных дней

правлю память по необходимости.
Настройка базы (особенно в случае Postgres'а) требует настройки также ОСи, поэтому надо ещё и в железе, и в ОСи разбираться. Или сисадминов привлекать...
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39264535
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,

ради интереса: log_min_messages = 'info', log_min_error_statement = 'warning' помогают что-то полезное отловить?
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39264568
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexius,

Не даёт особо ничего.

Это больше моя паранойя — проект развивался 4 года без ДБА (совсем), и сейчас я хочу видеть любой возможный писк в логах, чтобы проще было отстаивать своё мнение, которое ну очень не нравиться разработчикам...
Эти параметры можно оставить как есть.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39264730
NewBie77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov ,

Огромное вам спасибо за такой ответ , теперь разобрался во многом.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39325411
Фотография Rinka777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovAlexius,

Не даёт особо ничего.

Это больше моя паранойя — проект развивался 4 года без ДБА (совсем), и сейчас я хочу видеть любой возможный писк в логах, чтобы проще было отстаивать своё мнение, которое ну очень не нравиться разработчикам...
Эти параметры можно оставить как есть.

Спасибо, добрый человек!!!
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39325478
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> alter system set bgwriter_delay = '100ms';

зачем его тормозить. 10ms -- и пусть решедулится, это же всего один поток. далее смотрим дерти память в линуксе и смотрим

> alter system set checkpoint_completion_target to 0.8;

тоже не понимал этого. 1.0 -- пусть все время использует

> alter system set checkpoint_segments to 64;
> alter system set checkpoint_timeout to '15min';

ту выкручивать, чтобы только по времени триггерилось (alter system set log_checkpoints = on; и смотреть прчину, там видно). 15мин -- почему не 30? или не час? размазывать так уж размазывать. вопрос тока в размере xlog

> alter system set autovacuum = on;

по автовакууму. надо тоже его делать с минимальным временем решедулинга, далее костами (сколько за раз вакуум может сделать работы) настраивать возможные локи при записи. минимальное время на решедулинг -- повышает скорость вакуума (таблицы не пухнут при отсутствии долгих транзакций), но и повышает вал траффик.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39325595
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

Я со всем согласен. Только это уже “тонкая” (по моему разумению) настройка базы, которая была какое-то время в работе и есть понимание того, как оно всё вращается там, внутри.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39377396
NewBie77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Можно один вопрос

Код: plsql
1.
2.
3.
4.
alter system set autovacuum = on;
alter system set autovacuum_max_workers = 20;
alter system set autovacuum_vacuum_scale_factor = 0.005;
alter system set autovacuum_analyze_scale_factor = 0.02;



Эти параметры сильно зависят от оперативной памяти ? Например можно использовать его в таком виде на 4-6 ГБ памяти ? Или лучше изменить scale_factor ?
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39377531
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewBie77,

Надо смотреть на то, как часто и как долго работают autovacuum-ы.
Scale -- это проценты от размера таблицы (в записях). Чем больше будет таблица, тем реже будет AV её подхватывать.
Для "особых" таблиц (больших, или меняемых раз в сутки с принудительным вакуумом) надо прописывать индивидуальные для таблицы параметры через `ALTER TABLE`.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39377703
NewBie77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovNewBie77,

Надо смотреть на то, как часто и как долго работают autovacuum-ы.
Scale -- это проценты от размера таблицы (в записях). Чем больше будет таблица, тем реже будет AV её подхватывать.
Для "особых" таблиц (больших, или меняемых раз в сутки с принудительным вакуумом) надо прописывать индивидуальные для таблицы параметры через `ALTER TABLE`.

В среднем 5-10 секунд длится вакуум таблицы , редко но бывает что на одну таблицу нужно 40-50 сек и ниже Warning : There is already transaction in progress
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39377710
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewBie77,

В моменты, когда работает AV есть ошибки в логах? Или может он влияет на запросы?
Если нет, то я бы не дёргался.
...
Рейтинг: 0 / 0
Настройка postgresql.conf для 20GB памяти
    #39377720
NewBie77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovNewBie77,

В моменты, когда работает AV есть ошибки в логах? Или может он влияет на запросы?
Если нет, то я бы не дёргался.

Ошибок нету только Warning : There is already transaction in progress . Спасибо значит не нужно трогать
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Настройка postgresql.conf для 20GB памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]