gpt4 book ai didi

Linux:写入被分成 512K block

转载 作者:太空狗 更新时间:2023-10-29 11:20:09 25 4
gpt4 key购买 nike

我有一个生成大量 SCSI 写入的用户空间应用程序(详情如下)。但是,当我查看到达 SCSI 目标(即存储,由 FC 连接)的 SCSI 命令时,某些东西将这些写入拆分为 512K block 。

应用程序基本上直接将 1M 大小的直接写入设备:

fd = open("/dev/sdab", ..|O_DIRECT);
write(fd, ..., 1024 * 1024);

此代码导致发送两个 SCSI WRITE,每个 512K。

但是,如果我在没有 block 层的情况下直接发出 SCSI 命令,则写入不会拆分。我从命令行发出以下命令:

sg_dd bs=1M count=1 blk_sgio=1 if=/dev/urandom of=/dev/sdab oflag=direct

我可以看到一个 1M 大小的 SCSI WRITE。

问题是,什么是拆分写入,更重要的是,它是可配置的吗?Linux block 层似乎是有罪的(因为 SG_IO 不通过它)并且 512K 似乎是一个太随意的数字而不是某种可配置参数。

最佳答案

如对 "Why is the size of my IO requests being limited, to about 512K" 的回答中所述Unix & Linux Stack Exchange 问题和内核 block 层维护者 Jens Axboe 的“When 2MB turns into 512KB”文档的“设备限制”部分,这可能是因为您的设备和内核有大小限制(在 /sys/block/<disk>/queue/ 中可见):

  • max_hw_sectors_kb硬件可接受的单个 I/O 的最大大小
  • max_sectors_kb block 层将发送的最大大小
  • max_segment_sizemax_segments分散收集 (SG) I/O 的 DMA 引擎限制(每个段的最大大小和单个 I/O 的最大段数)

当 I/O 来自的缓冲区不连续时,段限制很重要,在最坏的情况下,每个段可能与页面一样小(在 x86 平台上为 4096 字节)。这意味着一个 I/O 的 SG I/O 的大小可以限制为 4096 * max_segments .

The question is, what is splitting the write

正如您猜到的 Linux block 层。

and, more importantly, is it configurable?

你可以摆弄max_sectors_kb但其余部分是固定的并且来自设备/驱动程序限制(所以我猜你的情况可能不是,但由于内存碎片较少,你可能会在重新启动后直接看到更大的 I/O)。

512K seems too arbitrary a number not to be some sort of a configurable parameter

该值可能与片段 SG 缓冲区有关。假设您在 x86 平台上并且有一个 max_segments128所以:

4096 * 128 / 1024 = 512

这就是 512K 的来源。

奖金喋喋不休:根据https://twitter.com/axboe/status/1207509190907846657 ,如果您的设备使用 IOMMU 而不是 DMA 引擎,那么您不应该受到段限制...

关于Linux:写入被分成 512K block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com