我有一个生成大量 SCSI 写入的用户空间应用程序(详情如下)。但是,当我查看到达 SCSI 目标的 SCSI 命令(即存储,由 FC 连接)时,某些东西会将这些写入分成 512K 块。
该应用程序基本上直接将 1M 大小的直接写入设备:
fd = open("/dev/sdab", ..|O_DIRECT);
write(fd, ..., 1024 * 1024);
此代码导致发送两个 SCSI WRITE,每个 512K。
但是,如果我发出直接 SCSI 命令,没有块层,写入不会拆分。我从命令行发出以下命令:
sg_dd bs=1M count=1 blk_sgio=1 if=/dev/urandom of=/dev/sdab oflag=direct
我可以看到一个 1M 大小的 SCSI WRITE。
问题是,什么是拆分写入,更重要的是,它是否可配置?Linux 块层似乎是有罪的(因为 SG_IO 没有通过它)并且 512K 似乎太随意了,不是某种可配置的参数。