海光CPU
海光物理机CPU相关信息
总共有16台如下的海光服务器
1 | #lscpu |
AMD Zen 架构的CPU是胶水核,也就是把两个die拼一块封装成一块CPU,所以一块CPU内跨die之间延迟还是很高的。
7260 系列的hygon CPU(关掉了超线程)
1 | #lscpu |
7280
1 | #lscpu |
64 个 core 的分配策略
1 | physical core processor |
海光bios配置
1 | 在grub.conf里面加入noibrs noibpb nopti nospectre_v2 nospectre_v1 l1tf=off nospec_store_bypass_disable no_stf_barrier mds=off tsx=on tsx_async_abort=off mitigations=off iommu.passthrough=1;持久化ip;挂盘参数defaults,noatime,nodiratime,lazytime,delalloc,nobarrier,data=writeback(因为后面步骤要重启,把一些OS优化也先做了) |
海光简介
公司成立于2016年3月,当前送测处理器为其第一代1.0版本的7185对标处理器为Intel的E5-2680V4,其服务器样机为曙光H620-G30。
海光CPU的命名规则:
型号71xx
7:高端
1:海光1号
xx:sku
其后续roadmap如下图
海光其产品规格如下,产品相对密集,但是产品之间差异化很小,频率总体接近。
AMD授权Zen IP给海光的操作是先成立合资公司,授权给合资公司基于Zen 研发新的 CPU,而且转让给中国的所有信息都符合美国出口法规。天津海光和AMD成立的合资公司可以修改AMD的CPU核,变相享有X86授权,而海光公司可以通过购买合资公司研发的CPU核,开发服务器CPU,不过仅仅局限于中国市场。
AMD与国内公司A成立合资公司B,合资公司B由AMD控股,负责开发CPU核(其实就是拿AMD现成的内核),然后公司A购买合资公司B开发的CPU核,以此为基础开发CPU,最终实现ARM卖IP核的翻版。
海光与AMD 的 Ryzen/EPYC 比较
由于在 Zen 1 的基础上进行了大量的修改,海光 CPU 可以不用简单地称之为换壳 AMD 处理器了。但其性能相比同代原版 CPU 略差:整数性能基本相同,浮点性能显著降低——普通指令吞吐量只有基准水平的一半。海光 CPU 的随机数生成机制也被修改,加密引擎已被替换,不再对常见的 AES 指令进行加速,但覆盖了其他面向国内安全性的指令如 SM2、SM3 和 SM4。
相同
与 AMD 的 Ryzen/EPYC 相比,海光处理器究竟有哪些不同?总体而言,核心布局是相同的,缓存大小、TLB 大小和端口分配都相同,在基础级别上两者没有差异。CPU 仍然是 64KB 四路 L1 指令缓存,32KB 八路 L1 数据缓存,512KB 八路 L2 缓存以及 8MB 十六路 L3 缓存,与 Zen 1 核心完全相同。
不同
加密方式变化**
在 Linux 内核升级中有关加密变化的信息已经明示。这些更新围绕 AMD 虚拟化功能(SEV)的安全加密进行。通常对于 EPYC 处理器来说,SEV 由 AMD 定义的加密协议控制,在这种情况下为 RSA、ECDSA、ECDH、SHA 和 AES。
但在海光 Dhyana 处理器中,SEV 被设计为使用 SM2、SM3 和 SM4 算法。在更新中有关 SM2 的部分声明道,这种算法基于椭圆曲线加密法,且需要其他私钥/公钥交换;SM3 是一种哈希算法,类似于 SHA-256;而 SM4 是类似于 AES-128 的分组密码算法。为支持这些算法所需的额外功能,其他指令也被加入到了 Linux 内核中。在说明文件中指出,这些算法已在 Hygon Dhyana Plus 处理器上成功进行测试,也已在 AMD 的 EPYC CPU 上成功测试。
此外,海光与 AMD 原版芯片最大的设计区别在于吞吐量,尽管整数性能相同,但海光芯片对于某些浮点指令并未做流水线处理,这意味着吞吐量和延迟都减小了:
这些对于最基础的任务来说也会有所影响,降低吞吐量的设计会让 CPU 在并行计算时性能受限。另外一个最大的变化,以及 Dhyana 与服务器版的「Dhyana Plus」版本之间的不同在于随机数生成的能力。
Openjdk 对海光的支持
https://github.com/openjdk/jdk/commit/d03cf75344fccba375881f0dab4ad169254e650c
https://bugs.openjdk.org/browse/JDK-8222090
https://github.com/dragonwell-project/dragonwell11/pull/517
比较不同 NUMA 方式
bios on and os cmdline off
1 | lscpu |
测试命令和结果:
1 | //以下多个测试方式的结果一样 |
如果绑核,看起来还是能识别距离远近,但是需要同时绑内存,默认绑核不绑核内存达不到就近分配
内置分配默认从高地址开始,所以core 0总是最慢的。
不绑核的话内存默认是在高地址,程序大概率远程访问内存,所以极慢
bios off
测试命令和结果:
1 | //以下三个命令结果一致 |
rt稳定在200,之所以不符合短板原理是测试中多次取平均导致的,慢的还是慢,有的在近有的在远的地址,但平均值稳定
交错编址的时候不会把一个cacheline拆分到多个node下的内存条上
测试结果和OS的启动参数是否numa=off无关
bios off后没有机会识别内存远近,也就是反复循环分配内存不可能一直分配到本node内
bios on and os on
1 | lscpu |
测试命令和参数:
1 | for i in $(seq 0 6 47); do echo core:$i; numactl -C $i -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1 |
结论
- 只要是bios numa off后用 lat_mem_rd 测试的 rt 是一个大规模次数后的平均值,但是远近内存问题仍然存在,会导致抖动和卡顿
- 如果 bios numa on,但是 OS numa off,绑核的话会分别看到不同核访问内存差异极大
- 如果 bios numa on,同时 OS numa on,这种情况绑核后会出现完美就近访问,性能最佳
- 默认地址分配从高地址开始,如果numa off 那么core 0 最慢;如果 numa on 且绑核会一直快;如果 numa on 但是不绑核,多次测试也是一直快