Linux 文件系统缓存:将数据从脏数据移至回写

Ole*_*nge 7 linux performance software-raid

我的软件 RAID 可以持续写入 800 MB/s。我看到当cat /proc/meminfo |grep Writeback:返回 > 2 GB时会发生这种情况。但是,大多数情况下,回写大约为 0.5 GB,这提供了大约 200 MB/s 的性能。

有大量数据要写入。cat /proc/meminfo |grep Dirty:说脏缓存是 90 GB。

据我了解,Dirty 是需要写入的内容,而 Writeback 是主动写入磁盘的内容。因此,Dirty 中的块可能位于磁盘上与 Writeback 中的块相邻的磁盘上,并且这些块不会在同一个 go 中写入。

这可以解释为什么如果 Writeback 很小,我的性能会差很多,因为寻找的时间比写几个额外 MB 的时间要长得多。

所以我的问题是:我能否以某种方式告诉内核更积极地将更多数据从 Dirty 移动到 Writeback,从而增加 Writeback?

- 编辑 -

这是在低性能期间:

$ cat /proc/meminfo
MemTotal:       264656352 kB
MemFree:          897080 kB
Buffers:              72 kB
Cached:         233751012 kB
SwapCached:            0 kB
Active:          3825364 kB
Inactive:       230327200 kB
Active(anon):     358120 kB
Inactive(anon):    47536 kB
Active(file):    3467244 kB
Inactive(file): 230279664 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:      204799996 kB
SwapFree:       204799996 kB
Dirty:          109921912 kB
Writeback:        391452 kB
AnonPages:        404748 kB
Mapped:            12428 kB
Shmem:               956 kB
Slab:           21974168 kB
SReclaimable:   21206844 kB
SUnreclaim:       767324 kB
KernelStack:        5248 kB
PageTables:         7152 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    337128172 kB
Committed_AS:     555272 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      544436 kB
VmallocChunk:   34124336300 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      149988 kB
DirectMap2M:    17649664 kB
DirectMap1G:    250609664 kB


cat /proc/sys/vm/dirty_background_ratio
1
Run Code Online (Sandbox Code Playgroud)

降低dirty_writeback_centisecs 只会在更小的位上切碎Dirty。

Soh*_*rty 3

您没有提供整个 /proc/meminfo 输出,因此我不知道您事先是否进行了任何调整。

您可以使用的两个直接可调参数是:

/proc/sys/vm/dirty_background_ratio

 dirty_background_ratio

Contains, as a percentage of total system memory, the number of pages at which
the pdflush background writeback daemon will start writing out dirty data.
Run Code Online (Sandbox Code Playgroud)

默认值为 10。将其增加到 30 或 40 并进行测试。

/proc/sys/vm/dirty_writeback_centisecs

dirty_writeback_centisecs

The pdflush writeback daemons will periodically wake up and write `old' data
out to disk.  This tunable expresses the interval between those wakeups, in
100'ths of a second.

Setting this to zero disables periodic writeback altogether.
Run Code Online (Sandbox Code Playgroud)

默认值为 500。将其设置为 300 并进行测试。

请记住这些不是绝对值。您必须经过反复试验才能找出最适合您的环境的方法。

我只是根据您提供的描述计算出这些值并假设这是正确的。

如果您安装了 kernel-doc 软件包,请转到 sysctl,然后打开 vm.txt 来阅读相关内容。