Я профилирую свое приложение с интенсивным вводом-выводом и столкнулся с какой-то странной вещью при выполнении read
. Вот часть perf report
, которая меня смутила:
Как видно, 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
? В чем может быть причина? Страница уже прочитана с диска, поэтому сбоев страниц (как основных, так и второстепенных) не происходит.