38
Пугачев Максим IPONWEB Правильная работа с динамической памятью в высоконагруженных проектах

Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

  • Upload
    ontico

  • View
    1.394

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Пугачев МаксимIPONWEB

Правильная работа с динамической памятью в

высоконагруженных проектах

Page 2: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

О себе

Senior Software Engineer @ IPONWEB

u-Server team

Page 3: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

О докладе

• Обзор существующих алгоритмов

• Как выбрать?

• Многопоточность

• Подводные камни и best-practices

Page 4: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

С чего все началось

0

50

100

150

200

250

1 thread 5 threads

glibc

tcmalloc

Page 5: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Что такое memory allocator?

Page 6: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Цели аллокатора

Page 7: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Цели аллокатора

• Совместимость

• Кроссплатформенность

• Минимизация памяти

• Максимизация производительности

• Кастомизация

• Обработка ошибок

Page 8: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Идеальный аллокатор?

Page 9: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Средний вариант

Page 10: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Системный вызов brk()

Page 11: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Управляющая информация

Page 12: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Управляющая информация

Page 13: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Наивная версия аллокатора

Page 14: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Memory chunk

Page 15: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Алгоритм

• Выделить 1GB при помощи brk()

• Разбить на массивы чанков (8, 16, 32, …)

• Округлять до ближайшего чанка и отдавать указатель на него

Page 16: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Memory chunk lists

Page 17: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Алгоритм

• Выделить 1GB при помощи brk()

• Разбить на списки чанков

• Округлять до ближайшего чанка и отдавать указатель на него

• Если список пуст, то брать из соседнего

Page 18: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Megachunk

Page 19: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Алгоритм

• Выделить 1GB при помощи brk()

• Округлить до ближайшего чанка и отдавать указатель на него

• Если список пуст, отрезать от мегачанка, сделать список и отдать 1 элемент

Page 20: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Склеивание

Page 21: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Алгоритм

• Если предыдущий элемент в списке не используется, склеиваем

• Вставляем в новый список или в мегачанк

Page 22: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

dlmalloc

• Doug Lea`s malloc (dlmalloc)

• ptmalloc (per-thread arenas malloc by Wolfram Gloger) - основан на dlmalloc

Page 23: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Многопоточность?

Page 24: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Суммируем проблемы

Page 25: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Суммируем проблемы

• “Средний” вариант

• Overhead служебной информации

• Внутренняя фрагментация

• Многопоточность

Page 26: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Как обойти проблемы?

Page 27: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

tcmalloc

• tcmalloc – thread-caching malloc by Google

• В 4 раза быстрее ptmalloc (теоретически)

Page 28: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Small objects

Page 29: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Large objects

Page 30: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Page heap

Page 31: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Чудес не бывает

Page 32: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Выделенная память

Page 33: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Приятные вещи

Page 34: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

jemalloc

• jemalloc – Jason Eavan`s malloc

• Стандартный аллокатор в FreeBSD и NetBSD

Page 35: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Отличия

• Арены

• Объекты

– Small (8..3840 байт)

– Large (4..4072 KB)

– Huge (> 4 MB)

• Red-black tree

Page 36: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

jemalloc by Facebook

• Local caches

• Mutexes

• Red-black tree

• Heap profiling

Page 37: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Итоги

Page 38: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)

Спасибо!

Пугачев Максим

IPONWEB

E-mail: [email protected]

Skype: pugachev.maxim