网站首页 > 开源技术 正文
最近几年计算机网络硬件和硬盘的飞速发展对Linux内核产生了很大的影响。鉴于Linux内核在新的网络硬件和硬盘硬件方面的缺陷,Intel开发了DPDK和SPDK等软件包。上述软件包直接绕过Linux内核层,避免使用内核中的中断机制,通过一种新的机制,在用户太完成整个IO。
SPDK全称Storage Performance Development Kit(高性能存储开发包),它把驱动程序尽可能都放到用户态,同时采用了轮询模式,这样消除了Kernel进程之间的切换和中断处理,用这种方法达到高性能。
为了帮助存储OEM(设备代工厂)和ISV(独立软件开发商)整合硬件,Intel构造了一系列驱动,以及一个完善的、端对端的参考存储体系结构,被命名为Storage Performance Development Kit(SPDK)。SPDK的目标是通过同时使用Intel的网络技术,处理技术和存储技术来提高突出显著的效率和性能。通过运行为硬件设计的软件,SPDK已经证明很容易达到每秒钟数百万次I/O读取,通过使用许多处理器核心和许多NVMe驱动去存储,而不需要额外卸载硬件。
Linux的多队列机制
传统的磁盘调度方式只有一个队列,且只有一个队列工作。这种工作方式在目前的硬件情况下越发不适用了,由于SSD硬盘的高性能和多处理器等,导致单队列方式导致冲突加剧,各个线程之间对队列的访问冲突加剧。
之前机械硬盘响应时间在毫秒级别(1-10ms左右),当线程访问磁盘的时候可以完全调度出去进行等待。而现在NVMe的硬盘,响应时间在1-10微秒之间,这个时间相当于一次线程切换的时间。说的形象点,对于机械硬盘,某个线程提交了一个IO,睡了几觉回来,可能IO还没处理完;但对于NVMe硬盘,某个线程提交了一个IO,还没睡着,IO就处理完了。
针对上述问题,Linux内核设计了新的多队列机制,具体如上图所示,新架构是个双层队列:
- 上层是软件队列,每个核心一个,或者NUMA上每个CPU一个。再也大家不用抢一个队列了。这个队列的作用是给一堆IO命令排序。
- 下层是硬件队列,硬件驱动自己选择到底是多少个。这其实是个命令缓冲层,防止硬件那边承受不了。
其它的优化:
- 队列里的每个命令都有一个唯一的标签tag,这个tag还传给了驱动程序,当完成的时候驱动和块设备层就能靠这个tag来确定是哪个IO命令。
- 统计信息的优化,为软硬件队列都做了IO统计支持。这个是来计算带宽用的,系统的iostat接口就会用这些信息,很多工具比如IOZone会使用这个接口。
关于更多细节,作者有一篇论文《Linux Block IO: Introducing Multi-queue SSD Access on Multi-core Systems》,大家可以仔细阅读一下。
Linux的io_uring机制
上面介绍的多队列解决了通用块层的问题,但从用户态应用到通用块层还有好多内容。因此Linux内核中又引入了一种io_uring的机制。该机制可以使得用户态的应用与内核态交互时避免内存拷贝和系统调用。通过这些改善,将极大的提升用户态与内核态数据传输的效率,降低延时。
io_uring是基于两个队列实现的,一个是提交队列,另外一个是完成队列。通过这两个队列直接实现用户态和内核态的内存共享,避免内存的拷贝。下面是作者对该特性的描述,大家可以了解一下:
With this setup, it's possible to do async IO with a single system call. Future developments will enable polled IO with this interface, and polled submission as well. The latter will enable an application to do IO without doing ANY system calls at all.
For IRQ driven IO, an application only needs to enter the kernel for completions if it wants to wait for them to occur.
Each io_uring is backed by a workqueue, to support buffered async IO as well. We will only punt to an async context if the command would need to wait for IO on the device side. Any data that can be accessed directly in the page cache is done inline. This avoids the slowness issue of usual threadpools, since cached data is accessed as quickly as a sync interface.
io_uring的使用也是非常简单,这里只提供了2个接口给用户使用。两个接口分别是:
io_uring_setup(entries, iovecs, params) 设置一个异步IO的上下文,成功后返回一个文件句柄。 io_uring_enter(fd, to_submit, min_complete, flags) 启动IO,可以根据参数确定是否等待IO完成。
具体参数本文就不详细介绍了,这里是关于该特性的示例程序(http://git.kernel.dk/cgit/fio/plain/t/io_uring.c),大家可以自行了解一下。
通过上述2个特性,打通了用户态到物理硬件之间的软件链路,减少了IO处理的软件栈,使得整个IO的延时得到极大的降低,性能得到极大提升。
技术发展真快,稍不留神就被淘汰了!
猜你喜欢
- 2024-10-19 MySQL数据库十大经典错误案例(mysql数据库报错)
- 2024-10-19 「夜读」自我提升的10个好习惯,请逼自己养成
- 2024-10-19 通过提取神经元知识实现人脸模型压缩:MobileID可在移动设备上快速运行
- 2024-10-19 中华UB:做全球一流数字资产交易所
- 2024-10-19 敏矽微电子Cortex-M0学习笔记12-电容触摸按键实例
- 2024-10-19 零基础上手,秒识别检测,IDEA研究院发布全新T-Rex模型
- 2024-10-19 IOGSMT,让你想法落地变成现实(在团队角色中善于把想法变成现实的是哪种角色)
- 2024-10-19 红帽可引导容器BOOTC技术(四)-升级和回滚
- 2024-10-19 国产操作系统-UOS系统信息查看(国产操作系统都有哪些)
- 2024-10-19 八路热电偶采集CAN IO是啥?(热电偶温度采集电路)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)