我有一个我不明白的页面缓存问题。
据我了解,页面缓存将充当磁盘缓存,用于读取和写入磁盘。但我不知道内核如何将10G内存pagecache映射到200GB磁盘。
读取时,内核只能缓存定期从磁盘读取的数据,但写入磁盘时,数据会先写入内存缓冲区,然后内核再写入磁盘。
但是当写入磁盘的数据非常大时,内存如何有足够的缓冲呢?
答案1
一般来说,这是sysctl
控制这些操作的内核/参数的列表:
vm.dirty_background_bytes
vm.dirty_background_ratio
vm.dirty_bytes
vm.dirty_expire_centisecs
vm.dirty_ratio
vm.dirty_writeback_centisecs
可以在 SUSE 的文章中找到有关这方面的良好且信息丰富的资源调整内存管理子系统。它说它适用于 SUSE Linux Enterprise Server 15 SP3,但对于大多数 Linux 发行版来说都是如此(尽管默认值可能有所不同。
文件数据的缓存。当从磁盘或网络读取文件时,内容存储在页面缓存中。如果页面缓存中的内容是最新的,则不需要磁盘或网络访问。 tmpfs 和共享内存段计入页面缓存。
当写入文件时,新数据会先存储在页面缓存中,然后再写回磁盘或网络(使其成为回写缓存)。当一个页面有新数据尚未写回时,它被称为“脏”。未分类为脏的页面是“干净的”。如果内存不足,只需释放干净的页面缓存页面即可回收它们。脏页在被回收之前必须首先被清除。
[...]
当应用程序写入文件时,页面缓存会变脏,缓冲区缓存也可能会变脏。当脏内存量达到以字节为单位的指定页数 (
vm.dirty_background_bytes
) 时,或者当脏内存量达到总内存的特定比例 (vm.dirty_background_ratio
) 时,或者当脏页的时间超过指定时间量时 ( )vm.dirty_expire_centisecs
),内核开始从页面首先被弄脏的文件开始写回页面。背景字节和比率是互斥的,设置其中一个将覆盖另一个。 Flusher 线程在后台执行写回并允许应用程序继续运行。如果 I/O 无法跟上应用程序弄脏页缓存的速度,并且脏数据达到临界设置(vm.dirty_bytes
或vm.dirty_ratio
),则应用程序开始受到限制,以防止脏数据超过此阈值。
文章Linux内核参数介绍关于这些有一个很好的解释:
这些参数主要用于配置IO回写到磁盘的策略。
dirty_background_bytes
/dirty_bytes
和dirty_background_ratio
/dirty_ratio
分别指的是可以被“脏”页填充的系统内存量和百分比。一般情况下,都会规定比例。dirty_background_ratio
:指系统内存中脏页的百分比(默认为 10%),达到该百分比后台内核刷新进程将开始写回磁盘。dirty_ratio
:指在所有内容必须提交到磁盘之前可以填充脏页的系统内存的绝对最大量。当系统到达这一点时,所有新的 I/O 都会阻塞,直到脏页已写入磁盘,从而导致长时间的 I/O 暂停。系统将首先达到vm.dirty_background_ratio
刷新进程将开始异步写回的条件,并且应用程序继续写入。当系统达到指定值时vm.dirty_ratio
,操作系统将同步处理脏页,阻塞应用程序。vm.dirty_expire_centisecs
:指定脏页在需要写入之前可以在缓存中保留多长时间。它以百分之一秒表示。内存中脏数据的时间超过此间隔的数据将在下次刷新进程唤醒时被写出。vm.dirty_writeback_centisecs
:指定内核刷新进程唤醒的频率。它以百分之一秒表示。