Различные результаты при профилировании памяти для получения максимального RSS с массивом и временем - PullRequest
0 голосов
/ 14 января 2019

Немного контекста: я пытаюсь реализовать приложение C ++, которое использует mmap для сопоставления некоторых произвольных больших файлов для чтения и записи, которые могут масштабироваться от нескольких МБ до нескольких ГБ. В связи с этим важно профилировать использование памяти (пик RSS, я хочу видеть, сколько физической памяти она потребляет) программы, чтобы увидеть ее производительность.

Я использую инструмент массива Valgrind с опцией pages-as-heap=yes и massif visualizer. Я ожидаю, что это покажет мне пик RSS. Я запускаю программу с mmap, резервируя ровно 1 ГБ. Массив-визуализатор показал мне именно то, что ожидалось (пик 1 ГБ) (см. Изображение) .

Я также использовал команду \time -v, и это показало, что максимальный размер RSS был очень маленьким (5000 кбайт, более или менее). Вот один пример вывода:

User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 112%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 4772
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 1928
Voluntary context switches: 32
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 88
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

Я также изменил программу, чтобы time работал намного дольше, если разницы для снимков памяти недостаточно, но я получил те же результаты.

Почему пики памяти разные? Из того, что я прочитал в нескольких постах, люди ожидают, что массив с опцией pages-as-heap=yes покажет вам максимальный RSS, который будет его пиком. Однако есть разница в том, что \time выводит команду, показывая намного меньший пик. Я подозреваю, что снимки массива относятся к виртуальной памяти, но поправьте меня, если я ошибаюсь. Кроме того, я был бы признателен, если бы кто-нибудь, очень знакомый с массивом, описал, как он работает, и если есть способ получить максимум RSS. Заранее спасибо!

РЕДАКТИРОВАТЬ: Ответ здесь, кажется, частично ответить на мой вопрос: Распределяет ли ОЗУ mmap или malloc?

Насколько я понимаю, когда вы отображаете файлы в память, они занимают виртуальное пространство, а не физическое пространство памяти, в большинстве систем ОС. Однако отображаемые страницы начинают занимать пространство физической памяти, как только они загрязняются, то есть что-то записывается на них.

Итак, возвращаясь к моему первоначальному вопросу, может ли это означать, что массив valgrind с флагом --pages-as-heap=yes отслеживает пространство виртуальной памяти, тогда как \time -v показывает меньше физической памяти из-за того, что страницы не были изменены?

...