LWN:利用BIO caching来提供IO速度!

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

关注了就能看到更多这么棒的文章哦~

More IOPS with BIO caching

By Jonathan Corbet
September 6, 2021
DeepL assisted translation
https://lwn.net/Articles/868070/

很久很久以前,块存储设备(block storage device)速度非常慢,经常拖慢了整个系统的速度。为了能从存储设备中获得最佳性能,我们花了很大的力气来对所有的 request 调整顺序。为此而让 CPU 多耗费一些时间就是值得的。但是后来存储设备的速度大增,这个交换就不那么值得了。后来,那些花里胡哨的 I/O 调度机制不再是人们关注重点了,现在的工作重点变成了优化代码能使 CPU 跟上存储设备的速度。针对 5.15 内核最近就合并了一个 block layer 的改动,正好展示了为了从当前硬件中能获得最佳性能而必须做出哪些权衡。

在 block layer 中,每个 I/O 操作都是使用一个 struct bio 来代表的。这种结构的每一个实例通常都被称为 "BIO"。BIO 中包含了一个指向相关 block 设备的指针、指明即将要传输哪些 buffer、一个指向在操作完成后所要调用的函数指针以及大量的的辅助信息。针对系统中发起的每一个 I/O 操作,都需要分配一个 BIO、管理维护好、最终释放掉。对于那些拥有速度飞快的 block device 的大型、繁忙系统来说,每秒钟可以产生数百万次的 I/O 操作(IOPS),因此有大量的 BIO 结构在源源不断地进行这个从生到死的循环。

内核中的 slab allocator 针对这种重复分配和释放相同大小的结构的场景进行了优化。看起来它应该最适合作为 block 子系统中分配的 BIO 的来源。但事实证明 slab allocator 的速度还不够快,它已经成为拖慢 block I/O 的瓶颈了。因此,block 子系统维护者 Jens Axboe 准备一组 patch 来解决这个问题。

他实现的是对 BIO 结构的一个简单缓存(cache)。它是由一组 linked list(链表)组成的。系统中每个 CPU 都有一个这样的 linked list。每当需要一个新的 BIO 时(并且需要满足其他一些条件,详见下文),都会检查当前 CPU 中的链表。只要在那里发现有空闲的 BIO,那么就可以从链表中移出来而直接使用,就不必再调用 slab allocator 了。如果链表是空的,那当然只能跟往常一样通过 slab 进行分配了。在需要释放一个 BIO 的时候,它会被加入到当前 CPU 的链表中去。如果链表变得太大了(超过了 576 个 cached BIO),那么就会把 64 个 BIO 一次性交还给 slab allocator。

这个机制很简单,这也是它为什么速度很快的原因了。block layer 就不需要调用 slab allocator 了,而是直接从相应的 per CPU 链表中获取可用的 BIO,都不需要调用任何函数了。使用了 per-CPU 链表就可以避免使用 lock 机制,这进一步提高了速度。链表的管理模式就跟堆栈一样,这也使得所分配出来的 BIO 还存在于 CPU cache 中的可能性大大提高了。最终都带来了显著的性能提升。

至少对于某些工作负载来说是看到很大性能提升的。如前所述,BIO cache 机制很简单,所以它没有确保发生中断时也是安全的。per-CPU 的数据结构只有在 kernel 执行 critical section 时不会被抢占的情况下,才可以确保不用 lock 也是安全的。而 interrupt 当然也是一种 preemption(抢占),在这种情况下就会导致问题。如果一个 block-driver 的中断处理程序 (interrupt handler) 正在分配或释放一个 BIO,而此时有其他的内核代码也在做类似的动作,那么很可能会出问题,而用户也就不会因为提升这些性能而感激作者。

当然,BIO cache 可以做成是不怕 interrupt 的,而且后面也许有一点就会实现成这样。但是禁用中断也会带来性能损失,这是一个不这么实现的很好的理由。如果不关闭 interrupt 的话,BIO cache 就只能在那些绝对不会在 interrupt handler 同时进行调用的情况下使用了。好消息是,这里有一种情况下这一点是可以得到保证的,那就是当使用 block-layer I/O polling 的时候。polling 操作会先关闭来自存储设备的 interrupt,完全只在这里循环操作直到 I/O 请求完成为止。对于那些快速设备(fast device)来说,这实际上是很合理的做法。在非常希望能尽量提高 I/O 速率的情况下,系统管理员很可能会启用 polling。因此针对这个场景再提供一些额外的性能提升,那就会是很有意义的。

把 slab allocator 的动作从这个循环操作中移除掉,就可以大大改善性能,但这里还有一个问题需要改正。block layer 有一个叫做 bio_init() 的函数,其中主要有下面这个操作:

memset(bio, 0, sizeof(*bio));

人们可能认为 memset() 是对这样一个中等大小的结构进行初始化的最快速的方法了,但事实证明并非如此。所以 Axboe 还多做了一个 patch,用一系列直接对 BIO 中每个 field 设置为 0 的操作替换了 memset() 调用。changelog 中指出,这个改动使得分配加上初始化 BIO 的总时间减少了一半(当然是在使用 BIO cache 的情况下)。

Axboe 说,在这些改动都到位之后,block layer 的性能提高了大约 10%。在他的测试系统中每个 CPU core 上都可以达到超过 350 万 IOPS 了。这里节省了大量的 block 分配释放,肯定会让管理 storage server 的经理们非常高兴了。这组 patch 展示了在当前硬件上要想优化 I/O 吞吐量可以做(而且必须做)哪些事情。但它也表明,可能是时候要在这些已经高度优化的 slab allocator 上投入更多精力来进行优化了。如果内核开始针对每个子系统中的对象都做缓存,从而绕过 allocator,那么系统的整体性能就会受到影响。同时,基本上所有人都会喜欢这种提高 block-I/O 性能的做法。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

0bce5c91fe6d91925e606659c93a11f7.png

biocache-service:发生和映射Web服务 生物缓存服务 出现和映射Web服务。 这些服务记录在这里 版本号 当前有两个受支持的版本: 1.9.x-SOLR 4和Cassandra1.2.x。 请参阅1.9.x分支。 2.x-具有SOLR Cloud支持和Cassandra 3.x的SOLR 7。 参见master分支。 开发设置 参见Wiki: : 整合测试 使用docker容器支持集成测试。 要启动所需的容器,请运行以下命令: docker-compose -f src/test/docker/solr7-cassandra3.yml up -d 要关闭,请运行以下命令: docker-compose -f src/test/docker/solr7-cassandra3.yml kill 前提条件是Docker 17+版本。 有关更多详细信息,请参见本。 立即下载

相关推荐

晶振匹配电容容值计算方法

在使用晶振时,应仔细参考晶振规格书,以确保正确选择匹配电容,从而获得稳定和精准的时钟源。

aidi1111的博客 4653

Block-layer I/O polling

Block-layer I/O polling Note:从lwn转载过来,原文地址:https://lwn.net/Articles/663879/ By Jonathan Corbet November 11, 2015 It has been said that the kernel's block I/O layer routinely steals ideas

Daniel_Shieh的嵌入式专栏 804

从图片到3D模型:用Tripo+Unity打造AI建模流水线(避坑指南)

本文详细介绍了如何利用Tripo和Unity构建AI驱动的3D建模流水线,从图片到3D模型的高效转换。通过文生模型和图生模型的双模系统,开发者可以大幅提升建模效率,适用于游戏开发和数字内容创作。文章还提供了环境配置、图片预处理、批量生成等实用技巧,帮助开发者避开常见陷阱。

weixin_27024175的博客 611

Linux IO的buffer cache和page cache合并的原因

我先大概解释一下,这里“buffer cache”中的buffer指的是以前块设备层中用来缓存磁盘内容的结构,一个buffer大小就是磁盘中一个block的大小。这里“page cache”指的是文件系统层用于缓存读写内容的cache,因为这一层在设备层之上,因此和内核其他地方一样,以page为单位来管理。 我们看到free命令打印中,有的版本cached和buffers是分开的,有的版本是“c...

落尘纷扰的专栏 3163

【BIM入门实战】Revit创建地形的几种方法及优缺点

Revit在体量和场地选项卡的【地形表面】工具可以创建三维地形,有三种方法:放置点、指定点文件和导入实例文件、倾斜摄影点云技术和InfraWorks地形生成。 文章目录1. 放置点2. 指定点文件3. 导入实例文件4. 倾斜摄影点云技术5. InfraWorks地形生成 1. 放置点 放置点功能位于体量和场地选项卡下地形表面,点开找到放置点,并通过自定义设置点的高程值来创建地形的高程数据。 优点:通过用户自定义高程点来绘制模型,使地形更为精确。 缺点:只适用于面积小的项目,面积太大,人工效率低下。 .

智慧空间实验室 4758

北京大学MuMo多模态肿瘤分类模型复现与迁移学习

本项目复现了北京大学MuMo多模态肿瘤分类模型,并针对特定医学影像数据集进行迁移学习。MuMo模型通过整合CT、MRI、PET等多模态医学影像数据,显著提升了肿瘤分类准确性。项目内容包括环境配置(Python 3.8+、PyTorch 1.9+)、数据预处理(DICOM/NIfTI格式处理、强度归一化)、多模态数据集类实现,以及训练验证测试集划分。关键特点是采用MONAI医学影像处理库,实现三维医学影像的标准化预处理流程,并支持多种模态数据的并行加载与联合训练,为后续模型复现和迁移学习奠定基础。

max500600的博客 1241

块层介绍 第一篇: bio层

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34198453的博客 597

电子技术课程设计:声音音量峰值检测显示系统设计

本文介绍了声音音量峰值检测显示系统的设计方案。系统采用分立元件设计,不使用单片机和集成运放,包含电源模块、声音采集放大电路、峰值检测保持模块、比较器、A/D转换及显示控制等部分。麦克风信号经两级晶体管放大后,通过二极管-电容电路检测峰值并保持,再经A/D转换显示为数字值(0000-9999)。系统采用9V电池供电,包含启动/清除控制功能,能指示声音过低或过高状态。详细阐述了各模块电路设计、参数计算和仿真验证,并提供了完整的原理图和PCB布线方案。该系统实现了声音峰值电压的准确检测与数字显示功能。

huanghm88的专栏 256

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 177

ARM与PC共享文件方式【samba】移植与配置

方式推荐指数适用平台优点缺点⭐⭐⭐⭐⭐全平台 (Win/Mac/Linux)兼容性最强,操作像本地文件配置稍繁琐,协议开销略大NFS⭐⭐⭐⭐Linux/Mac (Win支持一般)速度极快,CPU占用低Windows配置复杂,权限管理较难SFTP (SSH)⭐⭐⭐⭐全平台 (需客户端)安全加密,无需额外配置服务需使用FileZilla/Xftp等专用软件物理U盘⭐⭐⭐全平台无需网络,速度取决于接口需要人工插拔,不适合自动化Syncthing⭐⭐⭐⭐全平台自动同步,支持远程。

浩瀚之水的专栏 263

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)。

非科班Java出身GISer的博客 705

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 274

西安交通大学软件学院——分布式系统练习题(综合题)

摘要:本文探讨了分布式系统的核心特性与关键问题。首先阐述了分布式系统的8种透明性特性,包括访问、定位、迁移等。然后通过具体案例分析了分布式事务的回滚机制、域名解析的迭代与递归过程、不同分布式系统的异同比较。重点讨论了RPC通信中客户端/服务器崩溃的处理方法,包括消灭、再生和到期三种策略。最后介绍了Lamport时间戳算法在进程通信中的应用及问题解决方案。全文涵盖了分布式系统设计中的透明性、可靠性、一致性等核心问题。

qq_73044452的博客 204

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 557

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 19

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 643

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 164

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 81

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 177

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 317

不同的二叉搜索树

互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数。所以dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]头1 = 左子树0节点 * 右子树2节点,二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。头2 = 左子树1节点 * 右子树1节点。所以dp[i] += dp[j-1] * dp[i-j]个节点组成且节点值从。

qq_44721738的博客 150

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 394

从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战

以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。

wdf8088的博客 164

【Deep-OC-SORT 01】多轨迹算法Deep-OC-SORT源码分析

本工程基于Deep-OC-SORT核心模块,重构并适配了EmbeddingComputer(外观特征提取)、CMCComputer(相机运动补偿)与OCSort(主跟踪器)三类。前者实现整框/网格模式的特征提取与L2归一化;后者通过稀疏光流或SIFT匹配估计仿射变换,补偿相机运动;主跟踪器融合IoU、外观相似度与方向一致性,支持模块开关与自定义组件,实现高效多目标跟踪。

Jayson 博客 331

C++ 标准库算法全景指南

本文系统梳理C++标准库<algorithm>与<numeric>中100+算法,按功能分为非修改、修改、排序、二分查找、归并、堆、极值、字典序、排列及数值操作十大类,涵盖典型用法与时间复杂度。结合C++20范围(ranges)与投影特性,实现更简洁高效的代码。

sss123ddd的博客 266
上一篇: LWN:5.15 合并窗口第一部分!
下一篇: LWN:让vma的匿名页不再匿名!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值