Управлението на паметта в PostgreSQL е важно за подобряване на производителността на сървъра на базата данни. PostgreSQL конфигурационният файл (postgres.conf) управлява конфигурацията на сървъра на базата данни. Той използва стойностите по подразбиране на параметрите, но можем да променим тези стойности, за да отразяват по-добре работното натоварване и работната среда.
В този блог ще разгледаме тези параметри, свързани с паметта. Но преди да започнем, нека да разгледаме архитектурата на паметта в PostgreSQL.
Архитектура на паметта
Паметта в PostgreSQL може да бъде класифицирана в две категории:
- Зона на локалната памет:Тя се разпределя от всеки бекенд процес за собствена употреба.
- Област на споделена памет:Използва се от всички процеси на PostgreSQL сървър.
Зона на локалната памет
В PostgreSQL всеки бекенд процес разпределя локална памет за обработка на заявки; всяка област е разделена на подзони, чиито размери са фиксирани или променливи.
Подзоните са както следва.
Работна_мем
Изпълнителят използва тази област за сортиране на кортежи по операции ORDER BY и DISTINCT. Освен това го използва за обединяване на таблици чрез операции за обединяване и хеш-обединяване.
Maintenance_work_mem
Този параметър се използва за някои видове операции по поддръжка (VACUUM, REINDEX).
Temp_buffers
Изпълнителят използва тази област за съхранение на временни таблици.
Област на споделена памет
Областта на споделена памет се разпределя от PostgreSQL сървъра, когато се стартира. Тази област е разделена на няколко подзони с фиксиран размер.
Споделен буферен пул
PostgreSQL зарежда страници в таблици и индекси от постоянно хранилище в споделен буферен пул и след това работи директно с тях.
WAL буфер
PostgreSQL поддържа механизма WAL (Write ahead log), за да гарантира, че няма загуба на данни след повреда на сървъра. WAL данните наистина са регистрационен файл на транзакциите в PostgreSQL, а WAL буферът е буферираща област на WAL данните, преди да ги запишат в постоянно хранилище.
Регистър на записване
Регистърът на комит (CLOG) съхранява състоянията на всички транзакции и е част от механизма за контрол на паралелността. Регистраторът за записване се разпределя в споделената памет и се използва по време на обработката на транзакциите.
PostgreSQL дефинира следните четири състояния на транзакция.
- В_ПРОГРЕС
- АНГАЖИРАНО
- ПРЕКРАНЕНО
- ПОДАНГАЖИРАНО
Настройка на параметрите на паметта на PostgreSQL
Има някои важни параметри, които се препоръчват за управление на паметта в PostgreSQL. Трябва да вземете предвид следното.
Споделени_буфери
Този параметър обозначава количеството памет, използвана за споделени буфери на паметта. Параметърът shared_buffers определя колко памет е посветена на сървъра за кеширане на данни. Стойността по подразбиране на shared_buffers обикновено е 128 мегабайта (128 MB).
Стойността по подразбиране на този параметър е много ниска, тъй като на някои платформи като по-стари версии на Solaris и SGI, наличието на големи стойности изисква инвазивно действие като прекомпилиране на ядрото. Дори в съвременните Linux системи, ядрото вероятно няма да позволи задаване на shared_buffers на над 32 MB, без първо да коригирате настройките на ядрото.
Механизмът е променен в PostgreSQL 9.4 и по-нови, така че настройките на ядрото няма да се налага да се коригират там.
Ако има голямо натоварване на сървъра на базата данни, тогава задаване на висока стойност ще подобри производителността.
Ако имате специален DB сървър с 1 GB или повече RAM, разумна начална стойност за конфигурационен параметър shared_buffer е 25% от паметта във вашата система.
Стойност по подразбиране на shared_buffers =128 MB. Промяната изисква рестартиране на PostgreSQL сървъра.
Общата препоръка за задаване на споделените_буфери е както следва.
- Под 2GB памет задайте стойността на shared_buffers на 20% от общата системна памет.
- Под 32 GB памет задайте стойността на shared_buffers на 25% от общата системна памет.
- Над 32GB памет, задайте стойността на shared_buffers на 8GB
Работна_мем
Този параметър определя количеството памет, което трябва да се използва от операциите за вътрешно сортиране и хеш таблиците преди запис във временни дискови файлове. Ако се случват много сложни сортировки и имате достатъчно памет, тогава увеличаването на параметъра work_mem позволява на PostgreSQL да извършва по-големи сортировки в паметта, които ще бъдат по-бързи от еквивалентите, базирани на диск.
Имайте предвид, че за сложна заявка много операции за сортиране или хеширане може да се изпълняват паралелно. Всяка операция ще може да използва толкова памет, колкото тази стойност посочва, преди да започне да записва данни във временните файлове. Има една възможност няколко сесии да извършват такива операции едновременно. Следователно общата използвана памет може да бъде многократно по-голяма от стойността на параметъра work_mem.
Моля, не забравяйте това, когато избирате правилната стойност. Операциите за сортиране се използват за ORDER BY, DISTINCT и обединявания за сливане. Хеш таблиците се използват в хеш обединения, хеш базирана обработка на IN подзаявки и хеш базирано агрегиране.
Параметърът log_temp_files може да се използва за регистриране на сортировки, хешове и временни файлове, които могат да бъдат полезни при установяване дали сортирането се разлива на диск, вместо да се побира в паметта. Можете да проверите разливането на сортове на диск, като използвате планове EXPLAIN ANALYZE. Например, в изхода на EXPLAIN ANALYZE, ако видите реда като:„Метод на сортиране:външен диск за сливане:7528 kB “, work_mem от поне 8MB ще запази междинните данни в паметта и ще подобри времето за отговор на заявката.
Стойността по подразбиране на work_mem =4MB.
Общата препоръка за задаване на work_mem е както следва.
- Започнете с ниска стойност:32-64MB
- След това потърсете редове за „временен файл“ в регистрационните файлове
- Задайте 2-3 пъти по-голям временен файл
поддръжка _work_mem
Този параметър определя максималното количество памет, използвана от операции по поддръжка, като ВАКУУМ, СЪЗДАВАНЕ НА ИНДЕКС и ПРОМЕНЯНЕ НА ТАБЛИЦАТА ДОБАВЯНЕ НА ВЪНШЕН КЛЮЧ. Тъй като само една от тези операции може да бъде изпълнена в даден момент от сесия на база данни и една инсталация на PostgreSQL няма много от тях да се изпълняват едновременно, е безопасно да зададете стойността на maintenance_work_mem значително по-голяма от work_mem.
Задаването на по-голяма стойност може да подобри производителността при вакуумиране и възстановяване на дъмпове на база данни.
Необходимо е да запомните, че когато автоматичното вакуумиране работи, тази памет може да бъде разпределена до autovacuum_max_workers пъти, така че внимавайте да не зададете стойността по подразбиране твърде висока.
Стойността по подразбиране на maintenance_work_mem =64MB.
Общата препоръка за задаване на maintenance_work_mem е както следва.
- Задайте стойността 10% от системната памет, до 1GB
- Може би можете да го настроите дори по-високо, ако имате проблеми с ВАКУУМНОСТ
Effective_cache_size
Effective_cache_size трябва да бъде настроен на оценка на това колко памет е налична за дисково кеширане от операционната система и в самата база данни. Това е насока за това колко памет очаквате да бъде налична в операционната система и буферните кешове на PostgreSQL, а не разпределение.
PostgreSQL планирането на заявки използва тази стойност, за да разбере дали плановете, които обмисля, се очаква да се поберат в RAM или не. Ако е зададен твърде ниско, индексите може да не се използват за изпълнение на заявки по начина, по който бихте очаквали. Тъй като повечето Unix системи са доста агресивни при кеширане, поне 50% от наличната RAM памет на специален сървър на база данни ще бъде пълна с кеширани данни.
Общата препоръка за effect_cache_size е както следва.
- Задайте стойността на количеството наличен кеш на файловата система
- Ако не знаете, задайте стойността на 50% от общата системна памет
Стойността по подразбиране на effect_cache_size =4GB.
Temp_buffers
Този параметър задава максималния брой временни буфери, използвани от всяка сесия на база данни. Локалните буфери на сесията се използват само за достъп до временни таблици. Настройката на този параметър може да се променя в рамките на отделни сесии, но само преди първото използване на временни таблици в рамките на сесията.
PostgreSQL базата данни използва тази област на паметта за съхраняване на временните таблици на всяка сесия, те ще бъдат изчистени, когато връзката бъде затворена.
Стойността по подразбиране на temp_buffer =8MB.
Заключение
Разбирането на архитектурата на паметта и настройката на подходящите параметри е важно за подобряване на производителността. Това е особено необходимо за системи с високо натоварване. За по-общи съвети за настройка на производителността, моля, прегледайте този лист с читове на производителността за PostgreSQL.