Skip to the content.

拷贝的成本

GPU 拷贝成本

PCIe 的带宽和延迟

CPU 单页拷贝的成本

先测一个最小问题:如果无法 zero-copy,只是拷贝一个 4KiB page,大概需要多久。

测试程序:

gcc -O3 -march=native -Wall -Wextra -o docs/kernel/topics/page-copy.out docs/kernel/topics/page-copy.c

当前测试机器:

CPU: 13th Gen Intel(R) Core(TM) i9-13900K
CPU1: P-core sibling, max 5500MHz

同一个热 page

命令:

taskset -c 1 docs/kernel/topics/page-copy.out 4096 1 10000000

结果:

copy_size:  4096 bytes
pages:      1
iterations: 10000000
total:      38.147 GiB
elapsed:    0.154856 s
latency:    15.49 ns/copy
bandwidth:  246.34 GiB/s
counter:    46.38 ticks/copy

另一个 P-core 上结果类似:

taskset -c 8 ...
latency:    15.49 ns/copy
bandwidth:  246.28 GiB/s
counter:    46.40 ticks/copy

这个数字代表的是 L1/cache 非常热的上限,不代表真实 I/O 或网络路径里每个 page 都能这么便宜。

1MiB 工作集

命令:

taskset -c 1 docs/kernel/topics/page-copy.out 4096 256 10000000

结果:

latency:    79.96 ns/copy
bandwidth:  47.70 GiB/s
counter:    239.51 ticks/copy

32MiB 工作集

命令:

taskset -c 1 docs/kernel/topics/page-copy.out 4096 8192 2000000

结果:

latency:    327.14 ns/copy
bandwidth:  11.66 GiB/s
counter:    979.86 ticks/copy

其实拷贝的速度相当快

taskset -c 1 docs/kernel/topics/page-copy.out 4096 800192 1
copy_size:  4096 bytes
pages:      800192
iterations: 1
total:      0.000 GiB
elapsed:    0.000001 s
latency:    555.00 ns/copy
bandwidth:  6.87 GiB/s
counter:    56974.00 ticks/copy
checksum:   1390000

初步结论

单个热 page 的 memcpy 不是贵到不可接受:当前机器上约 15.5ns, 但是只要工作集扩大,成本会很快被 cache/TLB/memory 层级放大。

所以讨论 zero-copy 时不能只说“少拷贝一次 4KiB page”。需要同时说明这个 page 是不是热的、工作集多大、访问模式是否顺序、是否跨核/跨 NUMA,以及 copy 是否处在请求关键路径上。

Caches (sum of all):
  L1d:                       896 KiB (24 instances)
  L1i:                       1.3 MiB (24 instances)
  L2:                        32 MiB (12 instances)
  L3:                        36 MiB (1 instance)

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。