Для чего mark_page_accessed в Linux? - PullRequest
0 голосов
/ 12 января 2020

Я профилирую свое приложение с интенсивным вводом-выводом и столкнулся с какой-то странной вещью при выполнении read. Вот часть perf report, которая меня смутила:

enter image description here

Как видно, mark_page_accessed занимает 20% процедуры чтения файла. Похоже, это не связано с вводом / выводом блочного устройства, которое выполняется page_cache_async_readahead, который даже не вызывается в моем случае. Таким образом, все данные файла находятся в кэше.

Реализация void mark_page_accessed(struct page *page) прокомментирована следующим текстом:

/*
 * Mark a page as having seen activity.
 *
 * inactive,unreferenced    ->  inactive,referenced
 * inactive,referenced      ->  active,unreferenced
 * active,unreferenced      ->  active,referenced
 *
 * When a newly allocated page is not yet visible, so safe for non-atomic ops,
 * __SetPageReferenced(page) may be substituted for mark_page_accessed(page).
 */

Таким образом, кажется, что это происходит, если страница inactive или unreferenced.

ВОПРОС: В чем причина mark_page_accessed? Это произошло из-за того, что страница либо inactive, либо unreferenced? В чем может быть причина? Страница уже прочитана с диска, поэтому сбоев страниц (как основных, так и второстепенных) не происходит.

...