使用io_uring
目录
升级内核以支持io_uring
Io_uring 关注点
有序性
IOPOLL
SQPOLL
环大小
wrk线程数量
升级内核以支持io_uring
#!/bin/bash#内核源码压缩包
kernel_targz="linux-5.14.21.tar.xz"#内核源码解压后的目录
kernel_source="linux-5.14.21"echo "解压${kernel_targz}中..."
xz -d -k ${kernel_targz}cd ${kernel_source}dnf -y install bison bc elfutils-devel make gcc-c++ flex openssl-devel dwarves rpmdevtools rsynccp -v /boot/config-$(uname -r) .configecho "CONFIG_IO_URING=y" >> .config
echo "CONFIG_TCM_QLA2XXX=y" >> .config
sed -ri 's,(CONFIG_SYSTEM_TRUSTED_KEYS=).*,\1"",' .config#make
make binrpm-pkg -j 10
Io_uring 关注点
通常sqe是独立使用的,这意味着一个sqe的执行不会影响环中后续sqe项的执行或排序, 使它们能够并行执行和完成,以获得最大的效率和性能
有序性
io_uring支持排出提交端队列,直到之前的所有完成都完成为止。这允许应用程序将上述同步操作排入队列,并知道在之前的所有命令都完成之前,它不会启动。这是通过在sqe标志字段中设置IOSQUE_IO_DRAIN来实现的
虽然IOSQUE_IO_DRAIN包括一个完整的管道屏障,但IO_uring还支持更细粒度的sqe序列控制, 其中每个sqe的执行取决于前一个sqe的成功完成, 要使用此功能,如果前一个sqe没有完全完成,则链将断开,链接的sqe将被取消应用程序必须在sqe标志字段中设置IOSQUE_IO_LINK, 如果设置,则在上一个sqe成功完成之前,不会启动下一个sqe。
IOPOLL
Polling
•主要节省来自于避免执行上下文切换
–成本可能有所不同,但通常为0.5~2us或更多。。。
•与IRQ相比,延迟的相对改善取决于设备的典型命令执行时间
–对于命令服务时间为毫秒或更长的磁盘驱动器,轮询毫无意义
•显然,对于速度极快的闪存SSD和新兴的NVM设备,轮询变得非常有趣
–设备访问延迟接近或低于上下文切换成本这取决于您的系统和存储设备
要使用IO轮询,必须在传递给io_uring_setup(2)系统调用或传递给io_uring_queue_init(3)库帮助程序的标志中设置IORING_SETUP_IOPOLL。当使用轮询时,应用程序不能再检查CQ环尾是否有完成,因为不会有自动触发的异步硬件端完成事件。相反,应用程序必须通过调用io_uring_enter(2)来主动查找和获取这些事件,其中IORING_ENTER_GETEVENTS集和min_complete集为所需的事件数。IORING_ENTER_GETEVENTS设置和min_complete设置为0是合法的。对于轮询IO,这要求内核简单地检查驱动程序端的完成事件,而不是不断地循环这样做。
SQPOLL
要使用内核轮询功能,必须向io_uring_params标志成员特定的IORING_SETUP_SQPOLL注册io_uring实例,或者将其传递给io_uring_queue_init(3)。此外,如果应用程序希望将此线程限制为特定的CPU,也可以通过标记IORING_SETUP_SQ_AFF(默认情况下,io_uring创建的异步工作进程将继承其父进程的CPU掩码。这通常是系统中的所有CPU,除非父CPU使用有限的集合运行。如果这不是期望的结果,那么应用程序可能会明确地告诉io_uring异步工作程序可以在哪些CPU上运行)并将io_uring_params SQ_thread_CPU设置为所需的CPU来实现。请注意,使用IORING_SETUP_SQPOLL设置io_uring实例是一项特权操作。如果用户没有足够的权限,io_uring_queue_init(3)将以-EPERM失败。
为了避免在io_uring实例处于非活动状态时浪费太多CPU,内核端线程将在空闲一段时间后自动进入睡眠状态。当这种情况发生时,线程将在SQ环标志成员中设置IORING_SQ_NEED_WAKEUP。设置好后,应用程序不能依赖内核自动查找新条目,然后必须使用IORING_ENTER_SQ_WAKEUP集调用io_uring_enter(2)。应用程序端逻辑通常如下所示:
/*
* need to call io_uring_enter() to make the kernel notice the new IO
* if polled and the thread is now sleeping.
*/
if ((*sqring→flags) & IORING_SQ_NEED_WAKEUP)
{io_uring_enter(ring_fd, to_submit, to_wait, IORING_ENTER_SQ_WAKEUP);
}
只要应用程序继续驱动IO,IORING_SQ_NEED_WAKEUP就永远不会被设置,我们可以在不执行单个系统调用的情况下有效地执行IO。然而,重要的是在应用程序中始终保持与上述类似的逻辑,以防线程进入睡眠状态。空闲前的特定宽限期可以通过设置io_uring_params sq_thread_idle成员来配置。该值以毫秒为单位。如果未设置此成员,内核将默认为线程进入睡眠状态之前的一秒钟空闲时间。
环大小
默认情况下,io_uring将创建的无边界工作者限制为 RLIMIT_NPROC(6)设置的最大处理器计数,并且有边界工作者是SQ环大小和系统中CPU数量的函数。有时,这可能会过多(或过少,对于有界),而此命令提供了一种更改每个环(每个NUMA节点)计数的方法。
arg必须设置为指向两个值的数组的无符号int指针,其中数组中的值设置为每个NUMA节点的最大工作者数。索引0包含有界工作者计数,索引1包含无界工作者计数。成功返回时,传入的数组将包含每个类型以前的最大valyes。如果传入的计数为0,则该命令返回当前最大值,并且不修改当前设置。nr_args必须设置为2,因为该命令有两个值。
wrk线程数量
存在多个工作线程的情况下,将创建多少个工作线程?
这取决于程序是单线程还是多线程。
io_urings在单线程情况下,如果主线程创建两个io_urings,并将每个io_uring配置为最多有两个未绑定的工作线程,则总共将生成两个工作线程
而在多线程程序的情况下,两个线程每创建一个io_uring,每个环最多有两个未绑定的工作线程总共将生成四个工作线程 - 每个程序线程两个。这反映在辅助角色名称 () 中的所有者线程 ID 中
每个线程都有自己的专用 I/O 工作线程池,为该线程操作的所有实例提供服务
设置会失败
相关文章:
使用io_uring
目录 升级内核以支持io_uring Io_uring 关注点 有序性 IOPOLL SQPOLL 环大小 wrk线程数量 升级内核以支持io_uring #!/bin/bash#内核源码压缩包 kernel_targz"linux-5.14.21.tar.xz"#内核源码解压后的目录 kernel_source"linux-5.14.21"echo "…...
LeetCode算法题解(回溯)|LeetCode93. 复原 IP 地址、LeetCode78. 子集、LeetCode90. 子集 II
一、LeetCode93. 复原 IP 地址 题目链接:93. 复原 IP 地址 题目描述: 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.…...
vue、react数据绑定的区别?
Vue 和 React 是两个流行的前端框架,它们在数据绑定方面有一些区别。 Vue 的数据绑定: Vue 使用双向数据绑定(two-way data binding)的概念。这意味着当数据发生变化时,视图会自动更新;同时,当…...
前端Vue 页面滑动监听 拿到滑动的坐标值
前言 前端Vue 页面滑动监听 拿到滑动的坐标值 实现 Vue2写法 mounted() {// 监听页面滚动事件window.addEventListener("scroll", this.scrolling);}, methods: { scrolling() {// 滚动条距文档顶部的距离let scrollTop window.pageYOffset ||document.documentE…...
CSS实现鼠标移至图片上显示遮罩层及文字效果
效果图: 1、将遮罩层html代码与图片放在一个div 我是放在 .proBK里。 <div class"proBK"><img src"../../assets/image/taskPro.png" class"proImg"><div class"imgText"><h5>用户在线发布任务&l…...
【OpenCV实现图像:图像处理技巧之空间滤波】
文章目录 概要导入库空间过滤器模板展示效果分析与总结 概要 空间滤波器是数字图像处理中的基本工具之一。它通过在图像的每个像素位置上应用一个特定的滤波模板,根据该位置周围的相邻像素值进行加权操作,从而修改该像素的值。这种加权操作能够突出或模…...
载波通讯电表的使用年限是多久?
随着科技的飞速发展,智能家居、物联网等概念逐渐深入人心,载波通讯电表作为一种新型的智能电表,凭借其低功耗、高可靠性、远程通讯等优点,广泛应用于居民用电、工业生产等领域。那么,载波通讯电表的使用年限是多久呢&a…...
微信小程序多端应用 Donut 多端编译
目前支持 wxml、wxs、js/ts、json,less/sass 等文件类型,资源支持通过配置区分不同平台 wxml中使用 <!-- #if MP --><view class"test-view">wechat</view><!-- #elif IOS --><view class"test-view"…...
调试 Mahony 滤波算法的思考 10
调试 Mahony 滤波算法的思考 1. 说在前面的2.Mahony滤波算法的核心思想3. 易懂的理解 Mahony 滤波算法的过程4. 其他的一些思考5. 民间 9轴评估板 1. 说在前面的 之前调试基于QMI8658 6轴姿态解算的时候,我对Mahony滤波的认识还比较浅薄。初次的学习和代码的移植让…...
Bean——IOC(Github上有代码)
源码 https://github.com/cmdch2017/Bean_IOC.git 获取Bean对象 BeanFactory Bean的作用域 第三方Bean需要用Bean注解 比如消息队列项目中,需要用到Json的消息转换器,这是第三方的Bean对象,所以不能用Component,而要用Bean …...
功能更新|Leangoo领歌免费敏捷工具支持SAFe大规模敏捷框架
Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo可以支持敏捷研发管理全流程,包括小型团队敏捷开发,规模化敏捷SAFe…...
漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案
漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案漏刻有时百度地图API实战开发(2)文本标签显示和隐藏的切换开关漏刻有时百度地图API实战开发(3)自动获取地图多边形中心点坐标漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的解…...
交流信号继电器 DX-31BJ/AC220V JOSEF约瑟 电压启动 面板嵌入式安装
DX系列信号继电器由矩形脉冲激磁,磁钢保持。本继电器为双绕组。工作线圈可为电压型,亦可为电流型。复归线圈为电压型。继电器的工作电流或工作电压为长脉冲,亦可为脉冲不小于20mS的短脉冲。 系列型号 DX-31B信号继电器DX-31BJ信号继电器 D…...
SpringCloudAlibaba系列之Nacos配置管理
目录 说明 认识配置中心 Nacos架构图 Nacos配置管理实现原理 核心源码分析-客户端 核心源码分析-服务端 配置修改的实时通知 主流配置中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos配置中心的一些实现,很多细节没有涉及&#…...
Kyligence Copilot 亮相第六届进博会,增添数智新活力
11月5日,第六届中国国际进口博览会(以下简称“进博会”)在上海国家会展中心盛大启幕,众多新科技、新成果、新展品亮相本届进博会。作为阿斯利康(AstraZeneca)合作伙伴,跬智信息(Kyli…...
MySQL 批量修改表的列名为小写
1、获取脚本 SELECT concat( alter table , TABLE_NAME, change column , COLUMN_NAME, , lower( COLUMN_NAME ), , COLUMN_TYPE, comment \, COLUMN_COMMENT, \; ) AS 脚本 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA 数据库名 and TABLE_NAME表名-- 大写是up…...
ElasticSearch 查询方法示例 java
public List<PricePolicyConditionDTO> queryEs(OrderPriceOutDTO param, List<String> materialCodeList, List<String> categoryCodeList) {BoolQueryBuilder mainQueryBoolBuilder new BoolQueryBuilder();//销售组织if (CharSequenceUtil.isNotEmpty(pa…...
5G毫米波通信中的关键技术
随着5G技术的快速发展,毫米波通信作为其中的一项重要技术,在高速数据传输、低延迟通信和大规模连接等方面具有显著的优势。本文将探讨5G毫米波通信中的关键技术,包括毫米波频段的选择、信号处理技术和MIMO技术等。 一、毫米波频段的选择 毫米…...
2.3.3 交换机的RSTP技术
实验2.3.3 交换机的RSTP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置。2.开启交换机的STP。3.配置SW3A和SW3B上STP的优先级。将SW3A配置为根交换机,SW3B配置为备用根交换机。4.配置SW2A和SW2B的边缘接口 六、任务验收七、…...
国外访问学者/博士后留学人员反诈骗指南
访问学者/博士后/联合培养博士人员出国后,对当地环境及政策不熟悉,需要提高防范意识,为此,知识人网小编特整理这篇反诈骗指南,提醒留学人员防微杜渐、未雨绸缪。 近日,多国使馆发布相关提醒:不法…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
