在多个物理磁盘上优化分配多个写入程序线程的算法

时间:2014-07-17 10:57:13

标签: multithreading algorithm

我有一个逻辑商店,分配了多个物理磁盘

STORE

  • X:\
  • Y:\
  • Z:\
  • ...

我还有一个线程池,可以将数据(大小未知)写入STORE。有没有我可以使用的算法(负载平衡,调度......等)来帮助我确定我应该写哪个物理磁盘?

需要考虑的因素:

  1. 可用磁盘空间。
  2. 磁盘利用率(跨物理磁盘正确分配线程)。
  3. 所有磁盘上的可用空间%应该或多或少相同。
  4. 注意:

    • 每个线程都有自己的数据要处理,因此如果单个线程的数据不可用,它就可以休眠。
    • 磁盘的大小不一定相同。
    • 一个或多个磁盘可以脱机。
    • 可以将一个或多个磁盘添加到STORE。

    更新: 我应该在我的问题中更好地解释这些主题的目标;这些线程从不同的数据源/流中读取并立即写入磁盘,缓冲内存中的流量并不是一个选择,因为它们的大小往往会迅速增长

1 个答案:

答案 0 :(得分:2)

无论你选择什么,都需要进行一些调整。我在下面描述的是一个简单而有效的起点,可能非常适合您的需求。

首先,我怀疑你实际上需要三个线程来处理写入三个磁盘驱动器。编排它所需的处理量实际上非常小。

作为第一个剪辑,您可以使用一个线程和异步写入进行简单的循环调度。也就是说,您只有一个用[X, Y, Z]填充的循环队列。当请求进入时,您从队列的前面获取一个磁盘并启动对该驱动器的异步写入。

当下一个请求进入时,您再次从队列中取出第一个项目并发出异步写入。

异步写入完成后,写入数据的磁盘将添加到队列末尾。

如果驱动器脱机,则会将其从队列中删除。如果将驱动器添加到存储中,则会在队列中为其创建新条目。

上面的一个明显问题是,如果您获得的并发写入请求多于您拥有的驱动器,该怎么办?使用上面描述的技术,线程必须阻塞,直到有可用的驱动器。如果必须支持突发活动,则可以轻松创建请求写入的请求队列(及其关联数据)。然后,执行业务流程的线程将从队列中读取一个项目,从驱动器队列中获取磁盘驱动器,然后启动异步写入。

请注意,使用此设置,一次只能执行一次写入操作。这通常不是问题,因为驱动器硬件通常无法处理多个并发写入。

保持驱动器的可用空间百分比相对相同可能并不困难。您可以轻松地跟踪每个驱动器上的可用空间百分比,而不是使用FIFO队列作为驱动器,使用优先级队列,以便始终写入具有最高可用空间百分比的驱动器。只要您的平均写入大小不是驱动器可用空间的很大百分比,这将很有效。

修改

请注意,我说异步写入。因此,您可以拥有与驱动器一样多的并发写入。这些写操作同时运行,并在完成后通知I / O完成端口。不需要多线程。

对于优先级队列,有很多可供选择的队列,虽然找到一个好的并发优先级队列是一个更多的工作。在过去,我刚刚使用锁来同步对my own priority queue implementation的访问。我想我应该在某个时候将其正式化。

您可以使用我在上面描述的内容,例如,在每个驱动器的队列中添加两个或更多条目。更快速的驱动器,更慢的驱动器更少。目前尚不清楚它的效果如何,但它可能值得尝试。如果这些“驱动器”是高性能网络存储设备,它们实际上可以比典型的本地磁盘驱动器更好地处理多个并发写入。但是在某些时候你必须缓冲写入,因为你的计算机几乎可以肯定地创建数据的速度比你的驱动器写的速度快得多。关键是使缓冲区足够大以处理正常的数据突发,并且还足够强大,以便在缓冲区填满时暂时阻止程序。