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

如何测量一个(传输网络)系统的容量

Little 定律就能反算系统容量,但我这篇文章要正着算。

假想一个理发店场景。李大爷拥有一家占地 50 平米的理发店,经理到店里理发如果已经有经理在理发,就要拿个券等待,请问李大爷需要印多少等待券?

这是个系统容量问题,答案在 “方法 1:按理发店容纳的经理数” 和 “方法 2:李大爷 10 分钟最多理多少头” 之间。

  • 方法 1:如果李大爷 10 分钟最多 10 个头,房屋能装 60 个经理,理完 60 个头就要 60 分钟,最后一位经理就要等待 60 分钟时间。
  • 方法 2:不管李大爷 10 分钟最多理几个头,最多印 1 张券,无论何时到达的经理都只需要最多等几分几秒钟。

不管哪种方法,系统都是稳定的,采用方法 1,如果有经理觉得等待时间太久,他大概下次要么早点来,要么不会再来了,平均而言,李大爷的顾客会维持在一个稳定的量,取决于店里装多少经理,采用方法 2,几乎来了就能理,顾客也会维持在一个稳定的量,取决于李大爷 10 分钟理几个头。

人们倾向于方法 1,包括公立医院,银行,饭店在内,只要在营业,就会一直发号,这其实是一种错误的方法。

我先把方法 1 和方法 2 画个图:
在这里插入图片描述

说回自己行业,当需要做容量规划,或确定自己系统的容量时,很简单,不需要做基准测试,只需不断增加负载并观测时延变化,当时延开始明显增加时的负载就是系统的容量。实践中,就是采集一组数据,拟合,画图,看图说话。

结论是,要按照处理能力规划容量,而不是按照 buffer 能力规划容量。但很少有人真正理解这一点,下面我来建模分析一下,同时说明这也是 bbr 的操作点是最佳操作点的一个证明,然后给出一个简短说明,说一下为什么方法 1 不好,我仍然会用拥塞控制领域的 aimd 说方法 1。

设 f(x) 为系统能力函数,g(x) 为处理时间函数,x 为负载。一个最大能力恒定的处理系统可以表述为:

  • 当  x = x 0 时, f ( x ) ⋅ g ( x ) = x 0 \text{当 } x=x_0 \text{时,}f(x)\cdot g(x)=x_0  x=x0时,f(x)g(x)=x0

  • 当  x < x 0 时, f ( x ) ⋅ g ( x ) < x 0 ,  f ( x ) 相对增长率大于  g ( x ) 的相对增长率 \text{当 } x<x_0 \text{时,}f(x)\cdot g(x)<x_0 \text{ , }f(x)\text{ 相对增长率大于 } g(x) \text{ 的相对增长率}  x<x0时,f(x)g(x)<x0 , f(x) 相对增长率大于 g(x) 的相对增长率

  • 当  x > x 0 时, f ( x ) ⋅ g ( x ) > x 0 ,  f ( x ) 相对增长率小于  g ( x ) 的相对增长率 \text{当 } x>x_0 \text{时,}f(x)\cdot g(x)>x_0 \text{ , }f(x)\text{ 相对增长率小于 } g(x) \text{ 的相对增长率}  x>x0时,f(x)g(x)>x0 , f(x) 相对增长率小于 g(x) 的相对增长率

那么 x0 就是该系统的容量。

下面我来证明 “将负载维持在系统容量附近(统计偏差一丢丢)是最优的”。我用 E ( x ) = f ( x ) g ( x ) E(x)=\dfrac{f(x)}{g(x)} E(x)=g(x)f(x) 表示效能,理由是李大爷希望在负载更小的等待中获得更大的能力。对 E(x) 求导:

E ′ ( x ) = f ′ ( x ) ⋅ g ( x ) − f ( x ) ⋅ g ′ ( x ) g 2 ( x ) E'(x)=\dfrac{f'(x)\cdot g(x)-f(x)\cdot g'(x)}{g^2(x)} E(x)=g2(x)f(x)g(x)f(x)g(x)

接下来利用第 2,3 条件,使用相对于当前值的相对增长率是合理的,因为消去了量纲,获得了纯增长率,有

当  x < x 0 时, f ′ ( x ) f ( x ) > g ′ ( x ) g ( x ) \text{当 } x<x_0 \text{ 时,}\dfrac{f'(x)}{f(x)} >\dfrac{g'(x)}{g(x)}  x<x0 时,f(x)f(x)>g(x)g(x)

于是有:

f ′ ( x ) ⋅ g ( x ) − f ( x ) ⋅ g ′ ( x ) > 0 f'(x)\cdot g(x)-f(x)\cdot g'(x)>0 f(x)g(x)f(x)g(x)>0

结论是:

  • 当  x < x 0 时, E ( x ) 是增函数 \text{当 } x<x_0 \text{时,}E(x)\text{ 是增函数}  x<x0时,E(x) 是增函数
  • 同理, 当  x ≤ x 0 时, E ( x ) 是减函数 \text{当 } x\le x_0 \text{时,}E(x)\text{ 是减函数}  xx0时,E(x) 是减函数
  • 当  x = x 0 时, E ( x 0 ) 获得最大值 \text{当 } x=x_0 \text{时,}E(x_0)\text{ 获得最大值}  x=x0时,E(x0) 获得最大值

这个也可以从 f(x) 和 g(x) 的图像中一眼看穿:
在这里插入图片描述

这同时也证明了 bbr 的操作点是最优的,该操作点就是 inflt = bdp,此处同时取到 maxbw 和 minrtt:
在这里插入图片描述

类似于李大爷最大的修头能力和经理最小的等待理头时间。

这个论述不仅仅适用于李大爷理发和传输协议拥塞控制,对服务器,cpu 性能调优也适用,我只是用我自己比较熟悉的领域来举例。

现在来对比一下文处所述方法 1,相比上面论述的方法 2 基于能力动态适应,方法 1 是静态的,它是基于静态 buffer 大小的。仍以 aimd 举例,一个 aimd 算法不需要测量任何能力和容量,只需要两个静态变量,一个是 buffer 大小,另一个是 β。

一旦 β 确定,时延和带宽利用率就很难两全其美。证明如下:设 W 为 cwnd,B 为恰好 100% 利用带宽时 buffer 的大小,先算一个的 B 和 β 的关系:

{ W = b d p + B ( 1 − β ) W = b d p \begin{cases}W=bdp+B\\(1-\beta)W=bdp \end{cases} {W=bdp+B(1β)W=bdp

联立上述方程组:

B = β ⋅ b d p 1 − β B=\dfrac{\beta\cdot bdp}{1-\beta} B=1ββbdp

如果 buffer > B,时延就会增加,如果 buffer < B,带宽利用率就会不足,但对于单流而言,无论 buffer 配置多大,大时延大带宽,小时延小带宽,什么都没有改变。

另一方面,如果减小 β,理论上可以配置更小乃至非常小的 buffer,锯齿也相应成为小小毛毛尖,但却造成了频繁丢包和重传,根据简单的 aimd 推算,丢包率 p 和 β 的关系如下(参见 bbr 好在哪里):

p = 1 β ⋅ B 2 ( 1 − 1 2 ⋅ β ) p=\dfrac{1}{\beta\cdot B^2(1-\dfrac{1}{2}\cdot \beta)} p=βB2(121β)1

buffer 减小,p 增大,排队时延转嫁到了重传时延,什么都没有改变。因此可以看出,aimd 算法存在固有效率损失,它依赖的收敛信号恰恰是丢包,而丢包要引入重传时延,它永远也无法收敛到 x0。

以损定损,损之又损,我不明白为什么总有人拿 aimd 说极致优化。

那么到底多大的 buffer 合适呢?早期建议约定时端口出口带宽与 100ms 的乘积,这显然仅仅满足了可用性,完全谈不上效率。加上设备 “以料足为贵”,buffer 大小更是五花八门,因此 bufferbloat 固有且无法消除。这和商场餐饮店门口长长的等待叫号异曲同工。

不怪 buffer,也不怪算法,是 buffer 就会被塞满,因为无法统一无法同构,只要有一条流在 capacity-seeking,抖动就无可避免,这种事在 parking lot topology 更容易发生,几乎睁眼可见,我留到下一篇说。

总之,你知道如何测量系统容量了吗?值得一提的是,网络链路,bdp 容量的测量要难得多,这也是 bbr 在现网表现并不都优秀的原因,这也是 aimd 算法永远迈不过去的坎,下次说。

本文主要讲动态容量评估和静态容量评估,水随山势,山不转水转,然而但凡你能测量 bw 和 rtt,就不至于随波逐流,但不可否认的是,aimd 是好的,什么都不用做。

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

相关文章:

如何测量一个(传输网络)系统的容量

Little 定律就能反算系统容量&#xff0c;但我这篇文章要正着算。 假想一个理发店场景。李大爷拥有一家占地 50 平米的理发店&#xff0c;经理到店里理发如果已经有经理在理发&#xff0c;就要拿个券等待&#xff0c;请问李大爷需要印多少等待券&#xff1f; 这是个系统容量问…...

【MySQL】MySQL和Workbench版本兼容问题

1、安装MySQL WorkBench 最新版本下载&#xff1a;https://dev.mysql.com/downloads/workbench/ 历史版本下载&#xff1a;https://downloads.mysql.com/archives/workbench/ 2、问题描述 本人在Windows下安装了一个旧版本的MySQL&#xff08;5.1&#xff09;&#xff0c;同…...

项目实战 ---- 商用落地视频搜索系统(10)---后台搜索Cache优化

目录 背景 技术实现策略 视频预处理阶段的cache技术 视频搜索阶段的cache技术 技术实现 预处理阶段cache策略实现 逻辑 代码 运行结果 问题及注意点 搜索阶段cache策略实现 系统配置层面 逻辑 低版本 GPU CPU 本项目的配置 高版本 描述 go ahead 策略 cac…...

客户端(服务器下载文件)

一、客户端代码 客户端代码 //实现TCP客户端通信 #include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<netinet/ip.h> #include<netinet/in…...

P1544 三倍经验 (记忆化搜索)

三倍经验 题目描述 数字金字塔由 n n n 行整数组成&#xff0c;第 i ( 1 ≤ i ≤ n ) i(1\le i\le n) i(1≤i≤n) 行有 i i i 个数字&#xff0c;一个示例如下。 73 98 1 02 7 4 4 4 5 2 6 5现在你在金字塔的顶部&#xff08;第一行&#xff09;&…...

【在Python中创建简单界面计算器】

在Python中创建带有简单界面的计算器&#xff0c;我们可以继续使用Tkinter库&#xff0c;这是一个非常流行且易于使用的GUI库。下面是一个简单的计算器实现&#xff0c;它支持加、减、乘、除四种基本运算。 首先&#xff0c;确保你的Python环境中已经安装了Tkinter。Tkinter通…...

【四范式】浅谈NLP发展的四个范式

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学&#xff0c;人工智能&#xff0c;语言学关于计算机和人类自然语言之间的相互作用的领域&#xff0c;是计算机科学领域与人工智能领域中的一个重要方向。NLP发展到今天已经进入到了…...

--- 数据结构 优先级队列 --- java

之前提高到队列是一种先进先出的结构&#xff0c;但是在某些情况下操作的数据具有优先级&#xff0c;那么对他先进行操作&#xff0c;这时队列就不能满足需求了&#xff0c;因为队列只能操作对头的元素&#xff0c;而具有优先级的数据不一定是在对头&#xff0c;这样就需要优先…...

鸿萌数据恢复服务:如何恢复 Mac 系统中被擦除的文件?

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据备份、数据恢复解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 公司是多款国际主流数据恢复软件的授权代理商&#xff0c;为…...

片段阅读2_中心理解以外题型

目录 一、标题拟定二、下文推断1.三种简单结构:2.三种不易识别结构:三、语句填入1.在开头2.在中间3.在尾句4.盯细节四、语句排序1.宏观把握2.盯住细节五、细节判断一、标题拟定 题型说明:主旨意图题的变型,就是把主旨意图进行“标题化”的改造;正确选项要求:标题中需包含…...

【网络安全 | 渗透工具】IIS 短文件名枚举工具—shortscan安装使用教程

未经许可,不得转载。 文章目录 shortscan安装使用Shortutil 工具shortscan ShortScan 是一种用于在 Microsoft IIS (Internet Information Services) Web 服务器上进行短文件名枚举的工具。该工具可以帮助攻击者利用 IIS 的文件名处理特性,通过预测性扫描枚举服务器上的文件…...

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)

目录 队列&#xff08;queue&#xff09;的定义 顺序队——队列的顺序表示和实现 顺序队列&#xff08;循环队列&#xff09;的类型定义 顺序队列上溢问题的解决方法 ​编辑 循环队列的基本操作 队列的基本操作——队列的初始化 队列的基本操作——求队列的长度 队列的…...

el-table 的单元格 + 图表 + 排序

<el-table border :data"tableDataThree" height"370px" style"width: 100%"><el-table-column :key"activeName 8" width"50" type"index" label"序号" align"center"></el…...

FPGA第 9 篇,Verilog 中的关键字和基数

前言 在 Verilog 中&#xff0c;关键字&#xff08;Keywords&#xff09;和基数&#xff08;Radix&#xff09;是语言的重要组成部分&#xff0c;它们有助于描述和定义硬件设计。上期分享了 Verilog 的基本使用&#xff0c;以及数据类型、逻辑值和算数运算符的简单应用&#x…...

什么是单元测试?怎么做?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小…...

论文复现--基于LeNet网络结构的数字识别

前言 一直就听说学习深度学习无非就是看论文&#xff0c;然后复现&#xff0c;不断循环&#xff0c;这段时间也看了好几篇论文(虽然都是简单的)&#xff0c;但是对于我一个人自学&#xff0c;复现成功&#xff0c;我感觉还是挺开心的 本人初学看论文的思路&#xff1a;聚焦网络…...

Vue3 响应式工具函数isRef()、unref()、isReactive()、isReadonly()、isProxy()

isRef() isRef()&#xff1a;检查某个值是否为 ref。 isRef函数接收一个参数&#xff0c;即要判断的值。如果该参数是由ref创建的响应式对象&#xff0c;则返回true&#xff1b;否则&#xff0c;返回false。 import { ref, isRef } from vue const normalValue 这是一个普通…...

数据结构之简单选择排序介绍与举例

简单选择排序 简单选择排序是一种排序算法&#xff0c;其基本思想是&#xff1a;通过n-i次关键字间的比较&#xff0c;从n-i1个记录中选出关键字最小的记录&#xff0c;并和第i个记录交换之。 举例&#xff1a; 给定数组 [64, 25, 12, 22, 11]&#xff0c;进行简单选择排序。…...

九、Redis 的实际使用与Redis的设计

一、多级缓存架构 在线上系统中&#xff0c;一定不会单纯的只部署一个Redis集群&#xff0c;而是使用Redis结合其他的多级缓存应用进行架构。 使用多级缓存架构的优点就是可以使不同类型的数据分布在不同的应用中&#xff0c;比如redis的热点key可以存储到nginx本地缓存、服务…...

乔拓云模板助力,微信小程序快速上线无需愁备案

想要快速打造并上线自己的微信小程序吗&#xff1f;乔拓云平台是您的不二之选&#xff01;无需担心复杂的备案流程&#xff0c;乔拓云提供免费服务&#xff0c;远程协助您轻松完成微信小程序的备案工作。 只需简单几步&#xff0c;您的小程序就能闪亮登场&#xff1a;首先&…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...