Внутреннее устройство postgresql: временные таблицы и...

73
PostgreSQL, фрагментация памяти и временные таблицы Смолкин Григорий Петров Сергей

Upload: ontico

Post on 06-Jan-2017

223 views

Category:

Engineering


7 download

TRANSCRIPT

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

PostgreSQL, фрагментация памяти и временные таблицыСмолкин ГригорийПетров Сергей

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

Участники

● Смолкин Григорий● Петров Сергей● Попов Николай● Лубенникова Анастасия● Федор Сигаев● Пан Константин

● Жданюк Александр● Елисеев Андрей

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

Стенд Software

Centos 7.2PostgreSQL 9.5.4 +1C patchset1С Платформа 8.3.8Cluster size: 350GBВремя: 10 часов

Hardware

4 x 8core Intel(R)E7-8837 2.67GHz64GB RAMFusion ioDrive

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

Первые результаты

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

Первые результатыCPU LOAD

CPU: SYSTEM USER IDLE

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

Инструментарий

- mamonsu- strace- perf- flamegraph- atop+atopsar

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

Фрагментация памяти?

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

Memory Allocation0

1

2

3

4

5

6

7

8

9

MAX ORDER

2^0 size block

2^3 size block

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

Memory Reclamation

MIN WATERMARK

LOW WATERMARK

HIGH WATERMARK

Free Pages

Time

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

Memory Reclamation

ignore swapiness=0

MIN WATERMARK

LOW WATERMARK

HIGH WATERMARK

Free Pages

Time

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

Memory Reclamation

ignore swapiness=0

kswapd_wakeup

MIN WATERMARK

LOW WATERMARK

HIGH WATERMARK

Free Pages

Time

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

Memory Reclamation

ignore swappiness=0

kswapd_wakeup

sync_alloc

MIN WATERMARK

LOW WATERMARK

HIGH WATERMARK

Free Pages

Time

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

Memory Reclamation

ignore swapiness=0

kswapd_wakeup

sync_alloc

kswapd_sleep

MIN WATERMARK

LOW WATERMARK

HIGH WATERMARK

Free Pages

Time

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

Дефрагментация памяти

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

Дефрагментация памяти

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

Дефрагментация памяти

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

ISOLATE_MIGRATEPAGES

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

ISOLATE_FREEPAGES_BLOCK

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

MIGRATE_PAGES

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

Дефрагментация памяти

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

ISOLATE_FREEPAGES_BLOCK

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

Что делать?

vm.min_free_kbytes:

+kswapd раньше начнет работу +больше свободных страниц -меньше единовременно доступной памятиvm.extfrag_threshold = 500

Уровень фрагментации:

/sys/kernel/debug/extfrag_index

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

vm.min_free_kbytes=3%RAM

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

Резервирование места

open("base/13090/t2_1043562", O_RDWR) = 40

write(40, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192) = 8192

write(40, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192) = 8192

write(40, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192) = 8192

write(40, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192) = 8192

write(40, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192) = 8192

write(40, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192) = 8192

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

Временные таблицы

1. Привязаны к определенному серверному процессу2. Не имеют механизма сбора статистики3. Размещены в локальной памяти4. Удаляются после отключения клиента

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

Почему это плохо

1. Фрагментация памяти(8KB = 2^1 * 4KB)

2. Тройная буферизация!!!

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

Буферизация 1 2 3 a b c temp buffers

page cache

disk cache

disk

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

Буферизация 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

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

Буферизация 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

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

Что делать? TMPFS?

1. Фрагментация памяти(8KB = 2^1 * 4KB)

2. Тройная буферизация!!!

2. Двойная буферизация :)

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

TMPFS

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

Мы отправились в

отдел разработки

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

Патч №1: Отключение резервирования

Автор: Анастасия Лубенникова- отключает резервирование для временных таблиц- индексы, FSM, VM по-прежнему пишутся на диск- PostgresPro Enterprise- PostgresPro Enterprise 1C

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

Буферизация 1 2 3 a b c temp buffers

page cache

disk cache

disk

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

Буферизация 1 2 3 b c d e

a

a

a

temp buffers

page cache

disk cache

disk

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

I/O

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

Патч №1: Отключение резервирования

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

Осиротевшие временные таблицы

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

Orphan temp tables

Условия появления:

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

Orphan temp tables

Условия появления:- Крэш постгреса(питание, oom killer, etc.)

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

Orphan temp tables

Условия появления:- Крэш постгреса(питание, oom killer, etc.)- Не хватило памяти на локи

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

Orphan temp tables

Условия появления:- Крэш постгреса(питание, oom killer, etc.)- Не хватило памяти на локи

Симптомы:

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

Orphan temp tables

Условия появления:- Крэш постгреса(питание, oom killer, etc.)- Не хватило памяти на локи

Симптомы:- out of shared memory

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

Orphan temp tables

Условия появления:- Крэш постгреса(питание, oom killer, etc.)- Не хватило памяти на локи

Симптомы:- out of shared memory- autovacuum «found orphan table»

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

Orphan temp tables

Почему это плохо?

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

Orphan temp tables

Почему это плохо?- Распухание каталога

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

Orphan temp tables

Почему это плохо?- Распухание каталога- Вакуум не удаляет осиротевшие таблицы

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

Orphan temp tables

Почему это плохо?- Распухание каталога- Вакуум не удаляет осиротевшие таблицы- Вакуум спамит в лог

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

Orphan temp tables

Что делать?

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

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;

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

Мы отправились в

отдел разработки

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

Патч №2: Orphan tables clean up

Автор: Константин Пан- корректная работа с локами- keep_orphan_tables = boolean- https://commitfest.postgresql.org/11/831/- PostgresPro Enterprise- PostgresPro Enterprise 1C

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

В советском PostgreSQL

СтатистикаОпределяетПлан

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

online_analyze

Расширение, призванное решить проблему сбора статистики для временных таблиц:

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

online_analyze

Расширение, призванное решить проблему сбора статистики для временных таблиц:

● Принудительно выполняет ANALYZE

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

online_analyze

Расширение, призванное решить проблему сбора статистики для временных таблиц:

● Принудительно выполняет ANALYZE● Полагается на статистику stats collector`а

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

online_analyze

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

online_analyze

При большом кол-ве таблиц:

- Чтение файла со статистикой становится дорогим

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

online_analyze

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

online_analyze

При большом кол-ве таблиц:

- Чтение файла со статистикой становится дорогим- Поиск по прочитанному хэшу становится дорогим

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

online_analyze

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

online_analyze

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

online_analyze

Отключить?

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

Патч №3: online_analyze

Автор: Фёдор Сигаев1. Реже обращаемся за статистикой2. WIP - хранить статистику в локальной памяти

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

Патч для online_analyze

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

online_analyze patch

CPU LOAD

CPU: IDLE SYSTEM USER

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

online_analyze patch

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

online_analyze off

CPU LOAD

CPU: IDLE SYSTEM USER

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

online_analyze off

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

Вопросы ?

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

Итерация