起因:我的笔记本漏洞修补后 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,没有找到有关资料,即使需要重新编译内核我也想这个改回去,但不想降回旧内核。
大家怎么看
1
we000 2018-02-05 10:57:40 +08:00 via Android
那就自己编译吧,其实锁定旧内核也没什么区别吧。。。
看法嘛,IO 性能降四倍是个什么表述? IO 用时多这么些不应该啊,而且那只是极限情况平时问题不大吧,自己笔记本这个补丁不打问题也不大吧。。。 |
2
iwtbauh OP @we000 问题是我不知道如何才能将这个值改回 5 啊,内核编译选项里并没有找到,网上也没有找到有用的信息,只好求助各位了。
是真的能感觉出不如之前流畅了,很难受的,要不然我也不会为了无关紧要的性能牺牲安全不是 强迫症又想用新内核,唉。。 |
3
innoink 2018-02-05 11:13:59 +08:00 via Android 1
去看 git 记录,改了哪些地方,改回来
|
4
jyf007 2018-02-05 11:16:47 +08:00 1
还是 gentoo 方便,想怎么改就怎么改啊
对了 openbsd 在 2006 年已经补了. |
6
iwtbauh OP @innoink 看不出是什么地方修改的,我这水平恐怕只能一个补丁编译一次一个补丁编译一次地试出来是哪个提交导致的,天哪
|
7
iwtbauh OP 而且独立主线内核之外再维护一套补丁的难度太大了,内核一更新我就可能需要跟进,这个值好象是内核执行某种跳转的次数,恐怕无法通过给用户一个编译选项,只能通过折中形式“硬编码”到内核中,这样看来我还是退回旧内核吧
|
9
jyf007 2018-02-06 09:00:37 +08:00
|