Linux kernel 我应该使用什么库或API来实现执行异步IO的linux内核模块?

Linux kernel 我应该使用什么库或API来实现执行异步IO的linux内核模块?,linux-kernel,linux-device-driver,dma,aio,Linux Kernel,Linux Device Driver,Dma,Aio,首先我会告诉我的电脑环境,我的问题背景,我的问题,然后我会解释我的确切问题 环境: 操作系统:Ubuntu 16.04 内核:4.17.1 CPU:i7-6700k 内存:8GB DRAM 存储:SSD 120GB 背景: 我正在尝试为我的特定应用程序优化linux内核。以下是此应用程序的抽象逻辑。 1.调用malloc,分配大小正好为4KB(页面大小)的内存空间 2.将预定义数据(同样,大小为4KB)复制到分配的内存空间。 3.进行计算 4.释放分配的内存空间。 这个序列每秒发生几千到一万次。

首先我会告诉我的电脑环境,我的问题背景,我的问题,然后我会解释我的确切问题

环境:
操作系统:Ubuntu 16.04
内核:4.17.1
CPU:i7-6700k
内存:8GB DRAM
存储:SSD 120GB

背景:
我正在尝试为我的特定应用程序优化linux内核。以下是此应用程序的抽象逻辑。
1.调用malloc,分配大小正好为4KB(页面大小)的内存空间
2.将预定义数据(同样,大小为4KB)复制到分配的内存空间。
3.进行计算
4.释放分配的内存空间。
这个序列每秒发生几千到一万次。 所以我认为每秒使用memcpy()将预定义数据复制到分配的内存空间是非常低效的。但我无法修复此应用程序的代码

我的问题:
我希望通过内核模块异步执行这些复制,尽可能减少CPU周期。因此,我尝试实现一个内核模块,该模块在内核中异步地将这些预定义数据复制到空闲页面帧,并管理一个包含预定义数据的池页面帧。当我的特定应用程序请求一个页面帧时,我的内核将从这个池中提供一个页面帧

为了异步复制数据,我首先考虑了DMA,但我的CPU的intel idma64无法将数据内存异步复制到内存。现在,我正在尝试将这些数据从辅助存储(SSD)复制到内存。我发现linux中有一个名为libaio的异步IO库

我的问题:
1.我可以在内核模块中使用libaio库吗?如果不是,我必须使用什么样的库或API在内核模块中异步复制?

2.libaio(或其他东西)真的会在不利用CPU周期的情况下进行复制吗?

我认为您不需要编写内核模块。CPU固定线程的用户空间线程池处理文件的内存映射集合将尽可能高效地实现。只需小心“TLB分解”,即避免修改进程的地址空间,并尽可能多地抛出虚拟地址空间以避免问题。也许可以通过
madvise()
向内核暗示一下,哪些写入的页面将永远不会被再次使用,并且您应该是最佳的-足够多的线程将最大限度地提高到SSD的队列深度,您希望针对QD8到QD16,并且您应该轻松地饱和NVMe链接,同时将CPU使用率保持在100%以下


如果你有很多NVME链接的SSD,事情可能会变得更加困难,你可能需要考虑替换Linux,这将有更大的可扩展存储I/O,但是在那里有一个吞吐量和可伸缩性权衡。如果你正确地划分工作,Windows和FreeBSD在很多设备上可以更好地扩展,但是Linux在一些设备上可以做得更好。祝你好运

呆在用户空间里。使用
gprof
perf
评测您的应用程序,以准确查看时间花在哪里<该处理器上4kb的code>memcpy应小于一微秒。硬盘上是否有“预定义数据”(在文件中)?如果是这样,请使用异步读取文件。如果RAM中有“预定义数据”,那么就没有从RAM到RAM的异步复制这样的事情:异步意味着在底层操作等待时不等待(也就是说,不消耗CPU,只消耗其他设备)。但从RAM到RAM的复制仅由CPU执行。@MikeAndrews谢谢您的评论。我知道memcpy不是一项非常昂贵的工作,但每秒将4KB的数据放入缓存超过10000次会污染缓存。由于许多其他原因,我必须这样做。@Tsyvarev预定义的数据在硬盘中。我的目标是以最小的CPU周期消耗将数据处理到空页面框架中。我认为最好将数据加载到RAM上,并使用DMA进行RAM到RAM的复制,但我的电脑不支持RAM到RAM的复制。因此,我尝试从SSD中的文件异步复制预定义数据。那么,如何在内核中异步读取文件呢?内核中的块I/O是否异步?您评论中的“异步读取”是否意味着将数据从存储复制到RAM?我不太明白:您的应用程序(用4个步骤描述)是在用户空间还是在内核中工作的?如果是前者,为什么要读取内核中的文件?如果是后者,那么内核代码很少被命名为“应用程序”。此外,内核中没有库。请详细说明。