我正在分析我的 I/O 密集型应用程序,并在执行read
. 这是让我感到困惑的部分perf report
:
可以看出,它mark_page_accessed
占用了文件读取例程的 20%。它似乎与执行的块设备 I/O 无关,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
or ,它似乎会发生unreferenced
。
问题:这是什么原因mark_page_accessed
?是因为页面是不是而发生inactive
的unreferenced
?可能是什么原因?该页面已从磁盘读取,因此不会发生页面错误(主要或次要)。