我有一个任务是模拟我们目前遇到的一个问题,那就是从旧硬盘中排出数据。假设我们有5个硬盘H1 ...H5。每一个都具有特定容量Ci和剩余空间Ri。而且,我们不希望磁盘达到其满容量,因此我们需要设计一个调度程序作业,该作业频繁地从磁盘中排出数据,并将其重新定位到其他一些磁盘中。现在的问题是,这种排出过程会影响我们系统的工作流程。系统的性能可以通过一些指标来衡量,比如说M1和M2。现在,我如何设计一个排出调度程序,告诉我应该何时以及多少数据应该从哪个磁盘重新定位,以便将对M1和M2的影响降至最低?我用SimPy用Python语言模拟了这个系统。
发布于 2021-02-13 14:54:49
对于任何现实和实际的场景,性能指标(M1和M2)将与CPU时间或(CPU)调度无关。所有现代(以及大多数“非现代”)磁盘控制器都使用DMA/总线主控向/从磁盘本身传输数据(不使用任何CPU时间进行传输),因此M1和M2将(主要)依赖于磁盘IO带宽,而不是CPU时间。
磁盘控制器的设备驱动程序应该/将支持某种类型的IO优先级;允许“当磁盘控制器没有更重要的事情要做(没有更高优先级的传输)时,磁盘控制器驱动程序要求磁盘控制器传输数据以排出磁盘(如文件系统层预先安排的)”。换句话说,仅仅通过使用低IO优先级就可以实现“当磁盘空闲时排出磁盘”。
然而,单凭这一点是行不通的,“只有当(磁盘)空闲时才排出”的想法从根本上是有缺陷的。问题是,如果磁盘长时间受到冲击,它仍然可能变满(因为磁盘控制器不断有更高优先级的工作要做),从而导致“没有可用的磁盘空间”的关键条件(可能发生故障)。解决方案是使排出的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优先级提升来响应该事件;当文件系统从磁盘控制器接收到“排出请求完成”应答事件时,它决定它是否需要向磁盘控制器发送另一个排出请求;考虑到这一点,文件系统层应该使用“高CPU调度器”优先级来快速响应事件(但这与磁盘IO优先级无关)。
最后;是的,有一个"IO调度器“(例如,可能内置于磁盘控制器的驱动程序中);但希望这是一个非常微不足道的”当一个传输完成时,找到最高优先级的待定传输并执行下一个“算法,它不需要太多的考虑或复杂性。然而,在某些情况下,这取决于设备(例如,对于旧的“旋转机械磁盘”硬盘驱动器,可能涉及减少/优化寻道时间的尝试)。
我想我想说的是,对于一个设计良好的系统来说,根本不应该存在一个“排出调度器”。
https://stackoverflow.com/questions/66181880
复制相似问题