C 在Linux中访问mark_page_的目的是什么?
我正在分析我的I/O密集型应用程序,在执行C 在Linux中访问mark_page_的目的是什么?,c,linux,performance,linux-kernel,disk-io,C,Linux,Performance,Linux Kernel,Disk Io,我正在分析我的I/O密集型应用程序,在执行read时遇到了一些奇怪的事情。下面是让我感到困惑的性能报告的一部分: 可以看出,它占用了文件读取例程的20%。它似乎与块设备I/O无关,在我的例子中,块设备I/O是由块设备I/O执行的,而块设备I/O甚至没有被调用。所以所有文件数据都在缓存中 以下文字对实施进行了评论: /* * Mark a page as having seen activity. * * inactive,unreferenced -> inactive,r
read
时遇到了一些奇怪的事情。下面是让我感到困惑的性能报告的一部分
:
可以看出,它占用了文件读取例程的20%。它似乎与块设备I/O无关,在我的例子中,块设备I/O是由块设备I/O执行的,而块设备I/O甚至没有被调用。所以所有文件数据都在缓存中
以下文字对实施进行了评论:
/*
* 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).
*/
因此,如果页面处于非活动状态
或未引用状态
,则会出现这种情况
问题:访问此
标记页面的原因是什么?是否因为页面处于非活动状态
或未引用
?原因可能是什么?页面已从磁盘读取,因此不会发生页面错误(主要或次要) 似乎与()及其LRU列表有关,请检查。页面缓存中的页面以几种结构列出,以允许内核在没有可用内存时查找最近未使用的页面。@osgx谢谢,非常有用!但在某种意义上,内核对某些页面执行了readahead
,此后这些页面仍然没有“最近使用过”。这怎么可能?或者我没听清你的意思?readahead不是主动存取,而是I/O预取(优化),因为IO设备更适合大顺序存取(旋转生锈的HDD更适合大I/O,而不是短请求;SSD只适合大的几倍)。活动的页面缓存跟踪用于用户空间请求。读/写系统调用没有任何页面错误-直接调用时会进行复制(复制页面到iter,复制用户增强的快速字符串rep movsb),逐页复制,哪些调用是通用的页面读取+标记页面访问