- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个生成大量 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 似乎是一个太随意的数字而不是某种可配置参数。
câu trả lời hay nhất
如对 "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/
中可见):
max_hw_sectors_kb
硬件可接受的单个 I/O 的最大大小max_sectors_kb
block 层将发送的最大大小max_segment_size
Và max_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_segments
của 128
Vì thế:
4096 * 128 / 1024 = 512
这就是 512K 的来源。
奖金喋喋不休:根据https://twitter.com/axboe/status/1207509190907846657 ,如果您的设备使用 IOMMU 而不是 DMA 引擎,那么您不应该受到段限制...
关于Linux:写入被分成 512K block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494593/
简单问题:如何指定分割窗口中的字符数? C-x-3 将我的窗口均匀分割为两个窗口,但随后的分割会将其中一个窗口分成两半。我想要 3 个大小相同的 window 。文档说我应该能够指定左缓冲区的字符数作
我需要一个程序,可以接受用户输入的数据数量和长度(英尺和英寸或仅英寸),并将这些项目分为 40 组。 我最初尝试在 Excel 中完成此任务,但我不确定是否可以完成。 var cutList = [
这个问题已经有答案了: Why does the division of two integers return 0.0 in Java? [duplicate] (6 个回答) 已关闭 5 年前。
我想知道在使用布局 (MigLayout) 时我可以分成 2 行而不是两列吗? panel.add(fname,"split 2"); panel.add(Fname,"wrap, pushx, gr
我几乎有一个像下面这样的代码,我正在尝试添加 每 6 个结果之后。 echo ""; $query="SELECT * WHERE id='$id' ORDER BY date ASC"; $resu
我在 android 2.2 中创建了一个选项卡 fragment ,带有 android 兼容性支持库 ,现在在我的应用程序中我几乎没有 Activity ,其中一些是扩展 Activity 类和其
这是我的 question 的扩展. 为了让它更简单让我们假设我有一个 pandas 数据框,如下所示。 df = pd.DataFrame([[1.1, 1.1, 2.5, 2.6, 2.5, 3.
我正在开发 Windows Phone 8 应用程序,其中我有一个 Stackpanel,我想在其中放置 7 个矩形。我希望这些矩形具有相同的高度,无论屏幕尺寸如何。我尝试设置 Height="*"
我一直相信java使用UTF-16在内部对其字符进行编码。它使用 u+xxxx 的事实证实了这一点。表示字符代码的格式以及它使用 16 位存储 char 的事实。 . 但有时UTF-16需要超过 2
我正在开发 Windows Phone 8 应用程序,其中我有一个 Stackpanel,我想在其中放置 7 个矩形。我希望这些矩形具有相同的高度,无论屏幕尺寸如何。我尝试设置 Height="*"
为了重新编码 malloc 函数,我执行了 sbrk(stack) 其中: void *malloc(size_t size) { stack = 0; while (stack start
寻找一个 css 或 jquery 解决方案来将这些动态加载的表分解为每行最多 6 个,创建表的脚本将它们全部内联,有时一行中显示多达 32 个 td.tables。我怎样才能在最多只有 6 个内联显
我可以请求帮助将 UTF-16 数据流拆分成 block 吗? 不幸的是,很难找到字母边界。 任何帮助表示赞赏,已经花了几个晚上在这上面,很想了解这个问题。 运行良好的 Java 版本(是否有任何自动
我正在使用 Contact Forms 7在 wordpress 安装中创建联系表单。创建的表单位于 here Contact Form 扩展是免费、灵活且易于使用的。但问题是,无论一个表单包含多少个
我想将一个字符串拆分为一系列子字符串以适合我的数据库,假设我的数据库 varchar 大小为 50。如果将原始字符串切割为最多 50 个字符,那么我需要在该字符串中包含尾随 (逗号)。例如, 我的原始
我必须用 css 做一个足球队盾牌,我的想法是用球队的颜色做一个圆圈,我已经用 1 种或 2 种颜色为盾牌做了圆圈,但我在使用 3 种颜色的盾牌时遇到了麻烦 我将其用于 2 种颜色的防护罩 .equi
如果我有 1000 美元(可变),我想把这笔钱分给 20(可变)人,但不是平均地给每个人,我想给第一个人更多,然后第二人称等 所以第 20 个人得到的最少,第 5 个人得到的第 5 多。 我将如何实现
我需要一种算法,将数字 n 分成 k 部分,并增加限制,即每个分区元素必须在 a 0 and k > 0: for x in range(a, b+1): fo
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Swing: How do I set a component height to the containe
Thật khó để nói những gì để hỏi ở đây. Câu hỏi không rõ ràng, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập Trung tâm trợ giúp.
Tôi là một lập trình viên xuất sắc, rất giỏi!