利用io_uring实现高性能IO
原文:Efficient IO with io_uring
本文为该英文文档的翻译,此外还有一些个人理解。以下为正文:
本文为对最新的Linux IO接口 io_uring 的简介,并将其与现有IO接口进行比较。具体来说,我们将探讨 io_uring 被提出的原因、内部实现方式和用户态接口。本文并不会深入具体命令的细节,因为这些内容可以通过查阅man pages得到(但是不可避免地,会有一些重叠)。相反,本文的目的是介绍 io_uring 和它的工作方式,以使读者深入理解它的各个部分是如何组合到一起的。
1.0 介绍
Linux中有许多进行进行文件IO访问的接口。最古老、最基础的为 read() 和 write() 系统调用。后续还有 pread 和 pwrite()、 preadv() 和 pwritev() 、 preadv2() 和 pwritev2()等改进后的接口。它们均为同步接口,即这些系统调用在读或者写完成后才返回。在高并发场景下,同步接口的IOPS受限。 类似aio_read() 和 aio_write() 的异步接口被提出。然而,这些接口的实现不够优雅,性能也不太好 ...
FAST 16 - CFFS阅读笔记
The Composite-file File System: Decoupling the One-to-One Mapping of Files and Metadata for Better Performance
Author: Shuanglong Zhang. et al
Conference or Journal: FAST;TOS
Institute: Google & Florida State University
IsOpenSource: No
Link: https://www.usenix.org/system/files/conference/fast16/fast16-papers-zhang-shuanglong.pdf
Published Date: February 22, 2016 → March 1, 2020
摘要
传统的文件系统优化是基于文件与其元数据一一对应的基础上进行的,而这种文件-元数据的绑定会限制一些优化。本文设计并且实现、评估了一种复合文件文件系统,即允许文件到元数据的多对一映射。同时本文评估了多种映射机制的实现方式。在w ...
Belady's MIN缓存管理算法阅读笔记
A study of replacement algorithms for a virtual-storage computer
作者:L. A. Belady
期刊:IBM Systems Journal
年份:1966
原文不太好找,所以这里放一个github网址,里面可以下载。
FAST 23-OSML 阅读笔记
Intelligent Resource Scheduling for Co-located Latency-critical Services: A Multi-Model Collaborative Learning Approach
作者:Lei Liu, Xinglei Dou, Yuetao Chen
会议:FAST
年份:2023
为了性价比的考虑,多种延迟敏感负载共同使用服务器。资源调度成为保证QoS的核心。但是,随着服务器资源的增多,资源调度越来越复杂,传统的调度器难以迅速高效地提供最优的策略。而且,” 资源峭壁”的存在也使得QoS存在抖动。为了解决这一问题,作者提出了OSML——基于机器学习的智能调度器。OSML主要学习硬件hint(如IPC、cache miss率、内存足迹等)、调度解决方案和QoS需求之间的关系,能预测QoS的变化、指导调度并且从违反QoS要求的情况下恢复回来。通过实验验证,OSML支持更高的负载、用更低的调度小号满足QoS需求,且和之前的调度器相比,缩短了收敛的时间。
开源网址(将在2023年八月公开)
https://github.com/Sy ...
ChCore-lab-v2-ECNUver: LAB 2
实验2:内存管理
本实验主要目的在于让同学们熟悉计算机进行地址翻译的过程,并且了解计算机启动过程中,如何对内存初始化,以及启动完成后对内存和页表的管理。
包括三个部分:内核启动页表、物理内存管理和页表管理。
注:为了帮助同学们了解这些知识,本节会出现少量“小思考”,不会算入实验报告评分。
课堂回顾:地址翻译机制与多级页表
本部分为地址翻译的介绍,若对这一部分有充分了解的同学可以放心跳过~(但不要跳过思考题)
地址翻译的机制
内存的访问粒度是Byte(即每次最少读/写一个Byte),每个Byte有一个“编号”,这个“编号”就是地址。地址空间 就是可以访问的地址的集合。
C语言中的指针变量存储的就是数据的地址,我们可以通过%p在printf函数中输出它,例如下面的代码:
1234567891011#include <stdio.h>int main(void){ int n; n=10; int* ptr=&n; //ptr存放n的地址 printf("n=%d\n",n); ...
test
test
This is a test file.