使用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的边缘接口 六、任务验收七、…...
国外访问学者/博士后留学人员反诈骗指南
访问学者/博士后/联合培养博士人员出国后,对当地环境及政策不熟悉,需要提高防范意识,为此,知识人网小编特整理这篇反诈骗指南,提醒留学人员防微杜渐、未雨绸缪。 近日,多国使馆发布相关提醒:不法…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
