SCSI异步IO真的比同步IO慢吗?

SCSI异步IO真的比同步IO慢吗?

我对刚刚读到的这两页内容感到十分困惑:

http://www.scsifaq.org/scsifaq.html#_Hlk410546176 http://www.cse.scu.edu/~tschwarz/coen180/LN/scsi.html

两者都声称 SCSI 异步 IO 比同步 IO 慢。为什么?为什么有人会费心编写异步程序,结果却损失了性能?

这与我的预期相反!

特别是,在 SSD 的情况下,我使用 libaio 进行异步读取以获得更好的性能。

此外,第一个列表同步为发送发送发送等待等待等待...这正是 libaio 中的异步情况。

有人可以为我解释一下吗?!

编辑1

让我澄清一下我的问题。我可能对异步和同步 IO 之间的区别理解不正确。

  • 同步:等待每个操作完成
  • 异步:它从不等待每个操作完成

现在,我假设如果我必须阅读依次几 GB 的数据,通过一个简单的同步循环读取它:

while ( num_blocks-- > 0 )
    read_block() ;

会有“请求、暂停、请求”类型的查询。实际上,我发现如果我将其更改为多线程过程,跨越几个 (6-8) 个线程,这些线程将获取“下一个要读取的位置”,然后请求它,我几乎可以获得最大的读取性能。

像这样:

struct request
{
    ...

    boost::mutex mutex ;
    uint64_t     block ;

    uint64_t get_block_location()
    {
        boost::mutex::scoped_lock lock( mutex ) ;
        return block++ ;
    }
} ;

void readth( request* r )
{
    try
    {
        for( ;; )
        {
            read_block( r->get_block_location()) ;
        }
    }
    catch( const FinishedException& )
    {}
}

我认为,现在,在重新思考了我刚刚在@Robert Harvey 的帮助下读到的内容后,我开始明白异步/同步实际上只是一个等待结果的“节省时间”的问题……

我留下这个问题只是为了防止有人像我一样有认知问题!

答案1

异步 I/O 并不是为了提高磁盘性能的速度。您无法通过使 I/O 异步来实现这一点;无论您以何种方式进行 I/O 调用,磁盘盘片都以相同的速度旋转。

异步 I/O 的目的是让您在等待数据时可以去做其他事情。虽然这看起来可以提高性能,但您真正做的是让处理器在数据到达时不必闲置。

答案2

我每次搜索 SCSI 内容时都会遇到这个问题。

问题在于术语。基本上,当 SCSI 设备首次问世时,异步设备是首选。这是因为它们最简单。设备打开一个称为 REQ 的引脚,您读取总线,然后断言 ACK,然后设备关闭 REQ,然后您关闭 ACK。这是一个交接。正如您所见,它 100% 地确保双方都知道总线上的数据是有效的。它也非常耗费控制器/CPU。

同步传输只是去掉了 ACK 部分,因此在数据阶段它只是根据之前协商的频率发送/恢复数据。因此,从理论上讲,它要快得多。

然而,就像圣诞老人一样,这句话也只有部分是真的。虽然你可以宣传所有速度而无需验证每个字节,但这并不意味着设备可以发送它。许多旧的甚至现代的 SCSI 驱动器在机械上都无法跟上它们自己宣传的总线速度。

所有这些虽然都偏离了主题,但当您搜索 SCSI 时仍然会出现,这说明术语是错误的。在编程中,同步可能意味着传输可能指同时传输和接收数据(SCSI 只是一个单向系统),而异步甚至可能指您编写的代码类型或仅读取或写入的数据。

到最后你唯一的希望就是你的文档是好的,而不是像 SCSI-3 标准的集群 F@#$。

链接到 SCSI 协议

相关内容