Наблюдение за общей отображенной файловой памятью в Linux - PullRequest
0 голосов
/ 06 декабря 2018

Я использую системный вызов mmap для загрузки файловой памяти для чтения несколькими другими процессами (с флагами MAP_SHARED и MAP_POPULATE для предварительной загрузки всей памяти.).

Проверка потребления памяти процесса, кажется, игнорирует тот факт, что отображенная файловая память является общей.Каждое использование памяти процесса содержит весь отображенный файл в памяти в соответствии с командой ps -aux.

Есть ли способ разграничить разделяемую и приватную память процесса?

1 Ответ

0 голосов
/ 07 декабря 2018

Даже если память физически разделена, каждый процесс имеет свое собственное сопоставление виртуальной памяти и будет «потреблять» независимое адресное пространство, даже если сопоставляет ту же область - вы можете увидеть это в столбце VSIZE.В любом случае (даже после malloc()) ядро ​​резервирует независимое адресное пространство для каждого процесса, но не сразу выделяет эквивалентные страницы в вспомогательном хранилище *1003*.

.когда вы начинаете чтение / запись в выделенную память, виртуальные страницы назначаются соответствующему резервному хранилищу : резидентный набор соответственно увеличивается.

Эти страницы "чистые", если вы только что прочитали, «грязный», если вы пишете им, пока они не синхронизируются.(см. документацию /proc/PID/smaps, / proc , man pmap: этот инструмент позволяет различать разделяемую и личную память, грязные и чистые страницы)

MAP_POPULATE опция предварительно назначает всестраницы сразу.Если сопоставление равно MAP_PRIVATE, страницы могут оставаться грязными до тех пор, пока они не будут явно синхронизированы с msync().Грязные страницы кэшируются в ОЗУ, и фактически доступная системная память уменьшается, как только вы используете больше страниц с частными сопоставлениями.

С другой стороны, используя MAP_SHARED, вы требуете от ядра сохранятьсинхронизированные виртуальные страницы (т. е. страницы должны быть очищены как можно скорее, даже если они асинхронны) с резервным хранилищем .

Но с отображенным файлом резервное хранилище не является памятью, но это файл - как это было пространство подкачки.Таким образом, вы получаете странный эффект, что сопоставленный файл считается резидентным набором.

Это можно проверить, наблюдая за содержанием /proc/PID/status:

VmRSS                       size of memory portions. It contains the three
                            following parts (VmRSS = RssAnon + RssFile + RssShmem)
RssAnon                     size of resident anonymous memory
RssFile                     size of resident file mappings
RssShmem                    size of resident shmem memory (includes SysV shm,
                            mapping of tmpfs and shared anonymous mappings)

VmRSS - это то, что обычно сообщается как RSS.

RSS не учитывает физическую память в этомслучай, но отображение файла: общая системная память в основном не затрагивается при запросе MAP_SHARED, так как в большинстве случаев страницы не кэшируются (кэшированные, грязные страницы будут учитываться в RssAnon).Они должны быть сброшены в общее резервное хранилище (файл) как можно скорее.

Как вы правильно заметили, RSS подсчитывается один раз за процесс, даже если он используется совместно.Вы можете найти в /proc/PID/smaps другой счетчик, PSS (размер пропорционального набора) - см. Также этот ответ:

Что означает pss в / proc / pid / smaps

«Размер пропорционального набора» (PSS) процесса - это количество страниц в памяти, где каждая страница делится на количество процессов, разделяющих ее.Таким образом, если у процесса есть 1000 страниц, и 1000 страниц совместно используются другим процессом, его PSS будет 1500

Одно примечание: Вы можете использовать общую память, используя MAP_SHARED|MAP_POPULATE, используя только tmpfs- иначе вы будете использовать файлообменник.Если вы ищете разделяемую память IPC, посмотрите shmget().

Тесты

Я проверил свои утверждения с помощью крошечной программы, которая сопоставила 2 ГБ из файла с другимпомечает, а затем записывает 1/3 страниц с memset().

MAP_PRIVATE

ps -u вывод:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
xxxx     15767  0.5  4.1 2004216 666944 pts/1  S+   12:54   0:00 ./mm 1

из /proc/PID/smaps:

7f143e5ec000-7f14b870c000 rw-p 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
Size:            2000000 kB
Rss:              666668 kB
Pss:              666668 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:    666668 kB
Referenced:       666668 kB
Anonymous:        666668 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac sd 

из /proc/PID/status:

VmRSS:    666944 kB
RssAnon:          666560 kB
RssFile:             384 kB
RssShmem:              0 kB

MAP_PRIVATE |MAP_POPULATE

ps -u выход:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
xxxx     17045 31.0 12.3 2004216 2000412 pts/1 S+   13:01   0:01 ./mm 2

от /proc/PID/smaps:

7f14aa983000-7f1524aa3000 rw-p 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
Size:            2000000 kB
Rss:             2000000 kB
Pss:             2000000 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:   2000000 kB
Referenced:      2000000 kB
Anonymous:       2000000 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac sd 

от /proc/PID/status:

VmRSS:   2000412 kB
RssAnon:         2000032 kB
RssFile:             380 kB
RssShmem:              0 kB

MAP_SHARED

ps -u вывод:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
xxxx     17670 18.0  4.1 2004216 666944 pts/1  S+   13:06   0:00 ./mm 3

с /proc/PID/smaps:

7f01db018000-7f0255138000 rw-s 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
Size:            2000000 kB
Rss:              666668 kB
Pss:              666668 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:    666668 kB
Private_Dirty:         0 kB
Referenced:       666668 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr sh mr mw me ms sd 

с /proc/PID/status:

VmRSS:    666944 kB
RssAnon:              96 kB
RssFile:          666848 kB
RssShmem:              0 kB

MAP_SHARED |MAP_POPULATE

ps -u выход:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
xxxx     18259 16.1 12.3 2004216 2000480 pts/1 S+   13:10   0:00 ./mm 4

с /proc/PID/smaps:

7ff0d020b000-7ff14a32b000 rw-s 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
Size:            2000000 kB
Rss:             2000000 kB
Pss:             2000000 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:   2000000 kB
Private_Dirty:         0 kB
Referenced:      2000000 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr sh mr mw me ms sd 

с /proc/PID/status:

VmRSS:   2000480 kB
RssAnon:              96 kB
RssFile:         2000384 kB
RssShmem:              0 kB

MAP_SHARED|MAP_POPULATE, два экземпляра

ps -u вывод:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
xxxx     18259  0.1 12.3 2004216 2000480 pts/1 S    13:10   0:00 ./mm 4
xxxx     19521  5.8 12.3 2004216 2000480 pts/1 S+   13:19   0:00 ./mm 4

из /proc/PID/smaps, только один первый PID:

7ff0d020b000-7ff14a32b000 rw-s 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
Size:            2000000 kB
Rss:             2000000 kB
Pss:             1000000 kB
Shared_Clean:    2000000 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:      2000000 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr sh mr mw me ms sd 

из /proc/PID/status:

VmRSS:   2000480 kB
RssAnon:              96 kB
RssFile:         2000384 kB
RssShmem:              0 kB
...