SlideShare a Scribd company logo
www.postgrespro.ru
РАЗДЕЛЯЕМАЯ ПАМЯТЬ И
БЛОКИРОВКИ
Hacking PostgreSQL
21.04.2016
2
Содержание
1.Разделяемая память (shared memory)
2.Блокировки
3.Стратегии замещения
3
Память в PostgreSQL
4
Разделяемая память
src/include/storage
src/backend/storage/ipc
dsm.c procsignal.c shmqueue.c sinval.c dsm_impl.c
ipc.c procarray.c hm_mq.c sinvaladt.c ipci.c
pmsignal.c shmem.c shm_toc.c standby.c
src/backend/storage/buffer
buf_init.c bufmgr.c buf_table.c freelist.c localbuf.c
src/backend/storage/lmgr
deadlock.c lmgr.c lock.c lwlock.c s_lock.c
spin.c lwlocknames.c predicate.c proc.c
src/backend/port
5
Создание разделяемой памяти
src/backend/storage/ipc/ipci.c
CreateSharedMemoryAndSemaphores()
PGSharedMemoryCreate()
PGReserveSemaphores()
CreateLWLocks();
InitShmemIndex();
InitBufferPool();
InitLocks();
CreateSharedProcArray();
...
/*
* Now give loadable modules a chance to set up their shmem allocations
*/
if (shmem_startup_hook)
shmem_startup_hook();
6
System V, POSIX, mmap()
src/include/storage/pg_shmem.h
src/backend/port/sysv_shmem.c
PGSharedMemoryCreate()
CreateAnonymousSegment(&size);
InternalIpcMemoryCreate(NextShmemSegID, sysvsize);
typedef struct PGShmemHeader
{
int32 magic; /* magic # to identify Postgres segments */
#define PGShmemMagic 679834894
pid_t creatorPID; /* PID of creating process */
Size totalsize; /* total size of segment */
Size freeoffset; /* offset to first free space */
dsm_handle dsm_control; /* ID of dynamic shared memory control seg */
void *index; /* pointer to ShmemIndex table */
#ifndef WIN32 /* Windows doesn't have useful inode#s */
dev_t device; /* device data directory is on */
ino_t inode; /* inode number of data directory */
#endif
} PGShmemHeader;
7
Структуры данных
src/include/storage/shmem.h
src/backend/storage/ipc/shmem.c
src/backend/storage/ipc/shmqueue.c
ShmemInitStruct()
ShmemInitHash()
SHMQueueInit()
8
ShmemIndex
src/backend/storage/ipc/shmem.c
/* primary index hashtable for shmem */
static HTAB *ShmemIndex = NULL;
/* this is a hash bucket in the shmem index table */
typedef struct
{
char key[SHMEM_INDEX_KEYSIZE]; /* string name */
void *location; /* location in shared mem */
Size size; /* # bytes allocated for the structure */
} ShmemIndexEnt;
9
Разделяемая память
10
Shared buffers
src/include/storage/buf_internals.h
src/backend/storage/buffer/buf_init.c
InitBufferPool()
11
pg_buffercache
CREATE EXTENSION pg_buffercache;
select* from pg_buffercache limit 1;
bufferid | 1
relfilenode | 1262
reltablespace | 1664
reldatabase | 0
relforknumber | 0
relblocknumber | 0
isdirty | f
usagecount | 5
pinning_backends | 0
12
pg_buffercache
pgbench -i -s 200 $DBNAME
pgbench -S -c 8 -t 25000 $DBNAME
shared_buffers | size
----------------+--------
16384 | 128 MB
database_size
---------------
2998 MB
13
pg_buffercache
SELECT c.relname, count(*) AS buffers
FROM pg_class c
INNER JOIN pg_buffercache b
ON b.relfilenode=c.relfilenode
INNER JOIN pg_database d
ON (b.reldatabase=d.oid AND d.datname=current_database())
GROUP BY c.relname
ORDER BY 2 DESC
LIMIT 10;
relname | buffers
---------------------------------+---------
pgbench_accounts | 8256
pgbench_accounts_pkey | 7995
pg_amop | 5
pg_operator_oprname_l_r_n_index | 4
pg_operator | 4
pg_index | 3
pg_amop_opr_fam_index | 3
pg_amop_fam_strat_index | 3
pg_amproc_fam_proc_index | 3
pg_opclass | 3
14
pg_buffercache
SELECT usagecount,count(*),isdirty
FROM pg_buffercache
GROUP BY isdirty,usagecount
ORDER BY isdirty,usagecount;
usagecount | count | isdirty
------------+-------+---------
0 | 8063 | f
1 | 7819 | f
2 | 207 | f
3 | 18 | f
4 | 29 | f
5 | 245 | f
2 | 2 | t
5 | 1 | t
15
pg_buffercache
SELECT c.relname, pg_size_pretty(count(*) * 8192::bigint) as buffered,
round(100.0 * count(*) /
(SELECT setting FROM pg_settings WHERE
name='''shared_buffers''')::integer,1)
AS buffers_percent,
round(100.0 * count(*) * 8192 / pg_relation_size(c.oid),1)
AS percent_of_relation
FROM pg_class c
INNER JOIN pg_buffercache b
ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d
ON (b.reldatabase = d.oid AND d.datname = current_database())
GROUP BY c.oid,c.relname
ORDER BY 3 DESC
LIMIT 10;
relname | buffered | buffers_percent | percent_of_relation
-----------------------+------------+-----------------+---------------------
pgbench_accounts | 64 MB | 50.3 | 2.5
pgbench_accounts_pkey | 62 MB | 48.7 | 14.6
16
pg_buffercache
SELECT c.relname, count(*) AS buffers, usagecount
FROM pg_class c
INNER JOIN pg_buffercache b
ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d
ON (b.reldatabase = d.oid AND d.datname = current_database())
WHERE c.relname LIKE '''pgbench%'''
GROUP BY c.relname,usagecount
ORDER BY c.relname,usagecount;
relname | buffers | usagecount
-----------------------+---------+------------
pgbench_accounts | 4235 | 0
pgbench_accounts | 3980 | 1
pgbench_accounts | 28 | 2
pgbench_accounts_pkey | 3833 | 0
pgbench_accounts_pkey | 3788 | 1
pgbench_accounts_pkey | 161 | 2
pgbench_accounts_pkey | 3 | 3
pgbench_accounts_pkey | 1 | 4
pgbench_accounts_pkey | 193 | 5
17
pg_buffercache
shared_buffers | size
----------------+--------
16384 | 128 MB
relname | buffered | buffers_percent | percent_of_relation
-----------------------+------------+-----------------+---------------------
pgbench_accounts | 64 MB | 50.3 | 2.5
pgbench_accounts_pkey | 62 MB | 48.7 | 14.6
shared_buffers | size
----------------+---------
262144 | 2048 MB
relname | buffered | buffers_percent | percent_of_relation
-----------------------+------------+-----------------+---------------------
pgbench_accounts | 1180 MB | 57.6 | 46.1
pgbench_accounts_pkey | 418 MB | 20.4 | 97.5
18
Блокировки
19
Pins & Locks
●
Pin – счетчик ссылок
– state.refcount
– PinBuffer()/ UnpinBuffer()
20
Pins & Locks
●
BufferContentLock – блокировка содержимого буфера
– LWLock
21
Блокировки
●
Блокировки на уровне объектов БД (heavy-weight locks)
– pg_locks, pg_stat_activity
– определение дедлоков
– освобождаются в конце транзакции
●
LWLocks (lightweight locks)
– блокировки на чтение/запись (shared/exclusive) для структур в
разделяемой памяти
– нет определения дедлоков
– блокируют query_cancel() и die()
●
Spinlocks
– в основном инфраструктура для LWLocks
– TAS (test-and-set) инструкции процессора
– блокируют query_cancel() и die()
22
Блокировки
src/backend/storage/lmgr/README
●
Блокировки на уровне объектов БД (heavy-weight locks)
– src/backend/storage/lmgr/lmgr.c
– src/backend/storage/lmgr/lock.c
●
LWLocks (lightweight locks)
– src/backend/storage/lmgr/lwlock.c
●
Spinlocks
– src/backend/storage/lmgr/spin.c – эмуляция через семафоры
– src/backend/storage/lmgr/s_lock.c
23
Улучшения в 9.6
●
Allow Pin/UnpinBuffer to operate in a lockfree manner
– PostgreSQL на многоядерных серверах Power 8
●
Provide much better wait information in pg_stat_activity
– Мониторинг ожиданий в PostgreSQL
– Интерфейс ожиданий в PostgreSQL
– Monitoring Wait Events in PostgreSQL 9.6. pg_wait_sampling
– pg_stat_* documentation
24
Обычная стратегия замещения
src/backend/storage/buffer/freelist.c
Основано на презентации
“Illustrated guide to the buffer cache”, Selena Deckelmann
25
Обычная стратегия замещения
BufferAlloc('base/tbl', 13);
26
Обычная стратегия замещения
BufferAlloc('base/tbl', 13);
27
Обычная стратегия замещения
BufferAlloc('base/tbl', 118);
28
Обычная стратегия замещения
BufferAlloc('base/tbl', 118);
29
Обычная стратегия замещения
BufferAlloc('base/tbl', 118);
30
Обычная стратегия замещения
BufferAlloc('base/tbl', 118);
31
Обычная стратегия замещения
BufferAlloc('base/tbl', 118);
32
Background writer
●
bgwriter_delay (integer)
●
bgwriter_lru_maxpages (integer)
●
bgwriter_lru_multiplier (floating point)
●
bgwriter_flush_after (int) 9.6
33
Обычная стратегия замещения
BufferAlloc('base/tbl', 118);
34
Специальная стратегия
замещения
src/include/storage/bufmgr.h
●
SeqScan
– 256 KB
– Вытесняет dirty buffers в общее кольцо
●
VACUUM
– 256 KB
– Ожидает записи WAL на диск
●
BulkWrite (COPY IN, CREATE TABLE AS SELECT)
– 16 MB
– Ожидает записи WAL на диск
●
Возможно стоит использовать BulkWrite стратегию для UPDATE и
DELETE на больших таблицах
35
Улучшения в 9.6
●
Allow to trigger kernel writeback after a configurable number of
writes.
●
Checkpoint sorting and balancing.
●
Extend relations multiple blocks at a time to improve scalability.
36
Проблемы: Hash-таблица
●
Hash-таблица
– Большие ключи
– Нельзя эффективно упорядочивать страницы
– Удаление таблиц дорогое (?)
Решение: Замена hash-таблицы на Tree of Radix tree.
37
Проблемы: clock sweep
●
Clock sweep
– Каждый бэкенд выполняет clock sweep сам
Решение: передать эту работу отдельному бэкенд процессу.
●
Clock sweep
– В худшем случае нужно прочитать Nbuffers*5 буферов
– Часто большинство буферов имеют usagecount=5
(это и есть худший случай)
●
Буферы никогда не возвращаются во freelist
●
bg_writer_delay – задается фиксированно
Решение: ???
38
Проблемы
●
Двойная буферизация менее эффективна
Решение: использовать O_DIRECT ?
39
Источники
●
Monitoring PostgreSQL Buffer Cache Internals. 2010
●
Illustrated buffer cache. 2010
●
Setting up shared memory for PostgreSQL. 2013
●
Inside PostgreSQL Shared Memory. 2015
●
CheckPoint Internals of PostgreSQL and Oracle. 2013
●
Improving Postgres' Buffer Manager. 2016
www.postgrespro.ru
СПАСИБО ЗА ВНИМАНИЕ!
ВОПРОСЫ?
Hacking PostgreSQL
21.04.2016
hacking@postgrespro.ru

More Related Content

ODP
Hacking PostgreSQL. Физическое представление данных
PDF
Расширения для PostgreSQL
PDF
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
PDF
Hacking PostgreSQL. Обзор исходного кода
PDF
Советы для начинающих разработчиков PostgreSQL
PDF
Hacking PostgreSQL. Обзор архитектуры.
PDF
"Деплой кода процедур" Мурат Кабилов (Avito)
PDF
Архитектура и новые возможности B-tree
Hacking PostgreSQL. Физическое представление данных
Расширения для PostgreSQL
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Обзор исходного кода
Советы для начинающих разработчиков PostgreSQL
Hacking PostgreSQL. Обзор архитектуры.
"Деплой кода процедур" Мурат Кабилов (Avito)
Архитектура и новые возможности B-tree

What's hot (20)

PDF
Отладка и устранение проблем в PostgreSQL Streaming Replication.
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PDF
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
PDF
Call of Postgres: Advanced Operations (part 5)
PDF
pgconf.ru 2015.avito postgresql recovery
PDF
pgday17. How shared memory works in modern PostgreSQL
PDF
Streaming replication in practice
PDF
Введение в современную PostgreSQL. Часть 1
PPTX
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
PDF
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
PDF
Семь тысяч Rps, один go
PDF
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
PDF
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
PPTX
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
PDF
07 - Web-технологии. Web-сервера
PDF
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
PPTX
SOA: строим свой service mesh / Иван Круглов (Booking.com)
PDF
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
PDF
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
PDF
05 - Web-технологии. Сетевые протоколы
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Call of Postgres: Advanced Operations (part 5)
pgconf.ru 2015.avito postgresql recovery
pgday17. How shared memory works in modern PostgreSQL
Streaming replication in practice
Введение в современную PostgreSQL. Часть 1
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
Семь тысяч Rps, один go
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
07 - Web-технологии. Web-сервера
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
SOA: строим свой service mesh / Иван Круглов (Booking.com)
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
05 - Web-технологии. Сетевые протоколы

Viewers also liked (20)

DOC
2009-2010 10 Syllabus
DOC
Survival Packet
PDF
Destroying Router Security
PPTX
SalesRev - Boost Your Conversions and Generate More Business Without Spending...
PPTX
Toyato cars
PDF
Page compression. PGCON_2016
PPTX
Making Awesome Experiences with Biosensors
DOCX
Kumpulan pantun by:ririnrosalinda abdinegara
PDF
Historia de los_satelites_de_comunicaciones._bit_134._5c6c417a
PPT
Kpi key
DOC
2011-2012 AmLit Syllabus
DOC
2008-2009 AP Syllabus
TXT
Andre Silva Campos P (9)
PPT
Kpi google analytics
PPTX
Global warming
PDF
Instructivo hidrología unamba
PPT
Kpi indicator
TXT
P (1)ele escolheu você
PPT
Kpi for project management
2009-2010 10 Syllabus
Survival Packet
Destroying Router Security
SalesRev - Boost Your Conversions and Generate More Business Without Spending...
Toyato cars
Page compression. PGCON_2016
Making Awesome Experiences with Biosensors
Kumpulan pantun by:ririnrosalinda abdinegara
Historia de los_satelites_de_comunicaciones._bit_134._5c6c417a
Kpi key
2011-2012 AmLit Syllabus
2008-2009 AP Syllabus
Andre Silva Campos P (9)
Kpi google analytics
Global warming
Instructivo hidrología unamba
Kpi indicator
P (1)ele escolheu você
Kpi for project management

Similar to Hacking PostgreSQL. Разделяемая память и блокировки. (20)

PDF
Where is the space, Postgres?
PPTX
#PostgreSQLRussia в банке Тинькофф, доклад №1
PDF
Cgroup и их использование в бк
PDF
PostgreSQL Streaming Replication
PDF
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
ODP
Kostja Root Conf
PDF
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
PDF
C++ весна 2014 лекция 2
PDF
Беспроблемная эксплуатация PostgreSQL
PDF
Db in-memory-overview 2015-10_14
PDF
Лекция 10. Apache Mahout
PPTX
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
PDF
pgconf.ru 2015 avito postgresql
PDF
Linuxvirt seminar-csc-2015
PPTX
Soft labs. достижима ли в c++ эффективность языка среднего уровня
PDF
NetApp Virtualization
PDF
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
PDF
Performance optimization of virtual network infrastructure (RUS, OpenStack Me...
PDF
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
Where is the space, Postgres?
#PostgreSQLRussia в банке Тинькофф, доклад №1
Cgroup и их использование в бк
PostgreSQL Streaming Replication
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
Kostja Root Conf
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
C++ весна 2014 лекция 2
Беспроблемная эксплуатация PostgreSQL
Db in-memory-overview 2015-10_14
Лекция 10. Apache Mahout
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
pgconf.ru 2015 avito postgresql
Linuxvirt seminar-csc-2015
Soft labs. достижима ли в c++ эффективность языка среднего уровня
NetApp Virtualization
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Performance optimization of virtual network infrastructure (RUS, OpenStack Me...
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)

Hacking PostgreSQL. Разделяемая память и блокировки.