PostgreSQL, фрагментация памяти и временные таблицы Смолкин Григорий Петров Сергей
Участники ● Смолкин Григорий ● Петров Сергей ● Попов Николай ● Лубенникова Анастасия ● Федор Сигаев ● Пан Константин ● Жданюк Александр ● Елисеев Андрей
Стенд Software Centos 7.2 PostgreSQL 9.5.4 +1C patchset 1С Платформа 8.3.8 Cluster size: 350GB Время: 10 часов Hardware 4 x 8core Intel(R) E7-8837 2.67GHz 64GB RAM Fusion ioDrive
Первые результаты
Первые результаты CPU LOAD CPU: SYSTEM USER IDLE
Инструментарий - mamonsu - strace - perf - flamegraph - atop+atopsar
Фрагментация памяти?
Memory Allocation 0 1 2 3 4 5 6 7 8 9 MAX ORDER 2^0 size block 2^3 size block
Memory Reclamation MIN WATERMARK LOW WATERMARK HIGH WATERMARK Free Pages Time
Memory Reclamation ignore swapiness=0 MIN WATERMARK LOW WATERMARK HIGH WATERMARK Free Pages Time
Memory Reclamation ignore swapiness=0 kswapd_wakeup MIN WATERMARK LOW WATERMARK HIGH WATERMARK Free Pages Time
Memory Reclamation ignore swappiness=0 kswapd_wakeup sync_alloc MIN WATERMARK LOW WATERMARK HIGH WATERMARK Free Pages Time
Memory Reclamation ignore swapiness=0 kswapd_wakeup sync_alloc kswapd_sleep MIN WATERMARK LOW WATERMARK HIGH WATERMARK Free Pages Time
Дефрагментация памяти
Дефрагментация памяти
Дефрагментация памяти
ISOLATE_MIGRATEPAGES
ISOLATE_FREEPAGES_BLOCK
MIGRATE_PAGES
Дефрагментация памяти
ISOLATE_FREEPAGES_BLOCK
Что делать? vm.min_free_kbytes: +kswapd раньше начнет работу +больше свободных страниц -меньше единовременно доступной памяти vm.extfrag_threshold = 500 Уровень фрагментации: /sys/kernel/debug/extfrag_index
vm.min_free_kbytes=3%RAM
Резервирование места open("base/13090/t2_1043562", O_RDWR) = 40 write(40, "00000000000000000"..., 8192) = 8192 write(40, "00000000000000000"..., 8192) = 8192 write(40, "00000000000000000"..., 8192) = 8192 write(40, "00000000000000000"..., 8192) = 8192 write(40, "00000000000000000"..., 8192) = 8192 write(40, "00000000000000000"..., 8192) = 8192
Временные таблицы 1. Привязаны к определенному серверному процессу 2. Не имеют механизма сбора статистики 3. Размещены в локальной памяти 4. Удаляются после отключения клиента
Почему это плохо 1. Фрагментация памяти(8KB = 2^1 * 4KB) 2. Тройная буферизация!!!
Буферизация 1 2 3 a b c temp buffers page cache disk cache disk
Буферизация 1 2 3 a b c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 temp buffers page cache disk cache disk
Буферизация 1 2 3 b c d e 0 0 0 0 0 0 0 a 0 0 0 0 0 a 0 0 0 0 0 0 0 a temp buffers page cache disk cache disk
Что делать? TMPFS? 1. Фрагментация памяти(8KB = 2^1 * 4KB) 2. Тройная буферизация!!! 2. Двойная буферизация :)
TMPFS
Мы отправились в отдел разработки
Патч №1: Отключение резервирования Автор: Анастасия Лубенникова - отключает резервирование для временных таблиц - индексы, FSM, VM по-прежнему пишутся на диск - PostgresPro Enterprise - PostgresPro Enterprise 1C
Буферизация 1 2 3 a b c temp buffers page cache disk cache disk
Буферизация 1 2 3 b c d e a a a temp buffers page cache disk cache disk
I/O
Патч №1: Отключение резервирования
Осиротевшие временные таблицы
Orphan temp tables Условия появления:
Orphan temp tables Условия появления: - Крэш постгреса(питание, oom killer, etc.)
Orphan temp tables Условия появления: - Крэш постгреса(питание, oom killer, etc.) - Не хватило памяти на локи
Orphan temp tables Условия появления: - Крэш постгреса(питание, oom killer, etc.) - Не хватило памяти на локи Симптомы:
Orphan temp tables Условия появления: - Крэш постгреса(питание, oom killer, etc.) - Не хватило памяти на локи Симптомы: - out of shared memory
Orphan temp tables Условия появления: - Крэш постгреса(питание, oom killer, etc.) - Не хватило памяти на локи Симптомы: - out of shared memory - autovacuum «found orphan table»
Orphan temp tables Почему это плохо?
Orphan temp tables Почему это плохо? - Распухание каталога
Orphan temp tables Почему это плохо? - Распухание каталога - Вакуум не удаляет осиротевшие таблицы
Orphan temp tables Почему это плохо? - Распухание каталога - Вакуум не удаляет осиротевшие таблицы - Вакуум спамит в лог
Orphan temp tables Что делать?
Orphan temp tables Что делать? - Увеличить размер lock_table: lock_table = max_locks_per_transaction * (max_conn + max_pred_locks_per_transaction) - Удалить схемы с временными таблицами: DROP SCHEMA pg_temp_n CASCADE; DROP SCHEMA pg_toast_temp_n CASCADE;
Мы отправились в отдел разработки
Патч №2: Orphan tables clean up Автор: Константин Пан - корректная работа с локами - keep_orphan_tables = boolean - https://commitfest.postgresql.org/11/831/ - PostgresPro Enterprise - PostgresPro Enterprise 1C
В советском PostgreSQL Статистика Определяет План
online_analyze Расширение, призванное решить проблему сбора статистики для временных таблиц:
online_analyze Расширение, призванное решить проблему сбора статистики для временных таблиц: ● Принудительно выполняет ANALYZE
online_analyze Расширение, призванное решить проблему сбора статистики для временных таблиц: ● Принудительно выполняет ANALYZE ● Полагается на статистику stats collector`а
online_analyze
online_analyze При большом кол-ве таблиц: - Чтение файла со статистикой становится дорогим
online_analyze
online_analyze При большом кол-ве таблиц: - Чтение файла со статистикой становится дорогим - Поиск по прочитанному хэшу становится дорогим
online_analyze
online_analyze
online_analyze Отключить?
Патч №3: online_analyze Автор: Фёдор Сигаев 1. Реже обращаемся за статистикой 2. WIP - хранить статистику в локальной памяти
Патч для online_analyze
online_analyze patch CPU LOAD CPU: IDLE SYSTEM USER
online_analyze patch
online_analyze off CPU LOAD CPU: IDLE SYSTEM USER
online_analyze off
Вопросы ?
Спасибо за внимание! Контакты: g.smolkin@postgrespro.ru s.petrov@postgrespro.ru
Итерация

Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Григорий Смолкин, Сергей Петров (Postgres Professional)