模拟和优化调度程序作业以从数据中心排出数据

问题描述

我有一个任务来模拟我们目前遇到的一个问题,那就是从旧硬盘驱动器中排出数据。假设我们有 5 个硬盘 H1 ... H5。每个都有特定的容量 Ci 和剩余空间 Ri。而且,我们不希望磁盘达到其全部容量,因此我们需要提出一个调度程序作业,该作业经常从磁盘中排出数据并将其重新定位到其他一些磁盘中。现在的问题是这个排空过程会影响我们系统的工作流程。系统的性能可以通过一些指标来衡量,比如 M1 和 M2。现在,我如何设计一个排空调度程序,它告诉我应该何时以及从哪个磁盘中重新定位多少数据,以便最大限度地减少对 M1 和 M2 的影响? 我使用 SimPy 在 python 中模拟这个系统。

解决方法

适用于任何现实和实用的场景;性能指标(M1 和 M2)与 CPU 时间或(CPU)调度无关。所有现代(和大多数“非现代”)磁盘控制器都使用 DMA/总线控制来向/从磁盘本身传输数据(不使用任何 CPU 时间进行传输),因此 M1 和 M2 将(主要)取决于磁盘 IO 带宽和不是 CPU 时间。

磁盘控制器的设备驱动程序应该/将支持某种IO优先级;允许“当磁盘控制器没有更重要的事情要做(没有更高优先级的传输)时,磁盘控制器驱动程序要求磁盘控制器传输数据以耗尽磁盘(由文件系统层预先安排)”。换句话说,只要使用低IO优先级就可以实现“空闲时清空磁盘”。

然而;仅此一项是行不通的,“仅在(磁盘)空闲时才消耗”的想法从根本上是有缺陷的。问题是,如果磁盘长时间被重击,它仍然会变满(因为磁盘控制器不断有更高优先级的工作要做),从而导致“没有可用磁盘空间”的临界情况(可能出现故障)。解决办法是让draining的IO优先级取决于磁盘的满度。如果磁盘上有足够的剩余空间(超过某个阈值),则“排空的IO优先级”为最低优先级(以免破坏正常磁盘IO的性能);如果可用磁盘空间较少,则排空的 IO 优先级成正比,直到您达到“排空的 IO 优先级是可能的最高优先级,因为没有可用磁盘空间”(牺牲正常磁盘 IO 的性能以防止“没有可用空间当您接近这个极端时,所有”都处于临界状态)。基本上,可能类似于“if(Ri >= threshold) { draining_IO_priority = (1.0 - threshold / Ri) * (max_IO_priority - min_IO_priority) + min_IO_priority; } else { draining_IO_priority = min_IO_priority; }

另请注意,文件系统层(以及磁盘控制器驱动程序和除一些旧的用户空间 API 之外的几乎所有其他内容)主要是事件驱动的。当文件系统收到会导致分配磁盘空间的请求时(例如,由于进程执行“write()”),它通过决定是否需要向磁盘发送“耗尽请求”来响应该事件控制器(除了分配一些磁盘空间)或决定先前的请求是否需要提升 IO 优先级;当文件系统从磁盘控制器接收到“drain request completed”回复事件时,它决定是否需要向磁盘控制器发送另一个排放请求;等考虑到这一点,文件系统层应该使用“高 CPU 调度程序”优先级来快速响应事件(但这与磁盘 IO 优先级无关)。

最后;是的,有一个“IO调度程序”(例如可能内置在磁盘控制器的驱动程序中);但这希望是一个非常简单的“当一个传输完成时,找到最高优先级的待处理传输并执行下一个”算法,不需要太多思考或复杂性。但是,在某些情况下,这取决于设备(例如,对于旧的“旋转机械磁盘”硬盘,可能会尝试减少/优化寻道时间)。

我想我想说的是,对于一个设计良好的系统,根本不应该存在“排空调度器”。