Структуры данных в разделяемой памяти,
про алгоритмы замещения страниц в буфере и блокировки, которые используются на разных уровнях взаимодействия.
А также средства мониторинга памяти, уже существующие и те, которые ещё только в процессе разработки.
6. 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;
8. 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;
21. 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. 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. 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
34. 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. 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.
37. 37
Проблемы: clock sweep
●
Clock sweep
– Каждый бэкенд выполняет clock sweep сам
Решение: передать эту работу отдельному бэкенд процессу.
●
Clock sweep
– В худшем случае нужно прочитать Nbuffers*5 буферов
– Часто большинство буферов имеют usagecount=5
(это и есть худший случай)
●
Буферы никогда не возвращаются во freelist
●
bg_writer_delay – задается фиксированно
Решение: ???