达到 dirty_background_ratio 后 IO 节流

达到 dirty_background_ratio 后 IO 节流

我想了解Linux IO节流机制。这是我到目前为止得到的:

通过调用write (fd, data, size)系统调用,数据将作为脏页写入操作系统缓存。 OS有两个比率,dirty_background_ratiodirty_ratio管理脏页。当脏页到达 时,操作系统开始后台刷新dirty_background_ratio。这dirty_ratio是操作系统防止超出的硬限制。

如果脏页的数量小于dirty_background_ratio,则应用程序(执行 IO)将不会被操作系统延迟,数据只是作为脏页写入操作系统缓存(自由奔跑)。如果脏页超过dirty_background_ratio,操作系统会异步执行后台刷新并清理脏页。不过,如果我是正确的,在到达set_point = (dirty_ratio + dirty_background_ratio) / 2.据我了解,操作系统试图将脏率保持在set_point.这是我在吴凤光的提交Linux内核的:

用户会注意到,一旦超过全局(背景 + 脏)/2 = 15% 阈值,应用程序就会受到限制,然后在 17.5% 左右保持平衡。

为了实际验证这些观点,我用 C 语言实现了一个简单的应用程序,该应用程序 65 GB1 GB写入块的形式生成 IO 数据(使用write系统调用)。同时,我测量带宽(吞吐量、节流时间)、脏页数,并通过将脏页数除以dirtyable memory = free memory + reclaimable + file cache(根据全局脏内存)。

我的系统(CPU:Xeon 6138,RAM:)192 GB运行 CentOS Linux 7(Core),内核版本为3.10.0-862.9.1.el7.x86_64。 IO 目标是具有400 MB/s写入带宽的 SSD 设备。在进行实验之前,我调用同步命令并等待,以便刷新之前的所有脏页(您会看到全局脏页比率一开始几乎为零)。实验是在干净状态的系统上执行的(没有其他更脏/昂贵的进程,只有系统上运行的操作系统管理相关进程)。这是我的测量结果:

IO 吞吐量/脏页

x轴显示了第 n 个写入1 GB数据。测量结果与计算的速率非常匹配 ( dirty_background_ratio = 10%, set_point = 15%, balanced around 17.5%)。但每次我运行实验(也在其他存储设备上)时,我都会看到达到dirty_background_ratio.您可以在图中的红色区域看到这一点。根据我在不同来源读到的内容(例如上面提到的观点)吴凤光),在达到 之前不应发生节流set_point。而我看到节流在达到时开始dirty_background_ratio并保持稳定,直到达到set_point节流快速增加并收敛到磁盘写入带宽(同步性能400 MB/s)的位置。

所以这是我的问题:为什么我在到达set_point(红色区域)之前会遇到 IO 限制?操作系统如何确定节流量达到set_point


我不久前问过这个问题。用户495217在评论中写道,这可能是操作系统后台活动的副作用。我想知道是否是这种情况,如果是这样,有人知道已经讨论过这一点的任何资源吗?或者有人有任何建议来进行可以证明这一点的实验吗?我测量了IO期间每秒的CPU指令数和周期数,并没有观察到任何可以证明这一点的变化。

相关内容