后端程序员需要知道的一些数据
常数
光速
光速约3.00×108m/s, 即每秒30w公里,每秒绕地球七圈半
- 算网络延迟
深圳到北京距离大约为2000km,RTT延迟最少为2*2000km/300,000km=13ms
- 和光速有关的bug
2002年提出的一个bug,电子邮件无法发送到500英里以外
2的次方表
2的次方 | 真实值 | 近似值 | 字节 |
---|---|---|---|
27 | 128 | ||
28 | 256 | ||
210 | 1024 | 1 thousand | 1 KB |
216 | 65,536 | 64 KB | |
220 | 1,048,576 | 1 million | 1 MB |
230 | 1,073,741,824 | 1 billion | 1 GB |
232 | 4,294,967,296 | 4 GB | |
240 | 1,099,511,627,776 | 1 trillion | 1 TB |
- C语言unsigned int最大值为216 -1 = 65535
- 32位地址总线的寻址空间为 232 = 4G
延迟
在2010年,Jeff Dean在一次演讲中给出了每个程序员都应该知道的数值列表,但这些数据收集于2001年,最初发表在 Teach Yourself Programming in Ten Years。这些数据适用于粗略估算,并不是一个准确值,重要的是理解这些数字的量级差异。
- | ns | µs | ms | 速度 | |
---|---|---|---|---|---|
L1 cache reference | 0.5 ns | ||||
Branch mispredict | 5 ns | ||||
L2 cache reference | 7 ns | 14x L1 cache | |||
Mutex lock/unlock | 25 ns | ||||
Main memory reference | 100 ns | 20x L2 cache, 200x L1 cache | |||
Compress 1K bytes with Zippy | 3,000 ns | 3 µs | |||
Send 1K bytes over 1 Gbps network | 10,000 ns | 10 us | 100 MB/s | ||
SSD random read | 150,000 ns | 150 µs | ~1GB/sec SSD | ||
Read 1 MB sequentially from memory | 250,000 ns | 250 µs | 4 GB/s | ||
Round trip within same datacenter | 500,000 ns | 500 µs | |||
Read 1 MB sequentially from SSD* | 1,000,000 ns | 1 ms | 1 GB/s | ~1GB/sec SSD, 4X memory | |
Disk seek | 10,000,000 ns | 10 ms | 20x datacenter roundtrip | ||
Read 1 MB sequentially from disk | 20,000,000 ns | 20 ms | 30 MB/s | 80x memory, 20X SSD | |
Send packet CA->Netherlands->CA | 150,000,000 ns | 150 ms |
问题
生成包含30个缩略图的结果页需要多长时间?
- 串行读,每个缩略图256k
30 seeks * 10 ms/seek + 30 * 256K / 30 MB/s = 560 ms
- 并行读,每个缩略图256k
10 ms/seek + 256K read / 30 MB/s = 18 ms
硬件性能的提升
随着硬件的发展,硬件的读写速度已经成倍的提升了。从2010到2020年,network,ssd和disk的速度提升明显。
如下所示:
2010 | 2020 | 性能提升倍数 | |
---|---|---|---|
Send 2k bytes over commodity network | 1,000 ns ≈ 1 μs | 44 ns | 22 |
Read 1M bytes sequentially from SSD | 494,000 ns ≈ 494 μs | 49,0000 ns ≈ 49 μs | 10 |
SSD random read | 17,000ns ≈ 17μs | 16,000 ns ≈ 16 μs | 1 |
Disk seek | 5,000,000ns ≈ 5ms | 2,000,000 ns ≈ 2ms | 2 |
Read 1M bytes sequentially from memory | 30,000ns ≈ 30μs | 3,000ns ≈ 3 μs | 10 |
Read 1M bytes sequentially from disk | 3,000,000ns ≈ 3ms | 825,000 ns ≈ 825 μs | 3 |
网络
端口号
端口 | TCP | UDP | 描述 |
---|---|---|---|
20 | Y | FTP - 默认数据端口 | |
21 | Y | FTP - 控制端口 | |
22 | Y | SSH | |
23 | Y | Telnet | |
25 | Y | SMTP | |
53 | y | Y | DNS |
80 | Y | Y | HTTP, QUIC |
110 | Y | POP3 | |
443 | Y | Y | HTTPS |
掩码
二进制 | 十进制 |
---|---|
1000 0000 | 128 |
1100 0000 | 192 |
1110 0000 | 224 |
1111 0000 | 240 |
1111 1000 | 248 |
1111 1100 | 252 |
1111 1110 | 254 |
1111 1111 | 255 |
IPv4 地址分类
网络标志位 | IP地址范围 | 私有地址范围 | 私有地址-CIDR | |
---|---|---|---|---|
A | 0 | 0.0.0.0 - 127.255.255.255 | 10.0.0.0 - 10.255.255.255 | 10.0.0.0/8 |
B | 10 | 128.0.0.0 - 191.255.255.255 | 172.16.0.0 - 172.31.255.255 | 172.16.0.0/12 |
C | 110 | 192.0.0.0 - 223.255.255.255 | 192.168.0.0 - 192.168.255.255 | 192.168.0.0/16 |
D | 1110 | 224.0.0.0 - 239.255.255.255 | ||
E | 1111 0 | 240.0.0.0 - 247.255.255.255 |
操作系统
上下文切换
上下文切换大概30µs的cpu开销,最佳实践方式是工作线程数等于CPU线程数,并以异步/非阻塞方式编写代码。
MTU
64 ~ 1500 byte,如果MTU设置得不合理会导致IP分片与重组,从而导致网络传输质量问题。