欢迎来到之路教程(on itroad-com)

说明

每当应用程序/数据库进程需要将虚拟页面添加到物理内存但没有剩余的空闲物理页面时,操作系统必须清除剩余的旧页面。

现在如果旧页面根本没有被写入,那么这个页面不需要保存,它可以简单地从数据文件中恢复。
但是如果旧页面已经被修改,那么它必须保留在某个地方,以便应用程序/数据库可以在以后重新使用,这称为脏页面。

操作系统将这些脏页存储在交换文件中(因此它可以从物理内存中删除,以便另一个“新”页面可以存储在物理内存中)如果大量数据将从页面缓存中删除到脏页区域,这可能会导致严重的 IO 瓶颈如果实际交换设备位于本地磁盘 ( sda ) 上,并且如果本地根 ( OS ) 磁盘也使用本地磁盘,则会导致更多问题。

Linux 中的页面缓存只是一个磁盘缓存,它为操作系统带来了另外的性能,有助于对文件进行密集的高读/写。

由于页面缓存的“子”产品是脏页面,这在上面的示例案例中进行了解释。
每当应用程序写入文件或者创建文件时,也可以观察到脏页面,页面缓存区域会发生首次写入,因此创建一个 10MB 文件可以非常快的文件:

# dd if=/dev/zero of=testfile.txt bs=1M count=100
10+0 records in
10+0 records out
10485760 bytes (100 MB) copied, 0,1121043 s, 866 MB/s

这是因为该文件是在内存区域而不是实际磁盘中创建的,因此响应时间非常快。
在操作系统下,这样的事情会在 /proc/meminfo 中被注意到,在“脏:

在执行上述命令之前,记下 /proc/meminfo 和 'Dirty' 行:

# more /proc/meminfo | grep -i dirty
Dirty: 96 kB

命令执行后:

# more /proc/meminfo | grep -i dirty
Dirty: 102516 kB

定期操作系统或者应用程序/数据库将启动同步,将实际的 testfile.txt 写入磁盘:

# more /proc/meminfo | grep -i dirty
Dirty: 76 kB

例如,现在 Oracle 数据库不允许对内存区域进行这样的写入,就像操作系统会崩溃或者 SAN LUn 会失败一样,数据会受到损害。
这就是 Oracle 数据库要求数据“同步”的原因,因此所有写入都需要由后端(如磁盘/LUN)确认,然后数据库才会抛出更多写入请求。

通常,数据库/应用程序会定期删除缓存,因此脏页会以小块的形式写入磁盘。
在某些情况下,脏页面的大小可能会增加,因为应用程序/数据库可能没有正确配置页面缓存机制。

所以脏页可以写入交换文件(交换区),也可以写入磁盘中的特殊区域(LUN/文件系统)。
例如,如果我们创建了超过 100MB 的交换文件,稍后将从交换文件中重新使用这些文件,我们可能会在交换设备上导致不必要的 IO 问题。
企业系统将交换文件和交换区域存储在操作系统上的固态驱动器 (SSD) 或者专用 LUN 下,因此本地磁盘性能不会受到影响(因为通常交换区域是在本地磁盘上创建的)

在某些情况下,应用程序/数据库内部可能存在问题,脏页将作为交换文件写入,但永远不会被重用,这将导致交换区域增长并导致本地磁盘上不必要的 IO,并导致操作系统下的大量交换使用。

要了解操作系统将在哪个阶段尝试将脏页转储回磁盘层,请在此处查看有关虚拟内存的官方内核文档并查找如下设置:

vm.dirty_background_ratio
vm.dirty_ratio
vm.swappiness

dirty_background_ratio
dirty_ratio
dirty_background_bytes
dirty_expire_centisecs

以上设置需要根据数据库/应用程序要求进行调整,因为操作系统没有任何“最佳实践”设置,它们根据 DB/APP 负载/配置进行调整。

每当应用程序/数据库要求在物理内存上释放内存页面时,操作系统倾向于将所有内容保存在页面缓存中,因此操作系统需要重新分配一些页面并将它们标记为脏。
如果应用程序/数据库端被正确调整和缩放,这个过程工作正常,否则它将导致真正激进的交换发生,因为操作系统需要将所有脏页写回交换磁盘,这可以通过 vm.swappiness 设置进行控制。

如果应用程序/数据库将执行一致的交换,则可能会导致交换设备上出现严重的 IO 写入并导致严重的系统停顿,请始终确保在内存管理方面正确配置应用程序/数据库。

正如所解释的,并非所有页面都将被标记为脏,大多数未使用的页面将被丢弃而不是被标记为脏(这完全取决于已分配的页面是否被修改)

要验证哪些 PID 正在使用交换区域,可以使用以下命令:

for file in /proc/*/status
do 
    awk '/VmSwap|Name/{printf  " " }END{ print ""}' $file
done | sort -k 2 -n -r

释放“消耗”的交换空间确实是有限的,通常如果 PID 正确退出或者只是关闭交换空间将被重新声明,但杀死 PID 或者如果它像段错误一样异常结束可能仍然会消耗掉交换空间。
另一种选择是重新启动,因为执行 swapoff 和 swapon 命令会导致严重问题甚至导致系统崩溃状态。

问题

在Linux中,什么是脏页( Dirty Pages ),它们的用途是什么?

Linux 中的脏页
日期:2020-09-17 00:14:23 来源:oir作者:oir