SlideShare a Scribd company logo
Как Linux работает с памятью — Вячеслав Бирюков
Как Linux работает
с памятью
Вячеслав Бирюков
Почему память?
3
Ответим на вопросы
• Как максимально точно понять сколько памяти использует
процесс?
• Куда девается вся свободная память?
• Если я раздаю файлы с диска зачем мне много памяти?
• Почему запись быстрее чтения?
• Почему перезапустить MySQL тяжелее чем MongoDB?
• Почему я могу потерять данные при записи на диск?
4
Говорим про
x86_64
Linux Kernel ≥ 2.6.32
5
Немного терминов
︎Резидентная память (resident memory) – объём памяти, которая
находится непосредственно в оперативной памяти системы (RAM).
Анонимная память (anonymous memory) – память которая не
связана ни с каким файлом на диске (without backing store).
Page fault – ловушка (trap) обращения к памяти. Штатный механизм
при работе с виртуальной памятью.
6
Работа с памятью через страницы
Страница – это минимальная единица
памяти, с которой происходит работа.
Размер страницы 4KB.
Существуют Huge Pages – 2MB (не
будем рассматривать).
7
page
page
page
page
page
0x0
0xFFFFFFFF
…
4KB
Адресное пространство
page
Процесс работает с виртуальной памятью
8
Адресное пространство процесса
Основная память
RAM
Swap
устройство
• абстрактная модель;
• упрощает разработку;
• оставляем работу с настоящей памятью ОС;
• позволяет превышать размеры основной памяти.
Отображение памяти
Paging/swapping
Виртуальная память
Настраиваем Оvercommit
Глобальные настройки:
• sysctl vm.overcommit_memory – 0 (default), 1, 2
• sysctl vm.overcommit_ratio / vm.overcommit_kbytes
Следим за использованием overcommit:
# cat /proc/meminfo
…

CommitLimit: 32973320 kB

Committed_AS: 5510988 kB

…
9
NUMA и SMP(UMA)
10
CPU 1
System Bus
Получаем список нод:
# numactl --hardware

available: 2 nodes (0-1)



node 0 cpus: 0 1 2 3 4 5 6 7 16 17
18 19 20 21 22 23

node 0 size: 32735 MB

node 0 free: 434 MB



node 1 cpus: 8 9 10 11 12 13 14 15
24 25 26 27 28 29 30 31

node 1 size: 32768 MB

node 1 free: 101 MB



node distances:

node 0 1

0: 10 21

1: 21 10
interconnect
mem bus mem bus
SMP
NUMA
CPU 2
CPU 1 CPU 2
RAM 1 RAM 2
RAM 1 RAM 2
Неравномерное заполнение NUMA
Управляем выделением памяти:
# numactl --interleave all command
11
Node 1 Node 2
56GB
30GB
Memory Nodes
Memory Zones
Из-за ограничений железа, ядро не может работать со всеми
страницами одинаково.
• ZONE_DMA
• ZONE_DMA32
• ZONE_NORMAL
Посмотреть какие зоны присутствуют:
# grep zone /proc/zoneinfo
Node 0, zone DMA

Node 0, zone DMA32

Node 0, zone Normal

Node 1, zone Normal

12
Page Cache
Динамический размер → съест всю вашу память.
По умолчанию все операции чтения и записи проходят через
Page Cache.
Посмотреть:
# free -m

total used free shared buffers cached

Mem: 64401 64101 299 0 161 60339

-/+ buffers/cache: 3600 60800

Swap: 0 0 0
# grep Cached /proc/meminfo

Cached: 61638200 kB
13
Read и Page Cache
14
Disk Storage
read() syscall
Page
Cache
no, miss
yes
Чтение происходит через Page Cache.
Работает со страницами памяти и файла.
mincore – системный вызов позволяет 

посмотреть находятся ли страницы 

файла в Page Cache.
vmtouch – позволяет посмотреть сколько 

страниц в Page Cache’е:


# vmtouch /var/lib/db/index

Files: 1

Directories: 0

Resident Pages: 21365/21365 83M/83M 100%

Elapsed: 0.004477 seconds
hit
Write и Page Cache
По умолчанию запись происходит только в Page Cache (исключение
open() c O_SYNC).
Страницы в кеше помечаются как грязные (dirty).


Они сбрасываются на диск (writeback):
• ︎через заданный интервал времени vm.dirty_expire_centisecs
(fsflush/pdflush);
• система испытывает нехватку памяти (kswapd);
• fsync() или msync();
• слишком много грязных страниц (vm.dirty_ratio и прочие).


# grep Dirty /proc/meminfo

…

Dirty: 9604 kB

… 15
Память процесса
Сегменты:
• stack;
• mmap;
• heap;
• bss;
• init data;
• text.

16
Stack
(grows downwards)
Text (program code)
Initialized data
Uninitialized data
(bss)
Heap
(grows upwards)
unallocated memory
program break
(brk)
top of stack
mmap region
RLIMIT_STACK
Как посмотреть
•ps
•top
•cat /proc/<pid>/status



…

VmPeak: 8908 kB

VmSize: 8908 kB

VmLck: 0 kB

VmPin: 0 kB

VmHWM: 356 kB

VmRSS: 356 kB

VmData: 180 kB

VmStk: 136 kB

VmExe: 44 kB

VmLib: 1884 kB

VmPTE: 36 kB

VmSwap: 0 kB

…
17
Virtual Memory Area (VMA)
Область памяти (virtual memory area VMA) – описывает пространство
адресов в памяти процесса (например 08048000-0804c000).
Права на области:
• Чтение (r);
• Запись (w);
• Исполнение (e).

Области видимости и доступа:
• приватные (p);
• общие (s).
18
Смотрим VMA
Посмотреть:
# pmap -x <pid>
Address RSS Dirty Mode Mapping

…

00007f0356b23000 76 76 rwx-- [ anon ] 

00007f0356b38000 392 392 rwx-- [ anon ]

00007f0356bb9000 34708 0 r-xs- some_mapped_file

00007f0359272000 21876 0 r-xs- some_mapped_file2

…
VMA кратко:
# cat /proc/<pid>/maps

… и очень подробно:
# cat /proc/<pid>/smaps
19
Выделение памяти
20
Private Shared
Anonymous
• stack
• malloc()
• mmap(ANON, PRIVATE)
• brk()/sbrk()
• mmap(ANON, SHARED)
File-backed
• mmap(fd, PRIVATE)
• binary/shared libraries
• mmap(fd, SHARED)
malloc() и free()
glibc malloc() – выделяет анонимную память:
• heap – для аллокации маленьких объёмов (≤128KB);
• mmap() для остального.
free() – освобождает память.
Пример malloc() и brk()
22
Heap
(grows upwards)
program break
(brk)
unallocated memory
Heap
(grows upwards)
new
program break
(brk)
unallocated memory
1. Перед выделением памяти 2. После выделения памяти
110 KB
100 KB
Если в heap не хватает памяти – вызывается brk(), который расширяет
границы heap.
mmap() и munmap()
23
mmap area
/var/lib/db/index
Виртуальная память процесса
Диск
mmap(fd, …)
mmap() – позволяет отображать содержимое файла на 

адресное пространство процесса.



munmap() – освобождает память.
Флаги mmap()
Задаём видимость наших изменений:
• MAP_PRIVATE и указание файла;
• MAP_SHARED и указание файла.
Можем явно задать уровень доступа:
• PROT_READ;
• PROT_WRITE.
24
На самом деле Linux
не выделяет всю запрошенную
память сразу.
25
Page fault (demand paging)
Allocated and
mapped
memory
Only allocated
Unallocated
Address space of a process
Page
write syscall
Page Table
MMU
TLB
translate to physical
RAMpage fault
Page
page mapping
Minor Page Fault – без обращения на диск.
Типы Page Fault
• Minor – без обращения на диск;
• major – с обращением на диск;
• invalid – ошибочное обращение (segmentation fault).
27
Page fault
Страница может быть в следующем состоянии:
1. Unallocated;
2. Allocated, but unmapped (not yet faulted);
3. Allocated, and mapped to main memory (RAM);
4. Allocated, and mapped to the physical swap device (disk);
Исходя из этого:
︎ RSS – размер 3-его пункта;
︎ Virtual Memory Size – сумма: 2 + 3 + 4.
28
Copy On Write (COW)
29
#0
#2
#1
free
#3
#0
#1
#2
#3
#4
Real Memory
free
#4
#0
#1
#2
#3
#4
Parent Child
1. После fork().
#0
#2
#1
change
#3
change
#1
#2
#3
#4
Real Memory
free
#4
#0
#1
#2
#3
#4
Parent Child
2. При попытке изменить страницу.
Работа с файлами и памятью
30
malloc() и работа с файлами
31
free
read(fd, buf, 8192)
Kernel
free
free
free
/bin/ls
find
Page Cache
Heap pages
1. Читаем файл /var/m.log. 2. Ядро проверяет страницы в кеше.
miss
m.log#0
free
/bin/ls
Page Cache
libc.so
3. Кеширует страницы файла.
free
m.log#1
filled
filled
Heap
4. Копирует в user space буфер
Kernel
Kernel
Disk
Storage
libc.so
malloc() и работа с файлами
• Используем больше памяти.
• Копирование в user space – больше CPU и переключений контекста.
32
mmap и работа с файлами
33
#0
#1
m.log#0
free
/bin/ls
Page Cache
libc.so
m.log#1
mmap area
mmap()
Простое отображение в Page Cache.
#2
mmap и minor page fault
34
#0
#1
m.log#0
free
/bin/ls
Page Cache
libc.so
m.log#1
mmap area
mmap()
#2
m.log#2
Обращение с странице в первый раз,
которая уже в Page Cache.
minor page fault
mmap и major page fault (1)
35
#0
#1
m.log#0
free
/bin/ls
Page Cache
libc.so
m.log#1
mmap area
mmap()
#2
free
Обращение к странице в первый раз, которой нет в Page Cache
major page fault
m.log#0
free
/bin/ls
Page Cache
libc.so
m.log#1
m.log#2
Disk
Storage
1. В Page Cache нет требуемой 

страницы – major page fault.
2. Идём на диск и зачитываем 

страницу в память.
mmap и major page fault (2)
36
#0
#1
m.log#0
free
/bin/ls
Page Cache
libc.so
m.log#1
mmap area
mmap()
#2
m.log#2
3. Связываем страницу с Page Cache.
mmap() выводы
37
• Позволяет работать с файлами как с памятью.
• “Lazy loading”.
• Быстрее – меньше системных вызовов и переключений
контекста.
• Экономит память.
• При завершении программы данные остаются в памяти.
Мониторим память
sar
︎ -B: paging statistics:
02:46:04 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff

02:46:05 0,00 134,00 1743,00 0,00 5978,00 0,00 0,00 0,00 0,00

02:46:06 0,00 108,00 9094,00 0,00 11801,00 0,00 0,00 0,00 0,00
-r: memory utilization:
02:41:50 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact

02:41:51 346644 65599996 99,47 191340 61669768 5410704 8,20 34115072 29384464

02:41:52 345900 65600740 99,48 191340 61669956 5410596 8,20 34114568 29384568
︎ -R: memory statistics:
02:44:50 frmpg/s bufpg/s campg/s

02:44:51 393,00 4,00 45,00

02:44:52 -200,00 1,00 35,00


38
Работаем с Page Cache
1. Работать в обход Page Cache:
• open(fd, O_DIRECT) – ходим мимо кеша (так делает MySQL с
InnoDB).

2. Подсказать ядру, что в ближайшее время мы не будем работать с
этим файлом и заставить его выгрузить страницы:
• posix_fadvide(fd, POSIX_FADV_DONTNEED);
• madvise(addr, MADV_DONTNEED);
• mincore().

3. Прибегнуть к помощи vmtouch (делает posix_fadvide):
vmtouch -e /var/lib/db/index
39
Пару слов про readahead
Управлять readahead можно:
• readahead();
• madvise();
• posix_fadvise();
• blockdev --report



blockdev --setra <value> <device>.
40
Освобождение памяти (page reclaiming)
Страницы памяти:
• unreclaimable;
• swappable;
• syncable;
• discardable.
41
Источники пополнения free list
42
Free page list
Memory request
Page Cache Swap (kswapd) Kernel memory
(slab allocator)
OOM Killer
vm.swappiness0 100
swap aggressivelyswap only to 

avoid an OOM
Page Scanning (kswapd)
43
min pages
high pages
low pages
background
synchronous
time
size of

available

free memory
Регулируется vm.min_free_kbytes
LRU/2
44
Active List
Inactive Listhead tail
headtail
free page
Free List
referenced
referenced
tailhead
page allocation
free pages
reclaim
LRU листы
45
Для каждой memory Node для каждой Zone и для каждой cgroup
(kernel ≥ 3.3):
• Active anon;
• Inactive anon;
• Active file;
• Inactive file;
• Unevictable.


File backend LRU листы выравниваются по размерам.
# cat /proc/meminfo

…

Active: 32714084 kB

Inactive: 30755444 kB

Active(anon): 1612548 kB

Inactive(anon): 264 kB

Active(file): 31101536 kB

Inactive(file): 30755180 kB
Out Of Memory Killer (OOM)
Логи:
grep -i kill /var/log/messages*

Меняем веса (-16 … 15, -17 – выключить):
echo “-17” > /proc/<pid>/oom_adj


Текущая сумма очков для pid:
cat /proc/<pid>/oom_score

0
46
Memory cgroup
Можем ограничивать повсякому:
• память;
• память + swap;
• свой OOM;
• swappiness.
Удобная статистика:
# cat memory.stat

…

inactive_anon 0

active_anon 0

inactive_file 0

active_file 0

unevictable 0
47
Cgroup page reclaiming
• Global reclaiming.
• Target reclaiming.
48
Почитать
49
Systems Performance: 

Enterprise and the Cloud
Linux Kernel DevelopmentLinux System Programming: 

Talking Directly to the Kernel 

and C Library
Спасибо за внимание!

More Related Content

PDF
Вячеслав Бирюков - Как Linux работает с памятью
ODP
Alexander Krizhanovsky Krizhanovsky Hpds
PPTX
Операционные системы 2015, лекция № 8
PDF
Hacking PostgreSQL. Обзор архитектуры.
PPTX
Операционные системы 2015, лекция № 7
PPTX
Операционные системы 2015, лекция № 2
PDF
Lapan 20.04 hadoop h-base
ODP
Константин Осипов (Mail.Ru)
Вячеслав Бирюков - Как Linux работает с памятью
Alexander Krizhanovsky Krizhanovsky Hpds
Операционные системы 2015, лекция № 8
Hacking PostgreSQL. Обзор архитектуры.
Операционные системы 2015, лекция № 7
Операционные системы 2015, лекция № 2
Lapan 20.04 hadoop h-base
Константин Осипов (Mail.Ru)

What's hot (15)

PDF
Марат Дулин — ENB — сборщик проектов на БЭМ
PDF
HBase inside
PDF
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
DOC
029
PPTX
Операционные системы 2015, лекция № 3
PPTX
Оперативная память
PDF
โครงงานเพื่อการพัฒนาสื่อ
PPTX
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
PPTX
Mysql vs postgresql
PDF
Загрузка больших объемов данных для бизнес-аналитики
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
PDF
Обзор файловой системы GlusterFS
PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
PDF
Обзор Btrfs
PDF
Хранение данных на виниле / Константин Осипов (tarantool.org)
Марат Дулин — ENB — сборщик проектов на БЭМ
HBase inside
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
029
Операционные системы 2015, лекция № 3
Оперативная память
โครงงานเพื่อการพัฒนาสื่อ
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Mysql vs postgresql
Загрузка больших объемов данных для бизнес-аналитики
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Обзор файловой системы GlusterFS
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Обзор Btrfs
Хранение данных на виниле / Константин Осипов (tarantool.org)
Ad

Viewers also liked (20)

PDF
Большие данные в физике элементарных частиц на примере LHCb - Guy Wilkinson, ...
PDF
Тропинка через минное поле — Леонычев Юрий
PDF
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, Риман
PDF
Руководство по стилю документации: зачем и как, Татьяна Грачёва
PDF
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
PDF
Михаил Трошев — Инструменты веб-разработки
PDF
Как делается Яндекс.Браузер — Михаил Лопаткин
PDF
вера сивакова
PDF
Мобильная Яндекс.Почта — Дмитрий Александров
PDF
Жидков Игорь - Elliptics
PDF
Симаков Алексей - Системы управления кластерами
PDF
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
PDF
Дмитрий Васильев - Задачи ассиметричной криптографии
PDF
алексей тихонов
PDF
Коллективная разработка документации: от индивидуального авторства к командн...
PDF
Антон Качалов - Популярно об IPMI и UEFI
PDF
Где прячутся мобильные вирусы — Григорий Земсков
PDF
Константин Горский - Дизайн
PDF
Эталонное описание фильма на основе десятков дубликатов
PDF
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Большие данные в физике элементарных частиц на примере LHCb - Guy Wilkinson, ...
Тропинка через минное поле — Леонычев Юрий
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, Риман
Руководство по стилю документации: зачем и как, Татьяна Грачёва
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Михаил Трошев — Инструменты веб-разработки
Как делается Яндекс.Браузер — Михаил Лопаткин
вера сивакова
Мобильная Яндекс.Почта — Дмитрий Александров
Жидков Игорь - Elliptics
Симаков Алексей - Системы управления кластерами
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Дмитрий Васильев - Задачи ассиметричной криптографии
алексей тихонов
Коллективная разработка документации: от индивидуального авторства к командн...
Антон Качалов - Популярно об IPMI и UEFI
Где прячутся мобильные вирусы — Григорий Земсков
Константин Горский - Дизайн
Эталонное описание фильма на основе десятков дубликатов
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Ad

Similar to Как Linux работает с памятью — Вячеслав Бирюков (20)

ODP
Krizhanovsky Vm
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PPTX
Dynamic Memory в Windows Server 2008 R2 SP1
PDF
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
PPTX
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
PDF
Hacking PostgreSQL. Разделяемая память и блокировки.
PDF
Операционные системы
PDF
pgday17. How shared memory works in modern PostgreSQL
PDF
Лекция 4. Оптимизация доступа к памяти (Memory access optimization, cache opt...
PPTX
Презентация 3
PPT
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
PPT
PPT
Низкоуровневая Оптимизация (Андрей Аксенов)
PDF
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
PPT
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
PPTX
Правильная работа с динамической памятью в высоконагруженных проектах (Максим...
PDF
HighLoad весна 2014 лекция 5
PDF
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
PDF
Call of Postgres: Advanced Operations (part 1)
PPTX
C language lect_20_advanced
Krizhanovsky Vm
Современная операционная система: что надо знать разработчику / Александр Кри...
Dynamic Memory в Windows Server 2008 R2 SP1
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
Hacking PostgreSQL. Разделяемая память и блокировки.
Операционные системы
pgday17. How shared memory works in modern PostgreSQL
Лекция 4. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Презентация 3
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Низкоуровневая Оптимизация (Андрей Аксенов)
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Правильная работа с динамической памятью в высоконагруженных проектах (Максим...
HighLoad весна 2014 лекция 5
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Call of Postgres: Advanced Operations (part 1)
C language lect_20_advanced

More from Yandex (20)

PDF
Предсказание оттока игроков из World of Tanks
PDF
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
PDF
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
PDF
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
PDF
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
PDF
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
PDF
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
PDF
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
PDF
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
PDF
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
PDF
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
PDF
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
PDF
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
PDF
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
PDF
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
PDF
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
PDF
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
PDF
Поиск списков в неструктурированных данных
PDF
Производительность параметрического поиска на основе опенсорс-платформы
Предсказание оттока игроков из World of Tanks
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Поиск списков в неструктурированных данных
Производительность параметрического поиска на основе опенсорс-платформы

Как Linux работает с памятью — Вячеслав Бирюков

  • 2. Как Linux работает с памятью Вячеслав Бирюков
  • 4. Ответим на вопросы • Как максимально точно понять сколько памяти использует процесс? • Куда девается вся свободная память? • Если я раздаю файлы с диска зачем мне много памяти? • Почему запись быстрее чтения? • Почему перезапустить MySQL тяжелее чем MongoDB? • Почему я могу потерять данные при записи на диск? 4
  • 6. Немного терминов ︎Резидентная память (resident memory) – объём памяти, которая находится непосредственно в оперативной памяти системы (RAM). Анонимная память (anonymous memory) – память которая не связана ни с каким файлом на диске (without backing store). Page fault – ловушка (trap) обращения к памяти. Штатный механизм при работе с виртуальной памятью. 6
  • 7. Работа с памятью через страницы Страница – это минимальная единица памяти, с которой происходит работа. Размер страницы 4KB. Существуют Huge Pages – 2MB (не будем рассматривать). 7 page page page page page 0x0 0xFFFFFFFF … 4KB Адресное пространство page
  • 8. Процесс работает с виртуальной памятью 8 Адресное пространство процесса Основная память RAM Swap устройство • абстрактная модель; • упрощает разработку; • оставляем работу с настоящей памятью ОС; • позволяет превышать размеры основной памяти. Отображение памяти Paging/swapping Виртуальная память
  • 9. Настраиваем Оvercommit Глобальные настройки: • sysctl vm.overcommit_memory – 0 (default), 1, 2 • sysctl vm.overcommit_ratio / vm.overcommit_kbytes Следим за использованием overcommit: # cat /proc/meminfo …
 CommitLimit: 32973320 kB
 Committed_AS: 5510988 kB
 … 9
  • 10. NUMA и SMP(UMA) 10 CPU 1 System Bus Получаем список нод: # numactl --hardware
 available: 2 nodes (0-1)
 
 node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
 node 0 size: 32735 MB
 node 0 free: 434 MB
 
 node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
 node 1 size: 32768 MB
 node 1 free: 101 MB
 
 node distances:
 node 0 1
 0: 10 21
 1: 21 10 interconnect mem bus mem bus SMP NUMA CPU 2 CPU 1 CPU 2 RAM 1 RAM 2 RAM 1 RAM 2
  • 11. Неравномерное заполнение NUMA Управляем выделением памяти: # numactl --interleave all command 11 Node 1 Node 2 56GB 30GB Memory Nodes
  • 12. Memory Zones Из-за ограничений железа, ядро не может работать со всеми страницами одинаково. • ZONE_DMA • ZONE_DMA32 • ZONE_NORMAL Посмотреть какие зоны присутствуют: # grep zone /proc/zoneinfo Node 0, zone DMA
 Node 0, zone DMA32
 Node 0, zone Normal
 Node 1, zone Normal
 12
  • 13. Page Cache Динамический размер → съест всю вашу память. По умолчанию все операции чтения и записи проходят через Page Cache. Посмотреть: # free -m
 total used free shared buffers cached
 Mem: 64401 64101 299 0 161 60339
 -/+ buffers/cache: 3600 60800
 Swap: 0 0 0 # grep Cached /proc/meminfo
 Cached: 61638200 kB 13
  • 14. Read и Page Cache 14 Disk Storage read() syscall Page Cache no, miss yes Чтение происходит через Page Cache. Работает со страницами памяти и файла. mincore – системный вызов позволяет 
 посмотреть находятся ли страницы 
 файла в Page Cache. vmtouch – позволяет посмотреть сколько 
 страниц в Page Cache’е: 
 # vmtouch /var/lib/db/index
 Files: 1
 Directories: 0
 Resident Pages: 21365/21365 83M/83M 100%
 Elapsed: 0.004477 seconds hit
  • 15. Write и Page Cache По умолчанию запись происходит только в Page Cache (исключение open() c O_SYNC). Страницы в кеше помечаются как грязные (dirty). 
 Они сбрасываются на диск (writeback): • ︎через заданный интервал времени vm.dirty_expire_centisecs (fsflush/pdflush); • система испытывает нехватку памяти (kswapd); • fsync() или msync(); • слишком много грязных страниц (vm.dirty_ratio и прочие). 
 # grep Dirty /proc/meminfo
 …
 Dirty: 9604 kB
 … 15
  • 16. Память процесса Сегменты: • stack; • mmap; • heap; • bss; • init data; • text.
 16 Stack (grows downwards) Text (program code) Initialized data Uninitialized data (bss) Heap (grows upwards) unallocated memory program break (brk) top of stack mmap region RLIMIT_STACK
  • 17. Как посмотреть •ps •top •cat /proc/<pid>/status
 
 …
 VmPeak: 8908 kB
 VmSize: 8908 kB
 VmLck: 0 kB
 VmPin: 0 kB
 VmHWM: 356 kB
 VmRSS: 356 kB
 VmData: 180 kB
 VmStk: 136 kB
 VmExe: 44 kB
 VmLib: 1884 kB
 VmPTE: 36 kB
 VmSwap: 0 kB
 … 17
  • 18. Virtual Memory Area (VMA) Область памяти (virtual memory area VMA) – описывает пространство адресов в памяти процесса (например 08048000-0804c000). Права на области: • Чтение (r); • Запись (w); • Исполнение (e).
 Области видимости и доступа: • приватные (p); • общие (s). 18
  • 19. Смотрим VMA Посмотреть: # pmap -x <pid> Address RSS Dirty Mode Mapping
 …
 00007f0356b23000 76 76 rwx-- [ anon ] 
 00007f0356b38000 392 392 rwx-- [ anon ]
 00007f0356bb9000 34708 0 r-xs- some_mapped_file
 00007f0359272000 21876 0 r-xs- some_mapped_file2
 … VMA кратко: # cat /proc/<pid>/maps
 … и очень подробно: # cat /proc/<pid>/smaps 19
  • 20. Выделение памяти 20 Private Shared Anonymous • stack • malloc() • mmap(ANON, PRIVATE) • brk()/sbrk() • mmap(ANON, SHARED) File-backed • mmap(fd, PRIVATE) • binary/shared libraries • mmap(fd, SHARED)
  • 21. malloc() и free() glibc malloc() – выделяет анонимную память: • heap – для аллокации маленьких объёмов (≤128KB); • mmap() для остального. free() – освобождает память.
  • 22. Пример malloc() и brk() 22 Heap (grows upwards) program break (brk) unallocated memory Heap (grows upwards) new program break (brk) unallocated memory 1. Перед выделением памяти 2. После выделения памяти 110 KB 100 KB Если в heap не хватает памяти – вызывается brk(), который расширяет границы heap.
  • 23. mmap() и munmap() 23 mmap area /var/lib/db/index Виртуальная память процесса Диск mmap(fd, …) mmap() – позволяет отображать содержимое файла на 
 адресное пространство процесса.
 
 munmap() – освобождает память.
  • 24. Флаги mmap() Задаём видимость наших изменений: • MAP_PRIVATE и указание файла; • MAP_SHARED и указание файла. Можем явно задать уровень доступа: • PROT_READ; • PROT_WRITE. 24
  • 25. На самом деле Linux не выделяет всю запрошенную память сразу. 25
  • 26. Page fault (demand paging) Allocated and mapped memory Only allocated Unallocated Address space of a process Page write syscall Page Table MMU TLB translate to physical RAMpage fault Page page mapping Minor Page Fault – без обращения на диск.
  • 27. Типы Page Fault • Minor – без обращения на диск; • major – с обращением на диск; • invalid – ошибочное обращение (segmentation fault). 27
  • 28. Page fault Страница может быть в следующем состоянии: 1. Unallocated; 2. Allocated, but unmapped (not yet faulted); 3. Allocated, and mapped to main memory (RAM); 4. Allocated, and mapped to the physical swap device (disk); Исходя из этого: ︎ RSS – размер 3-его пункта; ︎ Virtual Memory Size – сумма: 2 + 3 + 4. 28
  • 29. Copy On Write (COW) 29 #0 #2 #1 free #3 #0 #1 #2 #3 #4 Real Memory free #4 #0 #1 #2 #3 #4 Parent Child 1. После fork(). #0 #2 #1 change #3 change #1 #2 #3 #4 Real Memory free #4 #0 #1 #2 #3 #4 Parent Child 2. При попытке изменить страницу.
  • 30. Работа с файлами и памятью 30
  • 31. malloc() и работа с файлами 31 free read(fd, buf, 8192) Kernel free free free /bin/ls find Page Cache Heap pages 1. Читаем файл /var/m.log. 2. Ядро проверяет страницы в кеше. miss m.log#0 free /bin/ls Page Cache libc.so 3. Кеширует страницы файла. free m.log#1 filled filled Heap 4. Копирует в user space буфер Kernel Kernel Disk Storage libc.so
  • 32. malloc() и работа с файлами • Используем больше памяти. • Копирование в user space – больше CPU и переключений контекста. 32
  • 33. mmap и работа с файлами 33 #0 #1 m.log#0 free /bin/ls Page Cache libc.so m.log#1 mmap area mmap() Простое отображение в Page Cache. #2
  • 34. mmap и minor page fault 34 #0 #1 m.log#0 free /bin/ls Page Cache libc.so m.log#1 mmap area mmap() #2 m.log#2 Обращение с странице в первый раз, которая уже в Page Cache. minor page fault
  • 35. mmap и major page fault (1) 35 #0 #1 m.log#0 free /bin/ls Page Cache libc.so m.log#1 mmap area mmap() #2 free Обращение к странице в первый раз, которой нет в Page Cache major page fault m.log#0 free /bin/ls Page Cache libc.so m.log#1 m.log#2 Disk Storage 1. В Page Cache нет требуемой 
 страницы – major page fault. 2. Идём на диск и зачитываем 
 страницу в память.
  • 36. mmap и major page fault (2) 36 #0 #1 m.log#0 free /bin/ls Page Cache libc.so m.log#1 mmap area mmap() #2 m.log#2 3. Связываем страницу с Page Cache.
  • 37. mmap() выводы 37 • Позволяет работать с файлами как с памятью. • “Lazy loading”. • Быстрее – меньше системных вызовов и переключений контекста. • Экономит память. • При завершении программы данные остаются в памяти.
  • 38. Мониторим память sar ︎ -B: paging statistics: 02:46:04 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
 02:46:05 0,00 134,00 1743,00 0,00 5978,00 0,00 0,00 0,00 0,00
 02:46:06 0,00 108,00 9094,00 0,00 11801,00 0,00 0,00 0,00 0,00 -r: memory utilization: 02:41:50 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact
 02:41:51 346644 65599996 99,47 191340 61669768 5410704 8,20 34115072 29384464
 02:41:52 345900 65600740 99,48 191340 61669956 5410596 8,20 34114568 29384568 ︎ -R: memory statistics: 02:44:50 frmpg/s bufpg/s campg/s
 02:44:51 393,00 4,00 45,00
 02:44:52 -200,00 1,00 35,00 
 38
  • 39. Работаем с Page Cache 1. Работать в обход Page Cache: • open(fd, O_DIRECT) – ходим мимо кеша (так делает MySQL с InnoDB).
 2. Подсказать ядру, что в ближайшее время мы не будем работать с этим файлом и заставить его выгрузить страницы: • posix_fadvide(fd, POSIX_FADV_DONTNEED); • madvise(addr, MADV_DONTNEED); • mincore().
 3. Прибегнуть к помощи vmtouch (делает posix_fadvide): vmtouch -e /var/lib/db/index 39
  • 40. Пару слов про readahead Управлять readahead можно: • readahead(); • madvise(); • posix_fadvise(); • blockdev --report
 
 blockdev --setra <value> <device>. 40
  • 41. Освобождение памяти (page reclaiming) Страницы памяти: • unreclaimable; • swappable; • syncable; • discardable. 41
  • 42. Источники пополнения free list 42 Free page list Memory request Page Cache Swap (kswapd) Kernel memory (slab allocator) OOM Killer vm.swappiness0 100 swap aggressivelyswap only to 
 avoid an OOM
  • 43. Page Scanning (kswapd) 43 min pages high pages low pages background synchronous time size of
 available
 free memory Регулируется vm.min_free_kbytes
  • 44. LRU/2 44 Active List Inactive Listhead tail headtail free page Free List referenced referenced tailhead page allocation free pages reclaim
  • 45. LRU листы 45 Для каждой memory Node для каждой Zone и для каждой cgroup (kernel ≥ 3.3): • Active anon; • Inactive anon; • Active file; • Inactive file; • Unevictable. 
 File backend LRU листы выравниваются по размерам. # cat /proc/meminfo
 …
 Active: 32714084 kB
 Inactive: 30755444 kB
 Active(anon): 1612548 kB
 Inactive(anon): 264 kB
 Active(file): 31101536 kB
 Inactive(file): 30755180 kB
  • 46. Out Of Memory Killer (OOM) Логи: grep -i kill /var/log/messages*
 Меняем веса (-16 … 15, -17 – выключить): echo “-17” > /proc/<pid>/oom_adj 
 Текущая сумма очков для pid: cat /proc/<pid>/oom_score
 0 46
  • 47. Memory cgroup Можем ограничивать повсякому: • память; • память + swap; • свой OOM; • swappiness. Удобная статистика: # cat memory.stat
 …
 inactive_anon 0
 active_anon 0
 inactive_file 0
 active_file 0
 unevictable 0 47
  • 48. Cgroup page reclaiming • Global reclaiming. • Target reclaiming. 48
  • 49. Почитать 49 Systems Performance: 
 Enterprise and the Cloud Linux Kernel DevelopmentLinux System Programming: 
 Talking Directly to the Kernel 
 and C Library