Linux下做性能分析5:Amdahl模型

news2024/11/19 19:26:00

[前言]

前一个Blog我们使用了一个叫cs的程序作为例子,那个程序是我为了举例子临时写的,这个代码我共享在这里:GitHub - nekin2012/btest。后面我要再举例子的话,就都加到这个地方来。由于这些代码没有经过最基本的软件质量保证工艺,所以质量相当低,读者不要直接使用这些代码。另外,这个代码中的cs程序已经经过上次推演的调整,现在的性能已经可以达到调度最优了,CPU占用率会全部100%,和上一个程序中的样子已经不太一样了。

cs这个程序的模型,是我们很多软件的基础模型。虽然经过很多模块和队列的分解,我们的程序会变得愈加难以辨认,但模型永远都是为不同的队列安排多组线程池的问题。这种模型的大部分优化工作是平衡线程的数量来保证CPU的利用率,然后通过限制每个队列的长度,来控制时延和和通量之间的关系。

而这里面需要特别小心的就是那个Provider-Consumer陷阱,也就是前面提到的,如果一个线程总用不完它的时间片,这个线程就会被自动提权为交互线程,这样,只要发生调度它就会抢占,这样会大幅降低整个系统的性能。解决这个问题的方法通常是两个:一个就是在那个cs中看到的,控制队列的长度,没有足够的长度根本不要发起调度。第二个就是我们要有意识控制线程的设置,特别是不要一个模块一个线程(这是最失败的设计),如果某个线程的执行时间特别短,这个工作就应该和其他线程合并,而不是独立线程。比如你发一个消息,仅仅是为了分配一个会话号,这个时间可能就是几十个时钟周期,你就不能图方便为了排队,使用一个模块队列+线程来完成这样的工作。正确的做法是把这个模块的接口直接做成函数,然后用锁保护起来。

[Amdahl模型]

前面说的这种不使用短时线程会话的策略,在大部分时候是不会引起问题的,除非你线程配置不平衡,让你的调度序列又出现交互线程。这些问题,都可以通过ftrace跟踪出来。

但不少程序员没有从这个角度考虑这个问题,他们就会试图通过spinlock来降低这种调度的可能性。当所有线程共同分享这个公共的模块的时候,我们就会形成Amdahl定律所描述的模型了。

Amdahl定律是并行计算最基础的理论了,所有学计算机的人都学过,我这里就不专门介绍了,读者如果不知道自己上网查去。

现在大家都不怎么把Amdahl当回事,因为现在大部分系统的核数远远没有达到让Amdahl触顶的规模,下面这个是我用999:1的比例配置并行-串行比时(程序参考btest的amdahl的例子),在72核的x86平台上得到的效果:

这时增加核数基本上就会达到提升处理能力的目的。

但时延上仍是有影响的:

在串行的密度非常低的时候,我们还感觉一切受控,但如果我们把并行串行比提升到99:1,乃至90:10的时候,情况就变得非常糟糕了:

因为这不再是一个Amdahl模型了,Amdahl模型的依赖是在等待的时候,你的CPU还能干其他并行的工作,而使用spinlock,你在等待的时候什么都干不了。这实际上是一个马可夫链的排队模型,

这里有四条曲线,我们先看spin的两条曲线,你会发现,当你把串行的配比增加的时候,系统在20个核左右就开始进入拐点,性能大幅跳水。而且串行的比例越大,跳水就越早。

根据一些研究报告,如果这是个标准的马可夫链的排队模型,曲线影响应该像后面两条标记为MCS曲线那样,仅仅是接近瓶颈。而这个跳水是因为,纯粹的spinlock不但引起等待时间的增加,而且因为有更多的等待者,会导致Cache更新时间的延长,从而得到一个修正的马可夫链模型,形成了跳水。如果用perf对这两种情况进行跟踪,你会发现,在系统发生跳水后,系统在的指令执行效率10个cycle执行不了一条指令:

很低的指令执行率,表明执行指令本身的执行效率低(基本在stalled-cycles上,这个指标的含义,我们后面专门写一篇blog介绍),问题要不出现在cache/总线上,要不出现在处理器自身的调度器上。

我在一台64核的ARM64服务器上做同样的实验,得到同样的结果。有论文提出使用MCS锁来避免这种情况,我在那个btest工程中快速用spinlock临时封装了一个MCS锁,可以拟合出类似马可夫链的模型(当然,这个实现没有使用原子指令,速度肯定是比较慢的,只是为了拟合模型)。

使用MCS锁后,上面的测试结果是这样的:

同样的行为在ARM64上测试结果也是一致的,理论上说,如果用ticket锁,在ARM上可以获得MCS锁一样的结果,我晚点加一个测试看看。

[Amdahl模型的启示]

我们很多人更愿意花时间去反复尝试各种设置参数,尝试这样提高系统的性能。我个人收到不少性能分析报告都是这样的。我觉得这样的分析报告相对来说价值是比较低的(当然也有其作用),因为即使一个参数进行调整带来了好处,但这种好处和其他参数组合后可能就会消失。仅仅关注一个参数的效果,最多就是给我们建立模型提供参考,我们的分析还是要聚焦到模型上,发现系统真正的瓶颈是什么。我前面的perf介绍下面,有人说perf的数据也就只是能“看看”,我认为抱有这种观点,是因为他从来只是关注效果,而不关注模型,而在系统性能优化的时候,模型远远比效果重要。效果你确实可以拿去报功,但在软件自身的架构进展上是没有用的,要得到正确的构架调整方向,模型才是第一位的。

回到Amdahl这个模型,很多系统在进行架构调整的时候,决策下得非常早,一看见mutex发生了切换,就考虑用一个“不会切换”的spin_lock取代“有可能切换”的mutex锁,而不愿意花时间去分析“为什么调度器”要做这个切换。这样头痛医头,脚痛医脚的方法(对,我说的就是MySQL),会让整个系统陷入更深层次的混乱之中,这样整个架构就变得不可控了。

[小结]

在调度上,除了IO导致的等待外,消费者-使用者模型和Amdahl模型是两个最常见的陷阱,好好基于btest类似的简化模型对CPU和调度器的行为进行分析,会有助于我们正确理解更复杂系统的运行模型。

调度模型平衡了,我们就有可能进行下一步,针对CPU执行效率的分析了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/755985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Visual Studio 自定义的颜色字体不生效

问题描述: 1、dll1中引用第三方库的类不识别,颜色黑白,自定义颜色不生效;定义的是结构体 2、在dll2引用另一个dll1中的结构体。结构体不识别,今天成员函数cpp中自定义颜色不生效。 问题解决方式: 全部清…

基于linux下的高并发服务器开发(第一章)- GDB调试(4)1.16

05 / GDB命令-调试命令 在第8行打上断点和bubbleSort打上断点 在第16行也打上断点,然后i b查看断点 执行run,停在第一个断点,这一行还没有执行 接下来按c继续执行,停在了bubbleSort list bubble.cpp:bubbleSort

【C】动态内存管理详解

动态内存管理 C/C内存开辟区域为什么存在动态内存分配? 动态内存函数的介绍(在头文件stdlib.h中)mallocfreecallocrealloc 常见的动态内存的错误对NULL解引用操作对动态开辟的空间进行越界访问对非动态开辟的空间进行free释放使用free释放动态…

探索Python异常:让程序不再崩溃!

文章目录 前言什么是异常捕获异常基本语法捕获指定类型异常捕获多个指定类型的异常捕获异常描述信息捕获所有异常elsefinally 异常的嵌套自定义异常结语 前言 在编程的世界中,我们常常会面对各种各样的错误和异常情况。尤其当我们使用Python这样的高级编程语言时&a…

4. 设计测试用例 (一) 等价类 边界值 判定表

目录 1. 设计测试用例的基本要素 1.1 测试用例概念 1.2 测试用例要素 1.3 测试用例的重要性 2. 测试用例设计方法 2.1 基于需求设计测试用例 步骤 2.2 练习设计测试用例 2.3 具体设计测试用例方法 2.3.1 等价类 设计测试用例步骤 举例 2.3.2 边界值 设计测试用例…

PowerDesigner 数据库建模使用详解

目录 一、前言 二、PowerDesigner概述 2.1 PowerDesigner核心能力 2.1.1 集成多种建模能力 2.1.2 自动生产代码能力 2.1.3 强大的逆向工程能力 2.1.4 可扩展的企业库解决方案 2.2 PowerDesigner常用的几种模型 2.2.1 概念模型 2.2.2 逻辑数据模型 2.2.3 物理模型 2.2…

综合能源系统(2)——综合能源系统典型应用场景

综合能源系统关键技术与典型案例  何泽家,李德智主编 根据空间分布范围特征,综合能源系统可大致划分为楼宇级、园区级以及区域级。楼宇级综合能源系统适用于办公楼、家庭、商场等单一主体区域,投资、建设和运营模式较为简单,技术…

arm学习stm32芯片学习方波启动蜂鸣器,马达,风扇,裸机开发,soc

main.c #include "pwm.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); } int main() {//蜂鸣器初始化hal_pwm_beep_init1();//马达hal_pwm_motor_init1();//风扇hal_pwm_blower_…

基于Vue3+LeaderLine实现画线测距及线条自由调整

先看下效果&#xff1a;我们画线后可以根据比例关系自动计算距离&#xff0c;并且线条不对可以自由调整 <template><div id"image-detail"><el-image :src"myImageUrl" style"height: auto; width: 800px;" fit"scale-dow…

Django实现接口自动化平台(十)自定义action names【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;九&#xff09;环境envs序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 深入理解DRF中的Mixin类_做测试的喵酱的博客-CSDN博客 python中Mixin类的使用_做测试的喵酱的博客-CSDN博客 本章是项目的一…

高数笔记5(第一章函数 极限 连续-第三节-函数的连续性)

目录 第三节 函数的连续性&#xff08;1&#xff09;函数的连续性例1&#xff08;补充定义&#xff0c;函数连续&#xff09;例4&#xff08;无穷小*有界量&#xff09;例6 &#xff08;补充定义&#xff0c;三角函数的代换的妙用&#xff09; &#xff08;2&#xff09;连续函…

7.带你入门matlab偏斜度和峰度(matlab程序)

峰度&#xff08;Kurtosis&#xff09;与偏态&#xff08;Skewness&#xff09;就是量测数据正态分布特性的两个指标。 峰度&#xff08;Kurtosis&#xff09; 峰度衡量数据分布的平坦度&#xff08;flatness&#xff09;&#xff0c;即数据取值分布形态陡缓程度的统计量。它…

C#,数值计算——柯西分布(Cauchy distribution)的计算方法与源程序

柯西分布&#xff08;Cauchy distribution&#xff09;简介 The Cauchy distribution, also called the Lorentzian distribution or Lorentz distribution, is a continuous distribution describing resonance behavior. It also describes the distribution of horizontal …

ASEMI快恢复二极管MUR2080CTR资料,MUR2080CTR参数

编辑-Z MUR2080CTR是一种高压、超快恢复整流二极管。它通常用于各种电子应用&#xff0c;如电源、逆变器和电机控制电路。该二极管设计用于处理高压和高频开关&#xff0c;适用于需要快速高效整流的应用。 MUR2080CTR二极管的一个关键特性是其超快的恢复时间。这意味着它可以非…

从零开始 Spring Cloud 2:Eureka 注册中心

从零开始 Spring Cloud 2&#xff1a;Eureka 注册中心 图源&#xff1a;laiketui.com Eureka 常被用作 Spring Cloud 的注册中心&#xff0c;用于注册微服务的接口提供方。 在上一篇文章中&#xff0c;我们实现了两个子模块互相调用接口&#xff0c;但存在一个缺陷&#xff0…

旅游管理系统的设计与实现(论文+源码)_kaic

摘 要 旅游业走过了改革开放&#xff0c;到现在依旧蓬勃发展。但是放眼国际社会&#xff0c;我们在旅游业发展的深度和广度上所做的努力还远远不够。在中国&#xff0c;旅游业也将成为经济崛起中的重要一环。目前&#xff0c;我们生活在一个信息时代里。无论是工作&#xff0c;…

哈希表的原理

哈希概念 线性表、树结构的查找方式都是以关键字的比较为基础&#xff0c;查找效率比较低&#xff0c;顺序表的时间复杂度是O&#xff08;n&#xff09;&#xff0c;平衡树中为树的高度&#xff0c;即O&#xff08;logn&#xff09;&#xff0c;搜素的效率取决于搜索过程的元素…

归并排序的递归和非递归

基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&a…

OpenCV项目开发实战--详细介绍如何进行边缘轮廓检测 (Python/C++)-附源码

使用轮廓检测​​,我们可以检测对象的边界,并轻松在图像中定位它们。它通常是许多有趣应用的第一步,例如图像前景提取、简单图像分割、检测和识别。 因此,让我们使用 OpenCV 来了解轮廓和轮廓检测,并亲眼看看如何使用它们来构建各种应用程序。 轮廓在计算机视觉中的应用

latex2【图片、公式、矩阵】

图片 语法&#xff1a; \includegraphics{排队论模型.png} 看起来很别扭是吧&#xff0c;需要进行“修饰”&#xff1a; 当然&#xff0c;这样也很丑&#xff0c;一般写论文可以用以下的格式&#xff1a; \begin{figure}[H] \caption{问题一模型示意图} \label{paiduimx} …