linux线程io调度策略,Linux IO调度算法

2023-05-16

IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯. (elevator)而相应的算法也就被叫做电梯算法.而Linux中IO调度的电梯算法有好几种,一个叫做as(Anticipatory),一个叫做 cfq(Complete Fairness Queueing),一个叫做deadline,还有一个叫做noop(No Operation).具体使用哪种算法我们可以在启动的时候通过内核参数elevator来指定.

调度算法

1、CFQ完全公平队列调度算法

2、Deadline最终期限调度算法

3、NOOP调度算法

4、AS预测调度算法

使用场景

1、数据库等专用服务器适用于deadline算法调度。

2、需要兼容大多数应用的场景适用cfq。

3、固态硬盘使用noop调度算法。

详细介绍

CFQ完全公平队列

CFQ是内核默认选择的IO调度队列,它在桌面应用场景以及大多数常见应用场景下都是很好的选择。如何实现一个所谓的完全公平队列(Completely Fair Queueing)?首先我们要理解所谓的公平是对谁的公平?从操作系统的角度来说,产生操作行为的主体都是进程,所以这里的公平是针对每个进程而言的,我们要试图让进程可以公平的占用IO资源。那么如何让进程公平的占用IO资源?我们需要先理解什么是IO资源。当我们衡量一个IO资源的时候,一般喜欢用的是两个单位,一个是数据读写的带宽,另一个是数据读写的IOPS。带宽就是以时间为单位的读写数据量,比如,100Mbyte/s。而IOPS是以时间为单位的读写次数。在不同的读写情境下,这两个单位的表现可能不一样,但是可以确定的是,两个单位的任何一个达到了性能上限,都会成为IO的瓶颈。从机械硬盘的结构考虑,如果读写是顺序读写,那么IO的表现是可以通过比较少的IOPS达到较大的带宽,因为可以合并很多IO,也可以通过预读等方式加速数据读取效率。当IO的表现是偏向于随机读写的时候,那么IOPS就会变得更大,IO的请求的合并可能性下降,当每次io请求数据越少的时候,带宽表现就会越低。从这里我们可以理解,针对进程的IO资源的主要表现形式有两个,进程在单位时间内提交的IO请求个数和进程占用IO的带宽。其实无论哪个,都是跟进程分配的IO处理时间长度紧密相关的。

有时业务可以在较少IOPS的情况下占用较大带宽,另外一些则可能在较大IOPS的情况下占用较少带宽,所以对进程占用IO的时间进行调度才是相对最公平的。即,我不管你是IOPS高还是带宽占用高,到了时间咱就换下一个进程处理,你爱咋样咋样。所以,cfq就是试图给所有进程分配等同的块设备使用的时间片,进程在时间片内,可以将产生的IO请求提交给块设备进行处理,时间片结束,进程的请求将排进它自己的队列,等待下次调度的时候进行处理。这就是cfq的基本原理。

当然,现实生活中不可能有真正的“公平”,常见的应用场景下,我们很肯能需要人为的对进程的IO占用进行人为指定优先级,这就像对进程的CPU占用设置优先级的概念一样。所以,除了针对时间片进行公平队列调度外,cfq还提供了优先级支持。每个进程都可以设置一个IO优先级,cfq会根据这个优先级的设置情况作为调度时的重要参考因素。优先级首先分成三大类:RT、BE、IDLE,它们分别是实时(Real Time)、最佳效果(Best Try)和闲置(Idle)三个类别,对每个类别的IO,cfq都使用不同的策略进行处理。另外,RT和BE类别中,分别又再划分了8个子优先级实现更细节的QOS需求,而IDLE只有一个子优先级。

另外,我们都知道内核默认对存储的读写都是经过缓存(buffer/cache)的,在这种情况下,cfq是无法区分当前处理的请求是来自哪一个进程的。只有在进程使用同步方式(sync read或者sync wirte)或者直接IO(Direct IO)方式进行读写的时候,cfq才能区分出IO请求来自哪个进程。所以,除了针对每个进程实现的IO队列以外,还实现了一个公共的队列用来处理异步请求。

当前内核已经实现了针对IO资源的cgroup资源隔离,所以在以上体系的基础上,cfq也实现了针对cgroup的调度支持。关于cgroup的blkio功能的描述,请看我之前的文章Cgroup – Linux的IO资源隔离。总的来说,cfq用了一系列的数据结构实现了以上所有复杂功能的支持,大家可以通过源代码看到其相关实现,文件在源代码目录下的block/cfq-iosched.c。

Deadline最终期限调度

deadline调度算法相对cfq要简单很多。其设计目标是,在保证请求按照设备扇区的顺序进行访问的同时,兼顾其它请求不被饿死,要在一个最终期限前被调度到。我们知道磁头对磁盘的寻道是可以进行顺序访问和随机访问的,因为寻道延时时间的关系,顺序访问时IO的吞吐量更大,随机访问的吞吐量小。如果我们想为一个机械硬盘进行吞吐量优化的话,那么就可以让调度器按照尽量复合顺序访问的IO请求进行排序,之后请求以这样的顺序发送给硬盘,就可以使IO的吞吐量更大。但是这样做也有另一个问题,就是如果此时出现了一个请求,它要访问的磁道离目前磁头所在磁道很远,应用的请求又大量集中在目前磁道附近。导致大量请求一直会被合并和插队处理,而那个要访问比较远磁道的请求将因为一直不能被调度而饿死。deadline就是这样一种调度器,能在保证IO最大吞吐量的情况下,尽量使远端请求在一个期限内被调度而不被饿死的调度器。

NOOP调度器

noop调度器是最简单的调度器。它本质上就是一个链表实现的fifo队列,并对请求进行简单的合并处理。调度器本身并没有提供任何可疑配置的参数。

修改调度方式

查看当前系统支持的调度方式1

2

3

4

5dmesg | grep -i scheduler

[root@lehoon bin]# dmesg | grep -i scheduler

[0.366302] io scheduler noop registered

[0.366305] io scheduler deadline registered (default)

[ 0.366318] io scheduler cfq registered

当前系统默认的就是deadline方式。

查看某块硬盘的IO调度方式:1

2[root@lehoon bin]# cat /sys/block/sda/queue/scheduler

noop deadline [cfq]

可见当前sda块的IO调度方式为cfq。

修改指定块的IO调度方式:1

2

3[root@lehoon bin]# echo deadline> /sys/block/sda/queue/scheduler

[root@lehoon bin]# cat /sys/block/sda/queue/scheduler

noop [deadline] cfq

可以看到,sda的io调度方式已经修改成了deadline了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux线程io调度策略,Linux IO调度算法 的相关文章

  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • 如何真正释放 Linux 中的大页面以供新进程使用?

    真的找不到太多关于此的信息 希望有人可以提供帮助 我正在假脱机使用 100GB java 堆作为大数据缓存 为了避免与文件系统缓存等内容发生冲突 并且因为它通常性能更好 我将其分配在大页面中 我保留了 51 200 x 2MB 大页面 一切
  • 即使 makefile 和源代码存在,为什么“Build Project”在 Eclipse Helios CDT 中显示为灰色?

    我无法构建我的项目 我在 Eclipse Helios 中创建了一个新的 CDT 项目 并告诉它使用现有的源代码和 makefile 这两者都正确显示在 Package 和 Project 视图中 然而 项目 菜单中的 构建全部 和 构建项
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手

随机推荐

  • 涉密计算机系统分级保护,什么是分级保护!!

    转载 信息系统 分级保护和等级保护 一 什么是信息安全等级保护 2003年 xff0c 中办 国办转发 国家信息化领导小组关于加强信息安全保障工作的意见 中办发 2003 27号 xff0c 提出实行信息安全等级保护 xff0c 建立国家信
  • Spring Cloud 全链路跟踪 Zipkin

    Spring Boot 专栏 xff1a https blog csdn net dkbnull category 9278145 html Spring Cloud 专栏 xff1a https blog csdn net dkbnull
  • 网络操作系统 第十四章 网络操作系统安全管理

    习题 1 网络中存在的安全问题有哪些 xff1f 1 xff09 信息窃取 2 xff09 数据篡改 3 xff09 非法攻击 2 简述Windows Server 2008系统中提供了哪些安全管理功能 xff08 1 xff09 物理安全
  • [How TO]-如何使用Sphinx编写漂亮的文档

    快速链接 x1f449 x1f449 x1f449 个人博客笔记导读目录 全部 x1f448 x1f448 x1f448 文章目录 背景环境搭建 安装Sphinx工具创建一个项目编译项目 关键词 Sphinx readthedocs reS
  • linux 烧写树莓派sd卡,树莓派3b+从0开始:(2)SD卡的配置

    从上篇文章里已经了解到 xff0c ROM里的出厂代码决定了 xff1a GPU启动之后 xff0c 只能去SD卡上的FAT32格式的文件系统里的目录下 xff0c 寻找一个叫bootcode bin的启动文件 所以 xff0c 将SD卡里
  • android zram 命令,Android 内存管理

    概述 虚拟内存 2 1 分页 2 2 内存映射 内存不足时的处理 3 1 kswapd 3 2 LMK 虚拟机 4 1 堆空间划分 4 2 回收算法 在看这篇文章之前 xff0c 需要Linux内存管理基础 xff0c 推荐Linux 内存
  • C语言--结构体指针需要malloc

    如果定义一个结构体类型的普通变量 xff0c 可以不malloc动态申请内存 xff0c CPU会为这个结构体变量分配内存 如果定义的是一个结构体的指针 xff0c CPU会为这个指针开辟内存 xff0c 但是此时这个大小是4 xff08
  • Git分支创建命令

    Git分支创建命令 万次阅读 多人点赞 span class token number 2019 span span class token operator span span class token number 06 span spa
  • 「LSTM 之父」亲笔万字长文,只为向世人证明:深度学习不是在母语为英语的地方被发明的

    导语 xff1a 最重要的并不是谁发明了某项技术 xff0c 而是技术本身对于人类文明发展所具有的无上价值 xff01 雷锋网 AI 科技评论按 xff1a 毫无疑问 xff0c 深度学习是影响当今世界科技发展的最重要的技术之一 2018
  • 多任务学习-Multitask Learning概述

    2020 02 22 09 59 48 1 单任务学习VS多任务学习 单任务学习 xff1a 一次只学习一个任务 xff08 task xff09 xff0c 大部分的机器学习任务都属于单任务学习 多任务学习 xff1a 把多个相关 xff
  • 任奎:人工智能算法安全浅析——深度学习中的对抗攻击与防御

    2020 05 19 19 52 46 任奎 随着计算机产业发展带来的计算性能与处理能力的大幅提高 xff0c 人工智能在音视频识别 自然语言处理和博弈论等领域得到了广泛应用 在此背景下 xff0c 确保人工智能的核心 深度学习算法具有可靠
  • AI构图:AI摄影的新未来

    编辑导语 xff1a AI与摄影相结合已经不是新鲜事 xff0c 新鲜的是二者结合的方式 对于很多小伙伴来说 xff0c 拍照时最大的困扰就是不知道该如何构图 xff0c 如今AI构图已经出现了 xff0c 手机会在你拍照的时候针对情况做出
  • 浅谈民用无人机的行业化应用场景

    随着技术的发展 xff0c 人类在力学 材料学 电子技术 自动控制 计算机等方面陆续取得进步 xff0c 研制出了迷你无人机 xff0c 机型更加小巧 性能更加稳定 xff0c 同时无人机更加进步 智能化的技能 xff0c 催发了民用无人机
  • Spring Boot 整合Logback记录日志

    Spring Boot 专栏 xff1a https blog csdn net dkbnull category 9278145 html Spring Cloud 专栏 xff1a https blog csdn net dkbnull
  • 对于AI 既有期待也要思考

    近日 xff0c 在第五届世界智能大会新闻发布会上 xff0c 包括发改委 科技部 工信部等在内的多部门相关负责人表示 xff0c 将更加注重我国人工智能行业顶层设计 xff0c 全力推动人工智能产业发展 关于AI xff0c 笔者有两个问
  • 神经网络中Batch和Epoch之间的区别是什么?

    神经网络中Batch和Epoch之间的区别是什么 xff1f https mp weixin qq com s FFF6RSudAas7j2vHqP5j2Q 随机梯度下降法是一种具有大量超参数的学习算法 通常会使初学者感到困惑的两个超参数
  • 大脑升维:人工智能浪潮下的适者生存之道

    https www toutiao com a6675488003453878792 的媒介 xff0c 大家的主要精力放在思想输出的训练上 xff0c 而不是知识信息的输入上 xff0c 这样的大脑修炼速度在中维知识层面上是 慢 的 xf
  • 人工智能技术映射出来的16个行业66个应用场景!

    近期 xff0c 国际数据公司 xff08 IDC xff09 与百度AI产业研究中心 xff08 BACC xff09 联合发布了 百度大脑领导力白皮书 xff0c 白皮书中追踪了16个行业的66个应用场景 xff0c 并将人工智能在企业
  • 图像识别AI遇上对抗性图像变“瞎子”,准确率猛降90%

    https www toutiao com a6715945584722706956 在视觉方面 xff0c AI和人类的差距有多大 xff1f 来自UC Berkeley等高校的研究人员创建了一个包含7500个 自然对抗实例 的数据集 x
  • linux线程io调度策略,Linux IO调度算法

    IO调度器的总体目标是希望让磁头能够总是往一个方向移动 移动到底了再往反方向走 这恰恰就是现实生活中的电梯模型 所以IO调度器也被叫做电梯 elevator 而相应的算法也就被叫做电梯算法 而Linux中IO调度的电梯算法有好几种 一个叫做