首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用什么库或API来实现执行异步IO的linux内核模块?

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

Stack Overflow用户
提问于 2018-06-24 12:15:31
回答 1查看 230关注 0票数 0

首先,我将告诉我的个人电脑环境,我的问题的背景,我的问题,比我将解释我的确切问题。

环境:

操作系统: Ubuntu 16.04

内核: 4.17.1

CPU: i7-6700 k

内存: 8GB DRAM

存储空间: SSD 120 SSD

背景:

我正在尝试为我的特定应用程序优化linux内核。以下是此应用程序的抽象逻辑。

  1. 调用malloc,分配大小正好为4KB(页大小)的内存空间。
  2. 将预定义数据(同样,大小为4KB)复制到分配的内存空间。
  3. 做计算
  4. 空闲内存空间。 这个序列大约每秒发生几千到一万次。因此,我认为每秒钟使用memcpy()数千次将预定义的数据复制到分配的内存空间中是非常低效的。但是我不能修复这个应用程序的代码。

我的问题:

我希望通过内核模块异步执行这些副本,使用尽可能少的CPU周期。因此,我试图实现一个内核模块,该模块将预定义的数据复制到内核中异步释放页面帧,并管理具有预定义数据的池页帧。当我的特定应用程序请求一个页面框架时,我的内核将从这个池中提供一个页面框架。

为了异步复制数据,我首先考虑了DMA,但是CPU的英特尔idma64不能异步地将数据内存复制到内存中。现在,我试图将这些数据从二级存储(SSD)复制到内存中。我发现linux中有一个名为libaio的异步IO库。

我的问题:

  1. 我可以在内核模块中使用libaio库吗?如果没有,那么在内核模块中异步复制需要使用什么样的库或API?
  2. 李白(或其他东西)真的会在不利用CPU周期的情况下复制吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-25 18:02:24

我不认为您需要编写内核模块。使用文件内存映射集合的CPU固定线程的用户空间线程池将尽可能高效地实现。只需小心"TLB射击“,即避免修改进程的地址空间,并尽可能多地抛出虚拟地址空间以避免这一问题。也许有一点暗示内核,什么写的页面永远不会再通过madvise()使用,而且您应该是最优的--足够多的多线程将最大限度地提高SSD的队列深度,您希望将目标对准QD8到QD16,并且应该很容易地使NVMe链接饱和,同时将CPU使用率保持在100%以下。

如果您有许多NVMe链接的SSD,您可能需要考虑用更可伸缩的存储i/o来代替Linux,但是这里存在吞吐量和可伸缩性的权衡。如果正确地划分工作,Windows和FreeBSD将在许多设备上进行更好的扩展,但是Linux在一些设备上会做得更好。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51009873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档