由于无论如何立即写入(复制到内核缓冲区并返回),使用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下的零拷贝
将缓冲区复制到内核中并不一定是即时的。
首先内核需要找到一个空闲的页面。 如果没有(这很可能在大的磁盘写入压力下),它必须决定驱逐一个。 如果它决定驱逐一个脏页面(而不是驱逐你的进程),它将不得不实际编写它才能使用该页面。
饱和写缓慢的驱动器时,在linux中有一个相关的问题,页面缓存填满了慢速驱动器支持的脏页面。 每当内核需要页面时,出于任何原因,获取一个页面需要很长时间,整个系统因此而冻结。
每个单独写入的大小不如系统的写入压力。 如果你有一百万个小写入已经排队,这可能是一个必须阻止的写入。
关于分配是在堆栈上还是在堆上也不那么重要。 如果要高效地分配块来写入,可以使用专用的池分配器(来自堆),而不是为通用堆分配器付费。
aio_write()通过不将缓冲区拷贝到内核来解决这个问题,它甚至可以直接从缓冲区中取出DMAD(给定对齐要求),这意味着你也可以保存副本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。