Loading...
墨滴

张军

2021/04/16  阅读:48  主题:橙心

延迟

你应该知道的计算机延迟数字

了解常见的计算机延迟,有助于架构设计和问题排查。比如互斥锁延迟,硬盘存取延迟,网络延迟等等。通过了解不同设备或环境的延迟的数量级,就很容易理解redis为什么比mysql快很多,异地多活架构有多难。

本文从微观的CPU时钟延迟开始,到宏观的异地双机房网络延迟,描述各种延迟的数量级。

延迟的定义

如下是维基百科对延迟的定义:

Latency from a general point of view is a time delay between the cause and the effect of some physical change in the system being observed. Lag, as it is known in gaming circles, refers to the latency between the input to a simulation and the visual or auditory response, often occurring because of network delay in online

换成大白话,从事件发生到结果所用的时间就叫延迟,比如我要传一个文件到服务器,这个传输的时间,比如30s,就是延迟。之所以叫延迟,是因为我们希望在一瞬间完成某件事,但现实不允许,从开始到完成的时间差就是延迟。我们最熟悉的RPC调用,从请求发起到响应结果返回,这个耗时就是请求延迟。

我们总是希望延迟越小越好。编码时使用多线程,控制并发时使用轻量级锁或无锁编程,买性能更好的服务器网卡/交换机,机房之间使用高带宽光纤等等,都是为了降低延迟。一般情况下,延迟和速度成反比,速度越快,延迟越小。

为了精细优化系统间请求延迟,甚至会考虑将上下游的两个微服务混部在同一个物理机,或者在请求路由时优先考虑部署在同物理机/同机架的服务提供者。

常见延迟

为了便于对比,最后一列将时间扩大10亿倍

操作 平均延迟 扩大10亿倍
3Ghz CPU时钟周期 0.3 ns 0.4秒
寄存器访问 0.5 ns 0.5秒
执行指令 1 ns 1秒
L1缓存访问 1 ns 1秒
L2缓存访问 3 ns 3秒
分支预测错误 5 ns 5秒
L3缓存访问 12 - 40 ns 40秒
获取/释放互斥锁 17 ns 17秒
getPid系统调用 40 ns 40秒
fread/fwrite系统调用 60 - 100 ns 1.3分钟
主(内)存访问 70 - 100 ns 1.5分钟
PCIe 400-900 ns 8分钟
网卡 1 us 16分钟
上下文切换 1-3 us 33分钟
SSD随机读 16 us 4小时
单机房内网络 0.5 - 2 ms 23天
同城双机房光纤50KM 2 - 5 ms 29天
机械磁盘 2 - 10 ms 57天
阿里云异地机房(北京-广东) 50 - 100 ms 2.4年
4G 60 ms 2年
3G 120 ms 3.8年
卫星 800 ms 25年
重启电脑 90 s 2853年

从上述列表中,可以看出,普通磁盘是有多慢,跟SSD差了一个数量级,这个数字可以告诉你,提升数据库服务器硬件配置,就能使性能上一个台阶。

目前最快的SSD是Intel Optane(英特尔傲腾),延迟低到小于10微妙,目前已有项目基于SSD实现海量数据的缓存服务,比如360开源的项目Pika

从数据中可以知道,如果要做双机房多活架构,就要容忍2-5毫秒的数据延迟问。异地多活延会更大,对系统架构的设计也是不小的挑战。

参考

Compute Performance – Distance of Data as a Measure of Latency

What is the overhead of a context-switch?

Latency (engineering)

Latency-driven performance in data centres

Measurements of system call performance and overhead

每个程序员都应该知道的延迟数字

张军

2021/04/16  阅读:48  主题:橙心

作者介绍

张军