微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linuxasynchronousio_submit写入v / s正常缓冲写入

由于无论如何立即写入(复制到内核缓冲区并返回),使用io_submit写入的优点是什么?

事实上,它(aio / io_submit)似乎更糟,因为您必须在堆上分配写缓冲区,并且不能使用基于堆栈的缓冲区。

我的问题只是关于写入,而不是读取。

编辑:我正在谈论相对较小的写入(最多几KB),而不是MB或GB,所以缓冲区复制不应该是一个大问题。

LinuxasynchronousIO与libaio性能问题

使用内核AIO的应用程序

Block Layer中重复的LBA请求

POSIX AIO:将完成通知关联到原始请求的任何(好)方法

正确处理libaiocallback中的上下文数据?

我可以依靠Linux close()不阻塞的文件I / O?

打开Linux(path,O_NONBLOCK | O_RDONLY | O_DIRECT)会阻止文件上的pread

aio_write是否总是写整个缓冲区?

AIOnetworking套接字和Linux下的零拷贝

一个Nginx工作进程是否同时或一个地处理两个请求?

将缓冲区复制到内核中并不一定是即时的。

首先内核需要找到一个空闲的页面。 如果没有(这很可能在大的磁盘写入压力下),它必须决定驱逐一个。 如果它决定驱逐一个页面(而不是驱逐你的进程),它将不得不实际编写它才能使用该页面

饱和写缓慢的驱动器时,在linux中有一个相关的问题,页面缓存填满了慢速驱动器支持的脏页面。 每当内核需要页面时,出于任何原因,获取一个页面需要很长时间,整个系统因此而冻结。

每个单独写入的大小不如系统的写入压力。 如果你有一百万个小写入已经排队,这可能是一个必须阻止的写入。

关于分配是在堆栈上还是在堆上也不那么重要。 如果要高效地分配块来写入,可以使用专用的池分配器(来自堆),而不是为通用堆分配器付费。

aio_write()通过不将缓冲区拷贝到内核来解决这个问题,它甚至可以直接从缓冲区中取出DMAD(给定对齐要求),这意味着你也可以保存副本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐