最近想看下docker里运行的服务是否比cpu低,百度看到一篇写docker性能测试的文章,测试的内容很多很细,里面的内容也引起我的思考:硬件对服务器性能的影响。

因为本人对计算机系统了解甚少,所以文章里面也是力求把基础术语解释清楚,也摘抄了很多能百度出来的凑在一起,待以后翻阅也能看的懂,方便能系统性的了解硬件对性能的影响。

一般衡量CPU性能除了频率外,还有一个核心数量,再到缓存的大小(CPU的主频、系统前端总线的频率、内存的工作频率和它们之间的总线带宽等,但是内存延迟对系统性能的影响也相当大。)后续有时间争取都讲全。

目录

一、缓存

二、内存带宽

三、显存带宽

四、实战查看PCIe版本和速率

1)查看PCIe

2)如何确认自己的PCIe是几代

3)如何确认自己显卡的PCIe当前带宽占用

4)如何确认自己显卡的PCIe总带宽

5)显卡的PCIe会受到什么影响


一、缓存

先简单连接系统工作的过程。基本上当CPU接收到指令后,会首先从高速缓存中查找(缓解内存和CPU速度不匹配问题会影响到CPU执行的效率),所以它会最先向CPU中的一级缓存(L1 Cache)去寻找相关的数据,虽然一级缓存是与CPU同频运行的,但是由于容量较小,所以不可能每次都命中。这时CPU会继续向下一级的二级缓存(L2 Cache)寻找,同样的道理,当所需要的数据在二级缓存中也没有的话,会继续转向三级缓存L3 Cache(如果有的话),如果还没找到就用相对慢的速度从内存中读取,正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右)。由于系统处理的数据量都是相当巨大的,因此几乎每一步操作都得经过内存,这也是整个系统中工作最为频繁的部件。如此一来,内存的性能就在一定程度上决定了这个系统的表现,这点在多媒体设计软件和3D游戏中表现得更为明显。

一级缓存(L1 Cache)的重要性不言而喻

二级缓存(L2 Cache)Intel的CPU的二级缓存越大性能提升非常明显,而AMD的CPU虽然二级缓存也很重要,但是二级缓存大小对AMD的CPU的性能提升不是很明显。而二级缓存加倍不一定就能给处理器带来成倍的性能增长,512KB容量的二级缓存已经足够满足绝大多数应用的需求,何况二级缓存的价格挺贵。

三级缓存(L3 Cache)在服务器领域的作用更明显?的确发现很多服务器的三级缓存都很大,但是为什么说对服务器的作用明显,还是没找到具体描述。

二、内存带宽

看了上面缓存的重要性,应该也知道内存带宽为何会如此重要了吧。内存对系统的影响,主要在内存容量、内存速度(内存带宽)、延时周期(当CPU需要内存中的数据时,它会发出一个由内存控制器所执行的要求,内存控制器接着将要求发送至内存,并在接收数据时向CPU报告整个周期(从CPU到内存控制器,内存再回到CPU)所需的时间)

这里主要讲内存带宽,一般指传统型,而不是CPU集成内存控制器的整合(参照内存控制器)

先看一下这个cpu、北桥、南桥、其他硬件的连接图:

简单介绍一下北桥用于CPU和内存、显卡、PCI交换数据而南桥主要是负责IO。

北桥区有四条主总线。前端总线连接中央处理器,图形总线连接图形系统,内部总线连接到芯片组的南桥部分,内存总线连接到计算机的内存。(内存总线由两部分组成。数据总线+地址总线,而总线可分为3类,数据总线+地址总线+控制总线)

FSB前端总线主要由CPU使用,用来与高速缓存、主存和北桥(或MCH)之间传送信息。

前面说的高速缓存(L1、L2、L3或L4)是放在哪呢?它们通常集成在CPU芯片上或放置在与CPU有单独总线互连的单独芯片上,而不是主板中。这样才有着超高速的读取速度。

举例CPU访问内存的时候,流程就是这样的:

CPU--北桥--内存控制器--北桥--CPU

所以当cpu读取内存的时候,受限于2个带宽,一个是FSB前端总线带宽,一个是内存总线带宽。带宽=总线宽度×总线频率×一个时钟周期内交换的数据包个数。

内存带宽计算公式:带宽=内存时钟频率×内存总线位数×倍增系数/8。以DDR400内存为例,它的运行频率为200MHz,数据总线位数为64bit,由于上升沿和下降沿都传输数据,因此倍增系数为2,此时带宽为:200×64×2/8=3.2GB/s(如果是两条内存组成的双通道,那带宽则为6.4 GB/s)

有兴趣可以仿照这个Linux 内存带宽对进程性能影响 写一个测试去验证一下。

三、显存带宽

显卡的内存带宽(或许称为显存带宽更为合适)的重要性也是不言而喻的,甚至其作用比系统的内存带宽更为明显。大家知道,显示卡在进行像素渲染时,都需要从显存的不同缓冲区中读写数据。这些缓冲区中有的放置描述像素ARGB(阿尔法通道,红,绿,蓝)元素的颜色数据,有的放置像素Z值(用来描述像素的深度或者说可见性的数据)。显然,一旦产生Z轴数据,显存的负担会立即陡然提升,在加上各种材质贴图、深度复杂性渲染、3D特效,其工作量可想而知。在更多情况下,显存带宽的重要性超越了显存容量。

显存是作为缓存给gpu核心交互数据用的,就跟内存和cpu一样,显存带宽是gpu与显存介质之间的通信带宽,而PCI-e带宽是显卡与cpu之间的通信带宽。

一般来说16x,8x的pci-e槽肯定是占用的北桥的pci-e通道,而4x,1x的pci-e槽是是占用南桥的pci-e通道

四、实战查看PCIe版本和速率

1)查看PCIe

可以通过这个去学习怎么看系统的PCIe和对其有基本认识linux pcie驱动_基于Linux系统的PCIe常见问题定位总结

关于显卡的PCIe的版本Linux查看PCIe版本及速率,如果不清楚我下面有实战

我摘抄重要的部分出来,便于理解:

传输速率为每秒传输量GT/s,而不是每秒位数Gbps,因为传输量包括不提供额外吞吐量的开销位;
比如PCIe 1.x和PCIe 2.x使用8b/10b编码方案,导致占用了20% (= 2/10)的原始信道带宽。

GT/s —— Giga transation per second (千兆传输/秒),即每一秒内传输的次数。重点在于描述物理层通信协议的速率属性,可以不和链路宽度等关联。

Gbps —— Giga Bits Per Second (千兆位/秒)。GT/s 与Gbps 之间不存在成比例的换算关系。

PCIe 吞吐量(可用带宽)计算方法:
吞吐量 = 传输速率 * 编码方案

例如:PCI-e2.0 协议支持 5.0 GT/s,即每一条Lane上支持每秒钟内传输5G个Bit;但这并不意味着 PCIe 2.0协议的每一条Lane支持 5Gbps 的速率。

为什么这么说呢?因为PCIe 2.0 的物理层协议中使用的是8b/10b的编码方案。 即每传输8个Bit,需要发送10个Bit;这多出的2个Bit并不是对上层有意义的信息。
那么,PCIe 2.0协议的每一条Lane支持 5 * 8 / 10 = 4 Gbps = 500 MB/s 的速率。
以一个PCIe 2.0 x8的通道为例,x8的可用带宽为 4 * 8 = 32 Gbps = 4 GB/s。

PCI-e3.0 协议支持 8.0 GT/s, 即每一条Lane 上支持每秒钟内传输 8G个Bit。
而PCIe 3.0 的物理层协议中使用的是 128b/130b 的编码方案。 即每传输128个Bit,需要发送130个Bit。
那么, PCIe 3.0协议的每一条Lane支持 8 * 128 / 130 = 7.877 Gbps = 984.6 MB/s 的速率。
一个PCIe 3.0 x16的通道,x16 的可用带宽为 7.877 * 16 = 126.031 Gbps = 15.754 GB/s。

在 Linux 下要如何得知 PCI-E Bus 使用的是 Gen(Generation) 1 還是 Gen2 還是新一代的 Gen 3 呢?雖然使用lspci 只要可以看到目前系統所有的裝置.但是好像看不到 PCI-E Bus 所採用的是哪一代的 PCI-E.

先声明一下PCIe在不用的时候速率一般会降低,会显示可能是Gen1,在使用的时候才会变成Gen3。

2)如何确认自己的PCIe是几代

1、拆机看

2、去百度查显卡型号。

3、如果要在系统中确认,那看一下上面发的连接《linux pcie驱动_基于Linux系统的PCIe常见问题定位总结》去确认一下你PCIe的传输速率和吞吐量就能确定版本了,实战在这:

#lspci | grep -i nvidia
af:00.1 Audio device: NVIDIA Corporation Device 10f8 (rev a1)
输入下面命令可以让你查看pcie的时候能看到具体硬件型号
#update-pciids
之后再查询
#lspci | grep -i nvidia
af:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1)
之后就可以查询该设备的PCIe相关信息
#lspci -vvs af:00.0
主要关注LnkSta和LnkCap
LnkCap是指可达到的速度能力
LinSta是指目前使用的速度能力
LnkCap: Port #0, Speed 8GT/s, Width x16
LnkSta: Speed 2.5GT/s, Width x16
这里也是前面讲到PCIe在空闲的时候是能力会下降的,比如这个LnkCap是可以达到8GT/s的但是现在使用的是2.5GT/s。
这里可看到我们LnkCap是8GT/s,那么对照上面的表格,就可以知道是Gen3代了。而且是x16那么速率也能查到了
能看到RP是支持8G/s(GEN3),这里就需要确认为什么链路只建链到2.5Gb/s(GEN1)。当然这里的原因是因为显卡根据负载会自动切换速率,当前我们没用显卡,所以显卡驱动时为了省电故意将速率切换到2.5Gb/s(GEN1)。但如果我们对接的卡并不支持动态切换速率的话,就需要检查为什么不能建链到更高速度。一般的原因还是因为信号质量不好,尝试切速的时候误码过多,无法recovery 成功,所以速率无法上去。有的显卡使用过后切速低了之后会无法切回高速。当然还有些是width 与预期不匹配,一般原因仍然是跟物理通路有关,可能某条通路不通或者信号质量太差,但是其他部分通路是通的,有可能是插显卡的板卡速率低、有可能是主板上的PCIe速率低,则有可能建链到与预期不匹配的带宽上。

4、下载nvtop查看工具,里面可以展示你是Gen几,但是要注意上面说过的,你要把显卡或者该硬件跑起来,才能显示正确的Gen几代

3)如何确认自己显卡的PCIe当前带宽占用

1、下载nvtop来看,可以看到RX值和TX值,分别对应cpu拷贝到gpu和gpu拷贝到cpu的实时带宽。

4)如何确认自己显卡的PCIe总带宽

1、如英伟达自己有提供bandwidthtest这个测试工具(/usr/local/cuda/samples/1_Utilities/bandwidthTest/,只需make一下即可使用),可以测试出上行带宽和下行带宽,分别可以对应nvtop的RX值和TX值,这个绝对是正确的啊,多运行记下就可以在TX看到变动了(因为nvtop刷新率有点低)

5)显卡的PCIe会受到什么影响

1、能看到RP是支持8G/s(GEN3),这里就需要确认为什么链路只建链到2.5Gb/s(GEN1)。当然这里的原因是因为显卡根据负载会自动切换速率,当前我们没用显卡,所以显卡驱动时为了省电故意将速率切换到2.5Gb/s(GEN1)。但如果我们对接的卡并不支持动态切换速率的话,就需要检查为什么不能建链到更高速度。一般的原因还是因为信号质量不好,尝试切速的时候误码过多,无法recovery 成功,所以速率无法上去。有的显卡使用过后切速低了之后会无法切回高速。

2、当然还有些是width 与预期不匹配,一般原因仍然是跟物理通路有关,可能某条通路不通或者信号质量太差,但是其他部分通路是通的,有可能是插显卡的板卡速率低、有可能是主板上的PCIe速率低,则有可能建链到与预期不匹配的带宽上。

3、CPU的负载对PCIe也会有影响,当CPU负载高时,bandwidthtest出来的速率也是低的。

由一位资深测试人员写的docker性能测试引发的思考(缓存、内存、显存、PCIe)相关推荐

  1. IT人才招聘一位资深HR前辈写给新人的成长启示录

    一位资深HR前辈写给还在路上的HR的<HR成长启示录> "人生的路很长,但关键的只有几步."即便是熟知职业生涯规划的HR,当你走上职场发展之路时,依然会遇到各种困境,往 ...

  2. 我对测试工作的一些认识(资深测试人员总结)

    不知不觉在软件测试行业,野蛮生长了10年之久.这一路上拥有了非常多的感受.有迷茫,有踩过坑,有付出有收获, 有坚持! 我一直都在软件测试行业奋战, 毕业时一起入职的好友已经公司内部转岗,去选择了更适合 ...

  3. 吃鸡测试硬件的软件,绝地求生大逃杀对显卡显存要求高吗?实测吃鸡对显存的需求...

    绝地求生大逃杀是一款时下最火的沙盒游戏之一,当玩家在游戏中获胜之后会有"大吉大利,今晚吃鸡"的提示,因此很多玩家俗称这款游戏叫"吃鸡"!绝地求生大逃杀对显卡显存 ...

  4. 道法术器,第一次写书评并由此引发的思考

    最近在看这本书 ​​​​​​​ 过程中有些感悟,写了一个书评,在写书评的过程中,又引发了我的一些思考,都记录如下: 书评部分: 之前对DevOps这个概念有一些了解,不过大多都是从一些碎片的网络博文获 ...

  5. 测试人员面临的测试挑战和必备技能

    结果不确定的复杂AI系统给测试人员和程序员带来了挑战.Fiona Charles认为,这样的系统在高影响.高风险应用程序中将越来越普遍.测试人员应该提升他们的思考能力和学习能力,发展一些个人优势,比如 ...

  6. 靠谱测试人员需具备逻辑思考能力

    测试人员需要具备比较好的逻辑思考能力,具备良好的逻辑思考能力有利于设计更加全面的测试用例.同时,可以更快的理解需求规格说明,理解整个平台业务场景,提供测试执行效率. 1.判断逻辑的正确性 面试官也经常 ...

  7. 测试人员必看——掌握7大技能,做好自动化测试就不是问题!

    随着测试需求在业界不断增长.目前测试行业岗位面临较大需求,自动化测试在许多方面极大地取代了手动测试.自动化测试人员的数量增长,也极大地增加了测试行业的竞争,要想在茫茫测试人员中脱颖而出,这七大技能必须 ...

  8. GPU显卡,显存位宽

    显存位宽是显存在一个时钟周期内所能传送数据的位数,位数越大则瞬间所能传输的数据量越大,这是显存的重要参数之一. 1简介 显存位宽是显存在一个时钟周期内所能传送数据的位数,位数越大则瞬间所能传输的数据量 ...

  9. 做python自动化得时候怎么添加断言_在编写Web自动化测试用例的时候,如何写断言使新手不解,严格意义上来讲,没有断言的自动化脚本不能叫测试用例。就像功能测试一样,当测试人员做了一些操作...

    在编写Web自动化测试用例的时候,如何写断言使新手不解,严格意义上来讲,没有断言的自动化脚本不能叫测试用例.就像功能测试一样,当测试人员做了一些操作之后必然会判断实际结果是否等于预期结果,只不过,这个 ...

最新文章

  1. TensorFlow、PyTorch之后,“国产”AI框架还有没有机会?
  2. 用Python发一封图文并茂的邮件 荐
  3. 9月29日见?华为nova 9系列配置细节曝光:最高支持100W快充
  4. 最大堆MaxHeap和最小堆MinHeap的实现(转)
  5. 随机用户名获取易语言代码
  6. 【java】输入输出流
  7. mysql数据库备份方法有几种_MySQL数据库备份的几种方式
  8. [纯理论] FCOS
  9. 蓝桥杯比赛时间在什么时候_什么时候立冬2020年农历具体时间
  10. springcloud搭建实战<十一>【config配置中心】
  11. NVIDIA Jetson AGX Orin的计算能力
  12. 输入参数varargin
  13. Origin中画折线图实现双X轴和双Y轴(双坐标轴)
  14. 使用ffmpeg转换文件格式,及ffmpeg参数说明(转)
  15. 【大牛之路】大牛指导,报酬丰厚的开源项目---“谷歌编程之夏”
  16. ​LeetCode刷题实战517:超级洗衣机
  17. 一次聊个透彻:满二叉树、完全二叉树、二叉搜索树,二叉平衡树
  18. SOAP XML报文解析
  19. 关于发那科工具偏移指令
  20. Flutter Center使用方法

热门文章

  1. 资深工程师带你了解IC工程师级别与薪资
  2. 遇见InterruptedException异常,怎么办?
  3. mysql 中中间表是什么意思_为什么会有这么多中间表?
  4. 最小公倍数和最大公约数 (__gcd(x,y) )
  5. [C语言编程入门]宏定义练习之三角形面积
  6. FFplay 播放器
  7. 基于51单片机的函数/波形信号发生器
  8. 普源DG1062Z函数/任意波形发生器产品介绍
  9. Golang代码质量检查工具GolangCI-Lint(学习笔记)
  10. windows下配置adb环境