Что означает тема "Mapped" в Linux / proc / meminfo? - PullRequest
2 голосов
/ 30 августа 2009

Что означает тема "Mapped" в Linux / proc / meminfo? Я видел несколько однострочников, которые говорят мне, что это «Общий объем памяти в килобайтах, который отображается устройствами или библиотеками с помощью mmap». Но теперь я потратил почти двадцать часов на поиск исходного кода ядра 2.6.30.5, пытаясь подтвердить это утверждение, и я не смог этого сделать - на самом деле я вижу некоторые вещи, которые, кажется, конфликтуют с ним.

Счет "Mapped" хранится в global_page_state[NR_FILE_MAPPED]. Комментарий рядом с объявлением NR_FILE_MAPPED гласит: «Страницы Pagecache сопоставлены с таблицами страниц. Изменяются только из контекста процесса».

  1. Не все ли страницы, на которые ссылается тема кэширования meminfo, подкреплены файлами? Разве это не значит, что все эти страницы должны быть «сопоставлены»? Я просмотрел несколько десятков списков meminfo из разных архитектур, и всегда значение «Mapped» намного меньше значения «Cached».

  2. В любой момент времени большая часть памяти заполнена исполняемыми образами и общими библиотеками. Глядя на / proc / pid / smaps, я вижу, что все они отображаются в VMA. Все ли они отображаются в памяти с помощью mmap ()? Если так, то почему "Mapped" такой маленький? Если они не отображаются в память с помощью mmap (), как они отображаются? Вызов handle_mm_fault, который вызывается get_user_pages и различными архитектурно-зависимыми обработчиками ошибок страницы, увеличивает счетчик "Mapped", и они, похоже, делают это для любой страницы, связанной с VMA.

  3. Я смотрел на функции mmap () группы драйверов. Многие из них вызывают vm_insert_page или remap_vmalloc_range для установления своих отображений, и эти функции увеличивают счетчик «Отображения». Но многие другие драйверы, похоже, вызывают remap_pfn_range, что, насколько я могу судить, не увеличивает счетчик "Mapping".

Ответы [ 2 ]

3 голосов
/ 30 августа 2009
  1. Это наоборот. Все в Mapped также находится в Cached - Mapped - данные кэша страниц, которые отображаются в пространство виртуальной памяти процесса. Большинство страниц в Cached не отображаются процессами.

  2. Одна и та же страница может быть отображена во многих различных таблицах страниц, хотя в Mapped она будет учитываться только один раз. Таким образом, если у вас запущено 100 процессов, каждый с 2 ​​МБ, сопоставленными с /lib/i686/cmov/libc-2.7.so, это все равно добавит 2 МБ к Mapped.

0 голосов
/ 30 августа 2009

Я думаю, что предполагается, что он подсчитывает количество страниц, сопоставленных из файлов. В моей копии источника (2.6.31) он увеличивается на page_add_file_rmap и уменьшается на page_remove_rmap, если удаляемая страница не отображается анонимно. page_add_file_rmap, например, вызывается в __do_fault, опять же, если сопоставление не является анонимным.

Так что для меня все выглядит вполне логично ...

...