奇遇科技服务器性能测试工具(预览版)

起因参见: 基准测试很难

因为准备对各大厂商的服务器进行性能测试, 所有开发了此程序。

警告

您可以获取此软件的源代码,也可以免费用于非商业用途(结果仅供自己使用),商用请获取授权。

主要包含:

  • vps_bench 1 CPU、内存、磁盘性能测试

  • vps_network 2 Ping, Traceroute, 网速测试

  • vps_compose 3 测试自动化

  • VPS 信息网站 测试结果展示(当前只允许内部查看)

使用文档 4

为什么测试结果不准确?

注解

腾讯云的测试服务器是 1核心 2GB 内存 40GB 磁盘

基准测试很难 中所示,在腾讯云的服务器上, 如果测试 1GB 磁盘的读写,那么您可能得到如下的结果(时间单位为: 秒):

# vps_bench disk --file-name test.bin -n 1
文件大小: 1073741824 记录块大小: 4096
顺序读写: 读取: 9.465708662 写入: 6.522950584
顺序重读写: 读取: 0.429681788 写入: 7.300880043
随机读写: 读取: 0.678426381 写入: 35.54965614
跳跃读写: 读取: 0.604654152 写入: 61.462532305
倒序读写: 读取: 0.622710396 写入: 7.74615848

虽然这个结果是实际 “测量” 出来的,但是这个结果实实在在是错误的(顺序重读的速度超过了 2GB/s)。

警告

令人惊讶的是网上有很多测试结果都是这种错误的结果。 (有的比这还要糟糕,测试报告里面只有顺序读写。)

错误的原因就在于:

重要

忽略了系统性的偏差。

因为系统(2GB)有足够的内存缓存这个文件,后面读取的效果相当于直接从内存中读取(速度当然超块)。

让我们增大文件的大小再来看一下测试结果:

# vps_bench disk --file-name hello.bin -n 4
文件大小: 4294967296 记录块大小: 4096
顺序读写: 读取: 37.33398404 写入: 35.289427454
顺序重读写: 读取: 38.143020175 写入: 36.218555249
随机读写: 读取: 448.698573539 写入: 367.017263288
跳跃读写: 读取: 120.809023658 写入: 415.889601139
倒序读写: 读取: 347.250639267 写入: 36.043712078

这个结果看起来就正常多了(顺序读写速度大约为 100+MB/s)。

重要

测试磁盘性能的时候,为了避免文件系统缓存的影响,应该把测试文件的大小至少设置为 内存大小的 2 倍以上。

内存读写速度

读取测试流程: 读取 1GB 内存,每次读取 1 字节并且计算读取数据之和的结果。

写入测试流程: 写入 1GB 内存,每次写入 1 字节。

https://cdn.jsdelivr.net/gh/QiYuTechDev/static@main/blog/202102/bench_tool/ram_bench_result.svg

注解

  • 黄颜色的线条是随机读

  • 红颜色的线条是随机写

  • 下面的两个线条是 顺序读 和 顺序写

  • 随机读 和 顺序读 性能差了大概 350 倍.

  • 随机写 和 顺序写 性能差了大概 150 倍.

让我感到意外的是: 随机读 比 随机写 性能还要差。

根据测试流程,随机读 比 随机写 多了一个计算的步骤。 但是这并不足以说明 他们之间的吞吐量会相差这么大的(因为 顺序读写 只相差了 0.03s)。

导致性能差距过大的根本原因应该是: 局部性原理 5

读取的时候,因为是随机读,所以 Cache 的里面的数据全部都是无效的(相当于 Cache 命中率为 0)。

写入的时候,虽然写入的位置都是随机的,但是 “现代” 的 CPU 都使用了 “Write-Back”(写回) 技术,导致比没有命中缓存的读要快。

参考资料

1

vps_bench

2

vps_network

3

vsp_compose

4

vsp_bench 性能测试工具文档

5

局部性原理