当前位置: 首页 > news >正文

四象限法进程调度

周二收到一篇推送 一次云上网络毫秒级的优化与实践,很有意义的实践和探索,建议阅读,文章不长,没有冗长的源码分析,结论很清晰。

谈谈我的看法。

多少有种感觉,Linux 越来越像个响应系统而不是服务器。

虚拟化容器,计算存储,RPC 微服务,cache 数据库,大包吞吐,小包时延,虽没有接鼠标键盘,但这些对响应时间的要求远大于鼠标键盘,Linux 早就不仅仅承载高并发,大吞吐了。但 Linux kernel 调度器并没有为此做好准备。
再说绑核。

原文中也提到,不绑核就 OK 了。往大了说,绑核是自废武功的行为。绑核用弹性换性能,但有时丢了弹性不说,反而劣化性能,如原文所举实例:

网络协议栈收包软中断以一种奇怪的方式执行,在任意上下文中它是高优的,但它同时也可以在 ksoftirqd 中以普通 task 执行,取决于不确定。

softirq 之所以在非 ksoftirqd 上下文执行时获得更高权重,完全仗着它是被 hardirq 带飞的,softirq 在 irq_exit 时狐假虎威而已,一旦进入 ksoftirqd 上下文就泯然众人。

Linux kernel 调度器自 CFS 以来没有大动作,一直基于优先级摊大饼,配合启发算法作 workaround,这非常适合服务器,但不利用快速响应,如今云主机需要比桌面环境更花式的响应度,摊大饼策略肯定有问题。

摊大饼对所有 task_struct 一视同仁,仅做优先级区分,无法区分紧急性和重要性维度,紧急性需立即响应,而重要性需赋予更多时间片,这就是四象限时间管理。

Windows 采用了类四象限法调度,为一类不同事件赋予了不同的响应优先级。比如鼠标键盘优先磁盘被响应,而绘制请求优先于声音,因此它作为桌面才优秀。详见早期的一篇文章:Linux 桌面为何卡顿。

显然,网络收包无论从紧急性还是重要性看,都要比进程权重更高。可 Linux kernel 在这方面表现很随意。

即使取消 ksoftirqd 的执行判断用硬调用 softirq 来替换也没有解决根本问题,硬调用虽解放了收包 softirq,却又损害了其它 task 的弹性,如果进程真的既紧急又重要(我是说如果),硬调用 softirq 和绑核没本质区别。如果有其它不紧急也不重要的 softirq,取消 ksoftirqd 反而有问题,此时需要区别对待网络子系统,而这又是 workaround。

并不是所有进程都不紧急不重要,也不是所有 softirq 都高优,除这两者外,系统中难免出现别的 task,有些需保障固定时间,有些需固定时间比例,有些需第一时间响应,有些则微不足道。依靠 Linux kernel 现有的 sched_class + interrupt 调度体系根本无法区分对待以上的细粒度。

比如拉屎,无论再忙,有些人拉屎时间总固定在 2 分钟,而另一些人则固定在 30 分钟,而不是忙时 2 秒,闲时 30 分钟。拉屎是一个紧急任务,相对拉屎,工作则是重要任务,但依然要把固定时间让给拉屎,无论工作再满,拉屎时间也不能无限挤压,况且,对于一部分人,拉屎不但紧急,而且重要。

Linux kernel 不知道一个进程是不是仅在一个时间段有密集 IO 行为的 CPU 型,不知道进程被唤醒是因为键盘,还是无关紧要的信号,Linux kernel 只能启发预测,但这并不可靠。

同 TCP 端到端 cc,Linux kernel 追求简单,通用,高效的调度算法,看不上对额外信息有所依赖的算法,笃信所谓纯粹技术含量,这绝对是自视清高庸人自扰,他们假装不知道,高效是尽可能精确的信息堆起来的,信息量有上限,误判后的补偿必然损失效率,换句话说就是启发必有概率误判,而误判则带来时间的浪费。

端到端原则和 Linux kernel 社区的这种态度如出一辙,背后的缘由可能是对成本看不上,对定制看不上。

简单看看 ntddk.h 的部分定制化优先级提升值:

// Priority increment definitions.  The comment for each definition gives
// the names of the system services that use the definition when satisfying
// a wait.
//
// Priority increment used when satisfying a wait on an executive event
// (NtPulseEvent and NtSetEvent)
#define EVENT_INCREMENT                 1
//
// Priority increment when no I/O has been done.  This is used by device
// and file system drivers when completing an IRP (IoCompleteRequest).
#define IO_NO_INCREMENT                 0
//
// Priority increment for completing CD-ROM I/O.  This is used by CD-ROM device
// and file system drivers when completing an IRP (IoCompleteRequest)
#define IO_CD_ROM_INCREMENT             1
//
// Priority increment for completing disk I/O.  This is used by disk device
// and file system drivers when completing an IRP (IoCompleteRequest)
#define IO_DISK_INCREMENT               1
//
// Priority increment for completing keyboard I/O.  This is used by keyboard
// device drivers when completing an IRP (IoCompleteRequest)
#define IO_KEYBOARD_INCREMENT           6
//
// Priority increment for completing mailslot I/O.  This is used by the mail-
// slot file system driver when completing an IRP (IoCompleteRequest).
#define IO_MAILSLOT_INCREMENT           2
//
// Priority increment for completing mouse I/O.  This is used by mouse device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_MOUSE_INCREMENT              6
//
// Priority increment for completing named pipe I/O.  This is used by the
// named pipe file system driver when completing an IRP (IoCompleteRequest).
#define IO_NAMED_PIPE_INCREMENT         2
//
// Priority increment for completing network I/O.  This is used by network
// device and network file system drivers when completing an IRP
// (IoCompleteRequest).
// 网卡IO之所以优先级提升并不是很多,是因为首先网卡是有队列缓存的,而大多数的报文都是burst而来的,
// 队列缓存可以平滑掉首包延迟,其次,由于光速极限,相比于网络延迟,主机调度延迟真的可以忽略不计。
#define IO_NETWORK_INCREMENT            2
//
// Priority increment for completing parallel I/O.  This is used by parallel
// device drivers when completing an IRP (IoCompleteRequest)
#define IO_PARALLEL_INCREMENT           1
//
// Priority increment for completing serial I/O.  This is used by serial device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_SERIAL_INCREMENT             2
//
// Priority increment for completing sound I/O.  This is used by sound device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_SOUND_INCREMENT              8
//
// Priority increment for completing video I/O.  This is used by video device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_VIDEO_INCREMENT              1
//
// Priority increment used when satisfying a wait on an executive semaphore
// (NtReleaseSemaphore)
#define SEMAPHORE_INCREMENT             1

这绝不是 Linux kernel 风格,Linux kernel 总希望在统一的优先级调度框架下解决问题,看不上引入额外信息增强定制。类似的,在处理 TCP cc 时,当我建议利用底层链路信息及 application 信息做决策,也经常被鄙视。不是得不到这些信息,如果得到了,大家会用吗?可能不会,这就是看不上。纯程序员笃信闭环,对外部信息的以来颇为不屑。

我觉得理想的调度器应该类似四象限时间管理法。在传统的重要性优先级外扩展一个紧急优先级就是了:
在这里插入图片描述

转换到二维坐标系,y 轴表示重要性,x 轴表示时间片,每个三角形表示一个任务的执行,下图是图示及一个例子:
在这里插入图片描述

所有 task 展示为各种形状的三角形,这些三角形以图示实例方式不断抢占执行,更矮的三角形被更高的三角形切割,最终什么也不耽误,既能体现紧急程度,又能体现重要性。即使绑核,紧急且重要的 task 仍可获得足够的 CPU 时间,整体看,三角形越宽,获得 CPU 总时间越多,三角形越高,越优先执行。

大概就是 Windows 的样子,优先级在不同事件后根据其紧急性获得不同提升,然后再根据其重要性以负相关的不同速度下降。

注意到 Linux kernel 曾为实时性引入中断线程化,但在现有调度机制下,很难为中断线程适配一个合适的执行权重,但采用上述四象限方法就很容易解决这问题。

Windows,Linux 哪个更好,我没有答案,但有一点很明确,Linux kernel 并非什么都对,但如今它拥有庞大但逐渐封闭的圈子,以至于 Linux kernel 涉及的一切 “越来越合理”,以至于争论不得。本文只谈观点,无意涉足名利场,有时间还是更多聊聊 TCP/IP。

浙江温州皮鞋湿,下雨进水不会胖。

相关文章:

四象限法进程调度

周二收到一篇推送 一次云上网络毫秒级的优化与实践,很有意义的实践和探索,建议阅读,文章不长,没有冗长的源码分析,结论很清晰。 谈谈我的看法。 多少有种感觉,Linux 越来越像个响应系统而不是服务器。 虚…...

蓝桥杯拿到一等奖,并分享经验

昨天和群里的小伙伴在群里聊,有的小伙伴竟然说蓝桥杯一等奖没有含量,我也是醉了! 就像去年看了一个号主写的:研究生遍地都是! 放眼全国14亿人口,别说研究生了,本科生占比有多少? “蓝桥杯是我人生中得到…...

vue3。 Cannot use JSX unless the ‘–jsx’ flag is provided. ts(17004)

react用tsx或者jsx很常见,也有配套的配置 那如果是vue呢? 默认是没问题的,可是我用了jsdoc,并开启了checkjs,然后vscode就爆红了 谷歌,百度,一个晚上 查到的答案: 推荐我新增tsco…...

HVV面试题目总结

蓝队 如何识别安全设备中的无效告警? 常见的端口有哪些? 这些端口对应的服务是什么? 针对这些服务,红队攻击方式有哪些? 常用的威胁情报平台有哪些? 有没有做过关于情报输出的工作? 木马驻留系统的方式有哪些? 当收到钓鱼邮件的时候,说说处置思路…...

Access denied for user ‘root‘@‘localhost‘ (using password:YES) 解决方案

文章目录 问题描述解决方案: 问题描述 Access denied for user ‘root’‘localhost’:拒绝用户’root’localhost’的访问。 出现这个报错语句的一般原因是输入了错误的密码,也有可能是是root帐户默认不开放远程访问权限。 相关的解决方法是重新设置…...

为什么C++这么复杂还不被淘汰?

C是一门广泛使用的编程语言,主要用于系统和应用程序的开发。尽管C具有一些复杂的语法和概念,但它仍然是编程界的重量级选手,在编程语言排行榜中一直位居前列。为什么C这么复杂还不被淘汰呢? C有以下优势 1、C具有高性能 C是一门编…...

内存泄漏的原因,内存泄漏如何避免?内存泄漏如何定位?

1. 内存溢出 内存溢出 OOM (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。 2. 内存泄…...

关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案

在入手全志T113之后,第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常,经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK,但是居然前前后后一共花了至少三个星期…...

SpringMVC第四阶段:Controller中如何接收请求参数

Controller中如何接收请求参数 1、原生API参数类型 1.1、HttpServletRequest类 只需要在Controller的目标方法中, 直接写上HttpServletRequest对象即可获取 原生API的 request对象实例。 RequestMapping(value "/p1") public String param1(HttpServletRequest …...

第三十回: LisvtView响应事件

我们在上一章回中介绍了如何给ListView添加分隔线,本章回中将介绍ListView响应事件相关的知识.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的ListView响应事件主要分两种类型: 一种是滑动ListView时ListView做出响应,我们…...

重磅!用友荣登全球5强

近日,全球权威信息技术研究和顾问公司Gartner发布《Market Share: All Software Markets, Worldwide,2022》报告,用友在EAM(资产管理)市场再创新高,市场占有率位居全球第五位,亚太第一位&#x…...

计算机组成原理实验报告二-认识汇编语言

实验资料: https://wwpv.lanzoue.com/b05drqjef 密码:d19t 使用txt文档编写下面C源码,文档命名为【学号_hello.c】并使用Mingw工具(是 Minimalist GNU for Windows的缩写)的bin文件夹下gcc.exe带选项编译(&#xff09…...

都说计算机今年炸了,究竟炸到什么程度呢?

近期,最大的计算机领域新闻莫过于Intel CPU严重漏洞曝光。该漏洞被称为“Meltdown”和“Spectre”,几乎涵盖了所有使用Intel芯片的计算机,包括PC、笔记本电脑、服务器和移动设备。 Meltdown漏洞的主要风险是黑客可以利用此漏洞访问操作系统的…...

0Ω的电阻作用

0欧姆电阻即电阻标值为0欧姆的电阻,多用于PCB设计等方面,是一种理想电阻。那0欧姆电阻是表示没有电阻吗?当然不是,0欧姆电阻的阻值不是0欧姆,只是接近0欧姆。 1、调试方便或者兼容设计:可以选择器件、功能…...

02 PostGIS常用空间分析函数

常用的PostGIS空间分析函数清单: 序号函数名描述示例1ST_AsText(geometry)将几何对象转换为文本形式的WKT字符串ST_AsText(ST_GeomFromText(‘POINT(1 2)’)) 返回 ‘POINT(1 2)’2ST_GeometryType(geometry)返回几何对象的类型,如POINT、LINESTRING、P…...

[Golang] 管理日志信息就用Zap包

😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:算法学习 &am…...

【pytest】执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略…...

2023国赛tomcat题

环境: 10.10.120.128 安装 tomcaA 10.10.120.129 安装tomcatB 10.10.120.130 安装 nginx 配置dns: 正向解析 反向解析 Tomcat ssl配置 [root@localhost ~]# tar -zxvf jdk-11.0.8_linux-x64_bin.tar.gz [root@localhost ~]# mv jdk-11.0.8 /usr/local/ Vim /etc/profile …...

计算机视觉——day 92 基于跨领域协作学习的单图像去雨

基于跨领域协作学习的单图像去雨 1. Introduction3. Proposed method3.1 网络架构 4. Experiments and results4.1 数据集和指标4.3 合成图像的结果4.8 建模复杂度和运行时间 5. Conclusion 1. Introduction 深度卷积神经网络(DCNN)在图像解析任务中取得了优异的性能。然而&am…...

Java 正则表达式

Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 示例 boolean b String.matches(String regex) ;regex 有2种形式: 字符串 直接就是一…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...