Немного контекста: я пытаюсь реализовать приложение 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
показывает меньше физической памяти из-за того, что страницы не были изменены?