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

最近想看下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出来的速率也是低的。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker性能测试主要是评估Docker容器的运行效率和响应时间,确保其满足预期的部署和使用需求。以下是进行Docker性能测试的一些关键方面: 1. **基础性能指标**: - **启动时间**:测试从创建镜像到容器启动所需的时间。 - **资源占用**:包括CPU、内存、磁盘I/O和网络带宽的使用情况。 - **负载能力**:在压力下,容器能够处理多少请求或并发任务。 2. **镜像优化**: - **打包优化**:检查镜像大小和加载速度,减少不必要的层和文件。 - **依赖管理**:确保容器内的运行时依赖正确处理,避免版本冲突。 3. **网络性能**: - **网络延迟**:测试容器之间的通信延迟,特别是在网络密集型应用中。 - **端口映射**:验证端口映射对性能的影响。 4. **持久化卷**: - **I/O性能**:测试入和读取数据到挂载卷的速度。 - **数据一致性**:验证数据在容器重启后是否保持一致。 5. **高可用性测试**: - **恢复时间**:模拟故障并查看容器的自动恢复性能。 - **集群性能**:在多个节点上运行容器,测试分布式环境下的性能。 6. **监控和日志**: - **性能指标监控**:使用工具如Prometheus和Grafana监控关键性能指标。 - **日志分析**:确保日志记录和分析不会影响性能。 相关问题--: 1. 如何衡量Docker容器的启动性能? 2. 性能测试中如何优化镜像以提高性能? 3. 在分布式环境中,如何进行Docker容器的网络性能测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值