起因:我的笔记本漏洞修补后 I/O 性能下降接近 4 倍!!(测试数据在下面)导致 虚拟机( KVM )卡顿、VIM 偶尔卡住、编译性能下降等等
发行版:Ubuntu 16.04 LTS
CPU:Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz
我听到风声,立刻在未打补丁的内核上进行的 IO 性能测试
测试方法是
time dd if=/dev/zero of=/dev/null bs=1 count=100000000
大致就相当于疯狂的执行 100000000x2 次系统调用,结果是
记录了 100000000+0 的读入
记录了 100000000+0 的写出
100000000 bytes (100 MB, 95 MiB) copied, 19.3005 s, 5.2 MB/s
real 0m19.303s
user 0m4.728s
sys 0m14.572s
升级到 4.10.x 内核后,测试结果惨不忍睹
记录了 100000000+0 的读入
记录了 100000000+0 的写出
100000000 bytes (100 MB, 95 MiB) copied, 73.8429 s, 1.4 MB/s
real 1m13.846s
user 0m30.031s
sys 0m43.879s
我通过向内核命令行传入 nopti
参数,关闭 KPTI (内核页表隔离),禁用了修补,成功使性能还原
我自以为万事大吉了,可是万万没想到啊,前几天升级了 4.13.x 内核,速度又卡出翔啊,退回 4.10.x 内核一切正常
今天想到了测试了下,测试和之前一样了 1m14s !!!
但是 PTI 确实被禁用了(内核日志明确指出),我随后找到了这个 https://github.com/speed47/spectre-meltdown-checker
在 4.10.x 内核(禁用 PTI )测试结果如下
CVE-2017-5753 [bounds check bypass] aka 'Spectre Variant 1'
* Kernel has array_index_mask_nospec: NO
* Checking count of LFENCE instructions following a jump in kernel: NO (only 5 jump-then-lfence instructions found, should be >= 30 (heuristic))
> STATUS: VULNERABLE (Kernel source needs to be patched to mitigate the vulnerability)
CVE-2017-5715 [branch target injection] aka 'Spectre Variant 2'
* Mitigation 1
* Kernel is compiled with IBRS/IBPB support: NO
* Currently enabled features
* IBRS enabled for Kernel space: NO
* IBRS enabled for User space: NO
* IBPB enabled: NO
* Mitigation 2
* Kernel compiled with retpoline option: NO
* Kernel compiled with a retpoline-aware compiler: NO
* Retpoline enabled: NO
> STATUS: VULNERABLE (IBRS hardware + kernel support OR kernel with retpoline are needed to mitigate the vulnerability)
CVE-2017-5754 [rogue data cache load] aka 'Meltdown' aka 'Variant 3'
* Kernel supports Page Table Isolation (PTI): NO
* PTI enabled and active: NO
* Running as a Xen PV DomU: NO
> STATUS: VULNERABLE (PTI is needed to mitigate the vulnerability)
在 4.13.x 内核上(禁用 PTI ),发现了以下问题
修复 Spectre Variant 2 的 IBRS 处于启用状态,
Spectre Variant 1 中的 LFENCE instructions following a jump in kernel: YES (68 jump-then-lfence instructions found, which is >= 30 (heuristic)) 之前只有 5,现在是 68
我找到了这个: https://lwn.net/Articles/743019/ ,于是根据所说,传入 noibrs
参数成功禁用 IBRS 修补,测试性能结果如下
记录了 100000000+0 的读入
记录了 100000000+0 的写出
100000000 bytes (100 MB, 95 MiB) copied, 26.1775 s, 3.8 MB/s
real 0m26.178s
user 0m5.396s
sys 0m20.745s
性能回升一些,但仍未达到最初的状态,我估计应该是 LFENCE instructions following a jump in kernel 达到 68 导致的,如何把这个值改回 5,没有找到有关资料,即使需要重新编译内核我也想这个改回去,但不想降回旧内核。
大家怎么看
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.