SlideShare a Scribd company logo
www.postgrespro.ru
ЛОКАЛЬНАЯ ПАМЯТЬ
ПРОЦЕССОВ
Hacking PostgreSQL
28.04.2016
2
Содержание
1.Создание процесса
2.SysCache
3.PlanCache
4.MemoryContexts
5.work_mem
6.maintenance_work_mem
3
Память в PostgreSQL
4
5
Локальная память
src/include/utils/
src/include/storage/proc.h
src/backend/utils/cache
attoptcache.c catcache.c evtcache.c inval.c lsyscache.c
plancache.c relcache.c relfilenodemap.c relmapper.c
spccache.c syscache.c ts_cache.c typcache.c
src/backend/utils/mmgr
src/backend/storage/lmgr/proc.c
src/backend/utils/init/postinit.c
6
EXEC_BACKEND
src/backend/main/main.c
main()
startup_hacks(); //Platform-specific startup hacks
#ifdef EXEC_BACKEND
if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)
SubPostmasterMain(argc, argv);
#endif
if (argc > 1 && strcmp(argv[1], "--boot") == 0)
AuxiliaryProcessMain(argc, argv);
else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0)
GucInfoMain();
else if (argc > 1 && strcmp(argv[1], "--single") == 0)
PostgresMain(argc, argv,
NULL, /* no dbname */
Strdup(get_user_name_or_exit(progname)));
else
PostmasterMain(argc, argv);
7
Создание процесса
PostgresMain()
InitProcess() //инициализировать структуру PGPROC для процесса
InitPostgres(dbname, InvalidOid, username, InvalidOid, NULL);
InitProcessPhase2(); //добавить запись PGPROC в ProcArray
ProcSignalInit(MyBackendId); //добавить запись в ProcSignal
RegisterTimeout(IDLE_IN_TRANSACTION_SESSION_TIMEOUT,
IdleInTransactionSessionTimeoutHandler);
RelationCacheInitialize(); //хэш-таблица RelationIdCache
InitCatalogCache(); //массив CatCache *SysCache[SysCacheSize]
InitPlanCache(); //регистрация callback-функций
RelationCacheInitializePhase2(); //кэшировать записи основных глобальных
//таблиц каталога
...
8
Чтение данных каталога в кэш
RelationCacheInitializePhase2()
RelationMapInitializePhase2() //загрузить данные из pg_filenode.map
if (!load_relcache_init_file(true)) //пытаемся прочитать pg_internal.init
{
formrdesc("pg_database", DatabaseRelation_Rowtype_Id, true,
true, Natts_pg_database, Desc_pg_database);
formrdesc("pg_authid", AuthIdRelation_Rowtype_Id, true,
true, Natts_pg_authid, Desc_pg_authid);
formrdesc("pg_auth_members", AuthMemRelation_Rowtype_Id, true,
false, Natts_pg_auth_members, Desc_pg_auth_members);
formrdesc("pg_shseclabel", SharedSecLabelRelation_Rowtype_Id, true,
false, Natts_pg_shseclabel, Desc_pg_shseclabel);
}
9
Чтение данных каталога в кэш
load_relcache_init_file() //пытаемся прочитать pg_internal.init
for (relno = 0; relno < num_rels; relno++)
{
//вставить запись в хэш-таблицу RelationIdCache
RelationCacheInsert(rels[relno], false);
}
formrdesc("pg_database", DatabaseRelation_Rowtype_Id, true,
true, Natts_pg_database, Desc_pg_database);
//Создать новый дескриптор relation
//инициализировать без обращения к каталогу
//вставить запись в хэш-таблицу RelationIdCache
RelationCacheInsert(relation, false);
10
11
Создание процесса
(продолжение)
PostgresMain()
InitProcess() //инициализировать структуру PGPROC для процесса
InitPostgres(dbname, InvalidOid, username, InvalidOid, NULL);
...
RelationCacheInitializePhase2(); //кэшировать основные глобальные
//таблицы каталога
PerformAuthentication(); //выполнить аутентификацию клиента
MyProc->databaseId = MyDatabaseId; //Подключиться к базе
SetDatabasePath(fullpath);
RelationCacheInitializePhase3(); //кэшировать таблицы и индексы каталога
12
Чтение данных каталога в кэш
RelationCacheInitializePhase3()
if(!load_relcache_init_file(false)) //пытаемся прочитать pg_internal.init
{
formrdesc("pg_class", RelationRelation_Rowtype_Id, false,
true, Natts_pg_class, Desc_pg_class);
formrdesc("pg_attribute", AttributeRelation_Rowtype_Id, false,
false, Natts_pg_attribute, Desc_pg_attribute);
formrdesc("pg_proc", ProcedureRelation_Rowtype_Id, false,
true, Natts_pg_proc, Desc_pg_proc);
formrdesc("pg_type", TypeRelation_Rowtype_Id, false,
true, Natts_pg_type, Desc_pg_type);
}
load_critical_index() //загружаем критические индексы
//обновляем и дополняем все записи RelationIdCache
InitCatalogCachePhase2(); //завершаем инициализацию массива SysCache
CatalogCacheInitializeCache()
13
SysCache
src/backend/utils/cache/lsyscache.c
char *get_attname(Oid relid, AttrNumber attnum);
Oid get_atttype(Oid relid, AttrNumber attnum);
Oid get_commutator(Oid opno);
Oid get_negator(Oid opno);
char *get_func_name(Oid funcid);
Oid get_func_rettype(Oid funcid);
bool func_strict(Oid funcid);
char func_volatile(Oid funcid);
14
Инвалидация кэша
src/include/storage/sinval.h
src/backend/utils/cache/inval.c
CacheInvalidateCatalog(Oid catalogId) //после CLUSTER TABLE pg_*
CacheInvalidateRelcache(Relation relation) //например, DROP INDEX
src/backend/utils/cache/catcache.c
CatalogCacheIdInvalidate(int cacheId, uint32 hashValue) //удалить записи из кэша
src/backend/commands/cluster.c
swap_relation_files() //Пример инвалидации кэша
15
16
Prepared statements
PREPARE usrrptplan (int) AS
SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
AND l.date = $2;
EXECUTE usrrptplan(1, current_date);
select * from pg_prepared_statements;
name | usrrptplan
statement | PREPARE usrrptplan (int) AS +
| SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid+
| AND l.date = $2;
prepare_time | 2016-04-28 13:42:57.3563+03
parameter_types | {integer,"time without time zone"}
from_sql | t
17
Plan cache
src/include/utils/plancache.h
src/backend/utils/cache/plancache.c
CreateCachedPlan()
CompleteCachedPlan()
SaveCachedPlan() //перенести план в долгоживущий контекст памяти
DropCachedPlan() //удалить сохранённый план
choose_custom_plan() //выбор между обобщенным и конкретным планом
BuildCachedPlan() //построить обобщённый или конкретный план
//из сохраненной информации
18
19
Memory Context API
src/include/nodes/memnodes.h
typedef struct MemoryContextData
{
NodeTag type; // всегда T_AllocSetContex
bool isReset;
bool allowInCritSection;
MemoryContextMethods *methods;
MemoryContext parent;
MemoryContext firstchild;
MemoryContext prevchild;
MemoryContext nextchild;
char *name; // Имя контекста. Для отладки
MemoryContextCallback *reset_cbs;
} MemoryContextData;
20
Дерево контекстов
Context
firstchild
parent
nextchild. . .
. . .
. . .
21
Memory Context Methods
src/include/nodes/memnodes.h
typedef struct MemoryContextMethods
{
void *(*alloc) (MemoryContext context, Size size);
/* call this free_p in case someone #define's free() */
void (*free_p) (MemoryContext context, void *pointer);
void *(*realloc) (MemoryContext context, void *pointer, Size size);
void (*init) (MemoryContext context);
void (*reset) (MemoryContext context);
void (*delete_context) (MemoryContext context);
Size (*get_chunk_space) (MemoryContext context, void *pointer);
bool (*is_empty) (MemoryContext context);
void (*stats) (MemoryContext context, int level, bool print,
MemoryContextCounters *totals);
#ifdef MEMORY_CONTEXT_CHECKING
void (*check) (MemoryContext context);
#endif
} MemoryContextMethods;
22
AllocSetMethods
src/backend/utils/mmgr/aset.c
static MemoryContextMethods AllocSetMethods = {
AllocSetAlloc,
AllocSetFree,
AllocSetRealloc,
AllocSetInit,
AllocSetReset,
AllocSetDelete,
AllocSetGetChunkSpace,
AllocSetIsEmpty,
AllocSetStats
#ifdef MEMORY_CONTEXT_CHECKING
,AllocSetCheck
#endif
};
23
Контексты
src/include/utils/memutils.h
src/backend/utils/mmgr/README
TopMemoryContext; //Корень дерева контекстов
ErrorContext;
PostmasterContext;
CacheMemoryContext;
MessageContext;
TopTransactionContext;
CurTransactionContext;
CurrentMemoryContext;
24
Переключение контекстов
src/backend/utils/mmgr/mcxt.c
MemoryContext tempContext = AllocSetContextCreate(….);
MemoryContext saveContext = MemoryContextSwitchTo(tempContext);
/* делаем что-то в новом контексте */
char * x = palloc(128);
char * y = palloc(256);
. . . . . . . . . . . . . . . . . .
MemoryContextSwitchTo(saveContext);
MemoryContextDelete(tempContext);
25
AllocSetContext
src/backend/utils/mmgr/aset.c
typedef struct AllocSetContext
{
MemoryContextData header; /* Standard memory-context fields */
AllocBlock blocks; /* head of list of blocks in this set */
AllocChunk freelist[ALLOCSET_NUM_FREELISTS]; /* free chunk lists */
Size initBlockSize;
Size maxBlockSize;
Size nextBlockSize; /* next block size to allocate */
Size allocChunkLimit;
AllocBlock keeper;
} AllocSetContext;
26
AllocBlock
src/backend/utils/mmgr/aset.c
typedef struct AllocBlockData
{
AllocSet aset; /* aset that owns this block */
AllocBlock next; /* next block in aset's blocks list */
char *freeptr; /* start of free space in this block */
char *endptr; /* end of space in this block */
} AllocBlockData;
MemoryContext AllocSetContextCreate(MemoryContext parent,
const char *name,
Size minContextSize,
Size initBlockSize,
Size maxBlockSize);
27
blocks
header
header
blocks
data free
header data
header data
header data
28
AllocChunk
src/backend/utils/mmgr/aset.c
typedef struct AllocChunkData
{
/* aset is the owning aset if allocated, or the freelist link if free */
void *aset;
/* size is always the size of the usable space in the chunk */
Size size;
#ifdef MEMORY_CONTEXT_CHECKING
/* when debugging memory usage, also store actual requested size */
Size requested_size;
#endif
} AllocChunkData;
29
chunks
header data free
1 2 3 4 5
30
palloc
header data free
1 2 3 4 5
6
31
palloc
header data free
1 2 3 4 5 6
32
pfree
1 2 3 4 5 6
freelist[]
33
Источники потерь
●
Выделение множества мелких кусочков памяти
– сопоставимых с заголовком чанка (16 байт)
●
Выделение кусочков размера 2N
+ o
●
Создание множества контекстов под мелкие запросы
●
Увеличение размера выделенной памяти (repalloc)
34
Настройки памяти
●
work_mem
●
maintenance_work_mem
●
autovacuum_work_mem
●
replacement_sort_tuples
35
Источники
●
Introduction to MemoryContexts by Tomas Vondra
●
Examples of palloc overhead by Tomas Vondra
●
Sorting Through The Ages
www.postgrespro.ru
СПАСИБО ЗА ВНИМАНИЕ!
ВОПРОСЫ?
Hacking PostgreSQL
28.04.2016
hacking@postgrespro.ru

More Related Content

PDF
Расширения для PostgreSQL
ODP
Hacking PostgreSQL. Физическое представление данных
PDF
Hacking PostgreSQL. Разделяемая память и блокировки.
PDF
Hacking PostgreSQL. Обзор исходного кода
PDF
Советы для начинающих разработчиков PostgreSQL
PDF
PostgreSQL Streaming Replication
PDF
Hunting for a C++ package manager
PDF
pgday17. How shared memory works in modern PostgreSQL
Расширения для PostgreSQL
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Обзор исходного кода
Советы для начинающих разработчиков PostgreSQL
PostgreSQL Streaming Replication
Hunting for a C++ package manager
pgday17. How shared memory works in modern PostgreSQL

What's hot (20)

PDF
Streaming replication in practice
PDF
pgconf.ru 2015.avito postgresql recovery
PDF
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
PDF
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
PPTX
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
PDF
Отладка и устранение проблем в PostgreSQL Streaming Replication.
PDF
Web осень 2013 лекция 1
PDF
Web осень 2013 лекция 3
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PDF
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
PDF
"Деплой кода процедур" Мурат Кабилов (Avito)
PDF
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
PDF
Компиляция скриптов PHP. Алексей Романенко
PPTX
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
PDF
Беспроблемная эксплуатация PostgreSQL
PDF
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
PPTX
Применение фреймворка GStreamer в системе видеонаблюдения
PDF
07 - Web-технологии. Web-сервера
PPT
Web весна 2013 лекция 3
PDF
PostgreSQL on sas/ssd/nvme/nvdimm
Streaming replication in practice
pgconf.ru 2015.avito postgresql recovery
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Web осень 2013 лекция 1
Web осень 2013 лекция 3
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Деплой кода процедур" Мурат Кабилов (Avito)
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
Компиляция скриптов PHP. Алексей Романенко
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Беспроблемная эксплуатация PostgreSQL
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Применение фреймворка GStreamer в системе видеонаблюдения
07 - Web-технологии. Web-сервера
Web весна 2013 лекция 3
PostgreSQL on sas/ssd/nvme/nvdimm

Viewers also liked (20)

PDF
Hacking PostgreSQL. Обзор архитектуры.
PDF
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
PDF
Destroying Router Security
PPT
Kpi indicator
PPT
Kpi key
DOCX
Kumpulan pantun by:ririnrosalinda abdinegara
PPT
Kpi google analytics
PDF
Архитектура и новые возможности B-tree
PDF
Page compression. PGCON_2016
PPTX
SalesRev - Boost Your Conversions and Generate More Business Without Spending...
TXT
Andre Silva Campos P (9)
PPTX
Making Awesome Experiences with Biosensors
DOC
2011-2012 AmLit Syllabus
DOC
2008-2009 AP Syllabus
PPTX
Global warming
PDF
Instructivo hidrología unamba
PPTX
Toyato cars
DOC
Survival Packet
PPT
Kpi process
Hacking PostgreSQL. Обзор архитектуры.
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Destroying Router Security
Kpi indicator
Kpi key
Kumpulan pantun by:ririnrosalinda abdinegara
Kpi google analytics
Архитектура и новые возможности B-tree
Page compression. PGCON_2016
SalesRev - Boost Your Conversions and Generate More Business Without Spending...
Andre Silva Campos P (9)
Making Awesome Experiences with Biosensors
2011-2012 AmLit Syllabus
2008-2009 AP Syllabus
Global warming
Instructivo hidrología unamba
Toyato cars
Survival Packet
Kpi process

Similar to Hacking PostgreSQL. Локальная память процессов. Контексты памяти. (20)

PDF
Where is the space, Postgres?
PDF
Вячеслав Бирюков - Как Linux работает с памятью
PDF
Как Linux работает с памятью — Вячеслав Бирюков
PDF
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
PPT
Низкоуровневая Оптимизация (Андрей Аксенов)
PPT
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
PPT
PDF
Postgresql v509
PDF
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
PDF
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
PPT
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PDF
HighLoad весна 2014 лекция 5
PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
PDF
libfpta: в памяти, с персистентностью, быстрее хайпа
PDF
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PPT
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
PDF
Call of Postgres: Advanced Operations (part 1)
PDF
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Where is the space, Postgres?
Вячеслав Бирюков - Как Linux работает с памятью
Как Linux работает с памятью — Вячеслав Бирюков
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Низкоуровневая Оптимизация (Андрей Аксенов)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Postgresql v509
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Современная операционная система: что надо знать разработчику / Александр Кри...
HighLoad весна 2014 лекция 5
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
libfpta: в памяти, с персистентностью, быстрее хайпа
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Call of Postgres: Advanced Operations (part 1)
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...

Hacking PostgreSQL. Локальная память процессов. Контексты памяти.