1 介绍

BFQ,全称 Budget Fair Queuing / 预算公平排队,是Linux基于CFQ的一个“比例共享”的IO调度算法。按照官方的说法,它具有“高吞吐,低延迟以及公平性”的特点。Linux 5.0内核中,CFQ已经被完全删除,取而代之的是诸如BFQ的多队列算法。

不同于CFQ中的时间片,BFQ使用预算(budget)分配的方式来实现公平:每个进程在一个窗口有预算的sector数量,花完所有sector(或超时)则进程的请求队列被挂起,等候调度。同时budget会不断调整,如果进程花完了budget,下一次的budget会增加;若没花完,则下一次的budget会减少。而budget越小,调度越频繁(时间敏感应用),budget越大,执行时间越长(高吞吐应用),bfq以这种自适应的方式来实现不同进程的需求,实现低延迟和高吞吐。

此外,BFQ考虑进程的IO优先级,来决定进程在何时能够被调度。BFQ“严格执行优先级,只要存在较高优先级的队列,就不会为低优先级队列提供服务”。可以通过ionice命令设定优先级。

具体参考:linux/bfq-iosched.rst at master ·torvalds/linux (github.com)

2 进程的IO优先级

ionice将IO调度分为三大类:

(1)RT(Real Time):实时调度,不考虑其他进程的IO,立即访问磁盘。

(2)BE(Best Effort):缺省调度策略,可以指定优先级(0~7),数值越小优先级越高。

(3)IDLE:空闲调度,当没有其他进程需要IO时,才能进行调度,无优先级可言。

PS: 此外还有一个(0)none 优先级。未设置优先级时默认为none,其实也就是BE,只是优先级数是通过cpu中的进程优先级自动计算出来的, io_priority = (cpu_nice +20)/5。一般的用户程序,cpu优先级是0(可查看top命令,“NI”项大多为0),因此默认的io优先级为4。

以上默认IO请求都是同步请求,因为同步IO才是针对进程而言的。

3 使用方式

3.1 更改IO调度策略

注:linux 5.0以上的版本。

查看当前调度策略,"sda"对应想要修改策略的盘:

~$ cat /sys/block/sda/queue/scheduler
[mq-deadline] none

此时这里显示并没有bfq,先检测一下你的系统中有没有bfq模块:

~$ sudo modprobe bfq

没有报错说明是有的,再次查看调度策略,已经有bfq了:

~$ cat /sys/block/sda/queue/scheduler
[mq-deadline] bfq none

修改为bfq,再次查看:

~$ sudo echo 'bfq'>/sys/block/sda/queue/scheduler
~$ cat /sys/block/sda/queue/scheduler
mq-deadline [bfq] none

如果要设置bfq随系统启动加载,参考。

3.2 BFQ调参

BFQ具有以下参数,参数列表 。

例:若要设置low_latency参数为0

~$ echo 0 > /sys/block/sda/queue/iosched/low_latency

3.3 设置IO优先级

除了使用ionice命令设置优先级外,还可以使用ioprio_set()系统调用设置进程(线程)的IO优先级,Linux手册链接。

可能会出现头文件linux/ioprio.h链接失败的问题,导致宏定义找不到,图方便可以直接把宏定义copy过来。示例代码:

#include <cstdio>
#include <iostream>
//#include <linux/ioprio.h>  /* Definition of IOPRIO_* constants */
#include <sys/syscall.h>     /* Definition of SYS_* constants */
#include <unistd.h>
using namespace std;
​
#define IOPRIO_CLASS_SHIFT  (13)
#define IOPRIO_PRIO_VALUE(class, data)  (((class) << IOPRIO_CLASS_SHIFT) | data)
​
enum {IOPRIO_WHO_PROCESS = 1,        // 代表下一个参数为线程号(0代表自身)IOPRIO_WHO_PGRP,               // 代表下一个参数为组号(0代表自身所在组)IOPRIO_WHO_USER,               // 代表下一个参数为用户ID(..)
};
// 以上宏定义从linux/ioprio.h中复制
​
enum {RT = 1,BE ,IDLE,
};
​
int main(){// 获取当前线程优先级int prio = syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, 0);cout << (prio>>IOPRIO_CLASS_SHIFT) << "," << (prio & 0b1111) << endl;
​// 设置当前线程IO优先级为7 (BE)syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(BE, 7));
​// 设置PID=80的线程IO优先级为IDLEsyscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, 80, IOPRIO_PRIO_VALUE(IDLE, 0));
​// 设置当前线程所在组的所有线程IO优先级为2(RT)syscall(SYS_ioprio_set, IOPRIO_WHO_PGRP, 0, IOPRIO_PRIO_VALUE(RT, 2));
​// 设置进程组号为20的所有线程IO优先级为2(BE)syscall(SYS_ioprio_set, IOPRIO_WHO_PGRP, 20, IOPRIO_PRIO_VALUE(BE, 2));
​prio = syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, 0);cout << (prio>>IOPRIO_CLASS_SHIFT) << "," <<  (prio & 0b1111) << endl;
​return 0;
}

参考:

调整 I/O 性能|系统分析和调优指南|SUSE Linux Enterprise Server 15 SP1

BFQ 设置IO优先级相关推荐

  1. iOS8 GCD多线程新特性QoS 设置队列优先级

     iOS8 GCD多线程新特性QoS 设置队列优先级 Quality of Service(QoS) 这是在iOS8之后提供的新功能,苹果提供了几个Quality of Service枚举来使用:us ...

  2. ceSetThreadPriority设置线程优先级~!

    ceSetThreadPriority 一直採用SetThreadPriority,结果今天发帖询问线程时间问题,才突然顿悟...发现SetThreadPriority只设置248-255,也就是说就 ...

  3. android线程优先级大小,android 设置线程优先级 两种方式

    1) android.os.Process.setThreadPriority (int priority)或android.os.Process.setThreadPriority (int tid ...

  4. STM32从设置IO输入上下拉到寄存器GPIOx_BSRR、GPIOx_BRR

    目录 1. 问题概述 2. 标准库中查找 3. GPIOx_BSRR和GPIOx_BRR 端口位配置表 1. 问题概述 因为一些原因使用寄存器方式进行开发,设置IO状态时发现: 表格中10表示上拉/下 ...

  5. Windows电脑中设置网络优先级的设置方法

    大家在使用电脑的过程中有可能会遇到这样一种情况,就是电脑在连接有限网络时还是使用的无线网络,如果想切换到有线连接就需手动关闭无线连接才行.这个就涉及到网络优先级连接的问题了,如何设置让电脑优先选择我们 ...

  6. html布局优先级,iOS Masonry 设置布局优先级。

    Masonry 中设置布局优先级需要使用系统方法: 设置抗拉伸性.值越低越容易被拉伸 - (void)setContentHuggingPriority:(UILayoutPriority)prior ...

  7. 思科指定根交换机与设置交换机优先级

    1.基础 设置交换机优先级:switch(config)# spanning-tree vlan 1 priority +数字 指定根交换机:switch(config)# spanning-tree ...

  8. Linu中设置网卡优先级

    前言 相信有很多同学拥有多个网卡的linux主机,但是主机同时拥有多个Ip的时候会造成冲突.主机不知道哪一个网卡优先,这样就会导致一些网络问题,例如:我有两张网卡,一个是为了内网提供服务不能上网,一个 ...

  9. Android 中设置线程优先级的正确方式(2种方法)

    Android 中设置线程优先级的正确方式(2种方法) 在 Android 中,有两种常见的设置线程优先级的方式: 第一种,使用 Thread 类实例的 setPriority 方法,来设置线程优先级 ...

  10. c语言怎么设置cpu优先级,线程优先级,设置,setPriority()方法

    package seday08.thread; /** * @author xingsir * 线程优先级 * 线程启动后纳入到线程调度,线程时刻处于被动获取CPU时间片而无法主动获取.我们可以通过调 ...

最新文章

  1. ECSHOP头部调用会员的消费积分
  2. 企业通信需要专业高效工具
  3. Xpath语法-爬虫(一)
  4. Java线程状态及 wait、sleep、join、interrupt、yield等的区别
  5. 专访友盟CEO叶谦:深挖海量终端用户数据的价值
  6. 通过动效学习UI设计
  7. python画一条曲线有不同的形状_Python+pandas+matplotlib控制不同曲线的属性 !
  8. mysql 实例与用户_MySQL(17):用户登录实例
  9. 计算机日志研究方法,基于日志的计算机取证技术研究与实现
  10. Nginx学习笔记(二) Nginx--connectionrequest
  11. linux apache gzip压缩,Linux入门教程:配置Apache开启gzip压缩传输,gzip压缩 LoadModul
  12. review一下上一年的积累
  13. .编写一个文件加解密程序,通过命令行完成加解 密工作
  14. 不同vlan之间如何ping通_如何利用交换机实现不同VLAN、不同网段之间互访?
  15. LeetCode:14. Longest Commen Prefix(Easy)
  16. 关于Oculus无法下载应用:(OVR40779122) 的解决方案
  17. 许路平:Gvoice千万在语音输入的那些事
  18. 记码农十周年(20110214--20210214)
  19. 欢迎观看Toni_hou的#生活5
  20. 如何保证战略落地_如何确保企业战略落地

热门文章

  1. The user specified as a definer (''@'%') does not exist
  2. 墙钟时间和CPU时间的区别
  3. Sgt. Pepper's Lonely Hearts Club Band
  4. Linkerd 服务网格配置优化与深入
  5. android studio读取数据库,的Android Studio取得从数据库中获取数据,以TextView的
  6. AVB源码学习(八):AVB2.0-AVB移植\公钥转换\avbtool
  7. junit单元测试所踩到的坑
  8. 西安java教程视频教程_西安java视频教程哪个好
  9. 【更新】囚生CYの备忘录(20231014~)
  10. 瞧,这就是UE4 C++