Правильная работа с динамической памятью в...
TRANSCRIPT
![Page 1: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/1.jpg)
Пугачев МаксимIPONWEB
Правильная работа с динамической памятью в
высоконагруженных проектах
![Page 2: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/2.jpg)
О себе
Senior Software Engineer @ IPONWEB
u-Server team
![Page 3: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/3.jpg)
О докладе
• Обзор существующих алгоритмов
• Как выбрать?
• Многопоточность
• Подводные камни и best-practices
![Page 4: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/4.jpg)
С чего все началось
0
50
100
150
200
250
1 thread 5 threads
glibc
tcmalloc
![Page 5: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/5.jpg)
Что такое memory allocator?
![Page 6: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/6.jpg)
Цели аллокатора
![Page 7: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/7.jpg)
Цели аллокатора
• Совместимость
• Кроссплатформенность
• Минимизация памяти
• Максимизация производительности
• Кастомизация
• Обработка ошибок
![Page 8: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/8.jpg)
Идеальный аллокатор?
![Page 9: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/9.jpg)
Средний вариант
![Page 10: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/10.jpg)
Системный вызов brk()
![Page 11: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/11.jpg)
Управляющая информация
![Page 12: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/12.jpg)
Управляющая информация
![Page 13: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/13.jpg)
Наивная версия аллокатора
![Page 14: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/14.jpg)
Memory chunk
![Page 15: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/15.jpg)
Алгоритм
• Выделить 1GB при помощи brk()
• Разбить на массивы чанков (8, 16, 32, …)
• Округлять до ближайшего чанка и отдавать указатель на него
![Page 16: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/16.jpg)
Memory chunk lists
![Page 17: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/17.jpg)
Алгоритм
• Выделить 1GB при помощи brk()
• Разбить на списки чанков
• Округлять до ближайшего чанка и отдавать указатель на него
• Если список пуст, то брать из соседнего
![Page 18: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/18.jpg)
Megachunk
![Page 19: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/19.jpg)
Алгоритм
• Выделить 1GB при помощи brk()
• Округлить до ближайшего чанка и отдавать указатель на него
• Если список пуст, отрезать от мегачанка, сделать список и отдать 1 элемент
![Page 20: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/20.jpg)
Склеивание
![Page 21: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/21.jpg)
Алгоритм
• Если предыдущий элемент в списке не используется, склеиваем
• Вставляем в новый список или в мегачанк
![Page 22: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/22.jpg)
dlmalloc
• Doug Lea`s malloc (dlmalloc)
• ptmalloc (per-thread arenas malloc by Wolfram Gloger) - основан на dlmalloc
![Page 23: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/23.jpg)
Многопоточность?
![Page 24: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/24.jpg)
Суммируем проблемы
![Page 25: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/25.jpg)
Суммируем проблемы
• “Средний” вариант
• Overhead служебной информации
• Внутренняя фрагментация
• Многопоточность
![Page 26: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/26.jpg)
Как обойти проблемы?
![Page 27: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/27.jpg)
tcmalloc
• tcmalloc – thread-caching malloc by Google
• В 4 раза быстрее ptmalloc (теоретически)
![Page 28: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/28.jpg)
Small objects
![Page 29: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/29.jpg)
Large objects
![Page 30: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/30.jpg)
Page heap
![Page 31: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/31.jpg)
Чудес не бывает
![Page 32: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/32.jpg)
Выделенная память
![Page 33: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/33.jpg)
Приятные вещи
![Page 34: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/34.jpg)
jemalloc
• jemalloc – Jason Eavan`s malloc
• Стандартный аллокатор в FreeBSD и NetBSD
![Page 35: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/35.jpg)
Отличия
• Арены
• Объекты
– Small (8..3840 байт)
– Large (4..4072 KB)
– Huge (> 4 MB)
• Red-black tree
![Page 36: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/36.jpg)
jemalloc by Facebook
• Local caches
• Mutexes
• Red-black tree
• Heap profiling
![Page 37: Правильная работа с динамической памятью в высоконагруженных проектах (Максим Пугачев)](https://reader033.vdocuments.pub/reader033/viewer/2022042715/55a29ceb1a28abed6a8b4637/html5/thumbnails/37.jpg)
Итоги