在《高性能Python》这本书中提到了硬件的速度,哪些速度是我们可以观测到的,哪些只能通过比较得出大概的差距?

图片来源:【Connection speeds of various common interfaces (image by Leadbuffalo [CC BY-SA 3.0])】
图片的左边是对数形式的参考体系,使用对数坐标系,可以在1M/s~10G/s范围内将差距巨大的不同速率拉到一张图中对比。因为使用对数的原因,横轴的刻度是非均匀的。速度最慢的是我们手机的3G、4G网络,处于中间的是USB以及局域网无线、千兆网线,第一梯队是各种接口的速度如 PCI-E、HDMI、雷电口、最快的是内存。这是一张全景图:

我们再看看真实刻度下的各种标准的速率。

我们的4G手机设计速度大概在20MB/s,这个速度实际上是个很高的速度。相当于百兆网线的两倍,但实际上大部分地区的4G速度只能到3MB/s左右,百兆网线可以跑到10MB/s,在人流聚集区4G网络下载速度只能达到3MB/s左右。在一些信号塔附近,4G网络可以达到10MB/s左右的速度,我还没见过跑到20MB/s的4G网络。测速方法就是用手机打开speedtest.cn点测速即可:

这里用的单位是Mbps,换成我们平常下载用的单位MB/s数值还要再除以8。21.82Mbps 相当于2.7MB/s。我们再看下5G网络的速度:

5G在真实环境下的速度相当于千兆的40%,测一次速干掉600M的流量,如果每个月的流量只有几十G,测个三次就干掉两个G了。在5G网络下不要随便测速。
处于中间水平的是我们的家庭网络:

早期的老的无线比如 WiFi 802.11n 和 USB2.0 是一个水平,只有10MB/s左右的速度,实际上对标的是百兆网。这里要注意的是GEthernet,即千兆以太网的速度是100MB/s,USB3.1直接奔1000MB/s去了,这里应该指的是接口标准的速度,在实际生活中,使用USB3.0的无线网卡、U盘、移动硬盘这些受限于所搭载的介质的速度,USB3.0的无线网卡的速度能达到800Mbps,相当于千兆以太网的速度,也就是说USB3.0的无线网卡可以当千兆网卡用。而USB3.0的U盘只能达到30MB/s左右的速度,而USB3.0的移动硬盘则可以达到100MB/s左右的速度,基本上相当于机械硬盘的真实速度。
最后再看下我们的速度冠军内存:

DDR3的内存,速度可以达到10GB/s。如果是和硬盘比,1秒钟就可以填满1GB的硬盘,500G的硬盘只需要1分钟即可填满。
内存的速度怎么测?
在 Linux 下可以使用 dd 这个软件来测试内存的读写速度。
$ dd if=/dev/zero of=/dev/null bs=1M count=1000
通过 dmidecode 工具可以查询内存的型号,DDR4 2400 MHZ 的速度大概在9GB/s
$ dmidecode -t memory| grep -B10 -A12 "Type: DDR4"$ dd if=/dev/zero of=/dev/null bs=1M count=10001000+0 records in1000+0 records out1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.119383 s, 8.8 GB/s

开了双通道的速度可以达到17.2GB/s
$ dmidecode -t memory | grep -A11 -B11 "Type: DDR4"$ dd if=/dev/zero of=/dev/null bs=1M count=10001000+0 records in1000+0 records out1048576000 bytes (1.0 GB) copied, 0.0610583 s, 17.2 GB/s

这个速度基本上是市面上存储能达到的极限了,比如用纯闪存SSD组的阵列,受限于内存的读写速度,存储的IO极限基本上也就在20GB/s
使用 dd 也可以用来测硬盘速度。
测写入速度:
$ dd if=/dev/zero of=test.img bs=1M count=10001000+0 records in1000+0 records out1048576000 bytes (1.0 GB) copied, 0.513642 s, 2.0 GB/s
测读取速度:
$ df -h .Filesystem Size Used Avail Use% Mounted on/dev/sda5 1.8T 154G 1.7T 9%$ dd if=/dev/sda5 of=/dev/null bs=1M count=10001000+0 records in1000+0 records out1048576000 bytes (1.0 GB) copied, 1.82049 s, 576 MB/s
以上硬盘是由5块SAS机械盘组的RAID10,四块盘做数据盘,一块当热备。
PCI-E 接口的 NVMe SSD 的读写速度都能达到1GB/s以上:

除了考虑 IO 的吞吐量,在有些高频IO应用中,比如数据库,对 IO 的延迟要求也比较高。因为网络的延迟较大,所以很少会用 iscsi 的方案来跑数据库。常用的数据库存储互联方案,一般会选用 InfiniBand 的交换机来互联存储结点。
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。




