From:阿里 飞绪云巅论剑

Aliyun Linux 2 是为云上应用程序特别优化的开源操作系统,上游包括 4.19 LTS 内核、CentOS 7.6 软件包,为阿里云基础设施深度优化,致力于为云上用户提供最佳体验。

Aliyun Linux 2 4.19.24 发布之后,使用 will-it-scale testbench 性能测试发现 poll1\poll2 等系统调用,相较于 Aliyun Linux 1 4.4.95 存在一定程度的性能下降。

will-it-scale 使用每秒钟完成的系统调用次数来衡量系统调用的性能,以下为各个内核版本下使用 will-it-scale 测试 poll1 性能的结果。

4.4 4.4.95 4.19.24
845 万次每秒 860 万次每秒 720 万次每秒

Aliyun Linux 2 4.19.24 下的 poll1 性能相较于 Aliyun Linux 1 4.4.95 存在 16.2% 的性能下降,此外 poll2 也存在 7.5% 的性能下降。

结论

git bisect 发现以下 commit 影响了 poll1 的性能变化:

  • 5b710f34e194 (x86/uaccess: Enable hardened usercopy)

  • 236222d39347 (x86/uaccess: Optimize copy_user_enhanced_fast_string() for short strings)

  • 21d375b6b34f (x86/entry/64: Remove the SYSCALL64 fast path)

will-it-scale 测得的 poll1 性能数据如下:

版本 万次/秒
4.4 845
5b710f34e194~ 836
5b710f34e194 750
236222d39347~ 739
236222d39347 771
21d375b6b34f~ 756
21d375b6b34f 724
4.19.24 720

分析

x86/uaccess: Enable hardened usercopy

5b710f34e194 (x86/uaccess: Enable hardened usercopy) 带来 10.29% 的性能下降。

该 commit 在 v4.8-rc2 合入主线,其在 copy_from_user()/copy_to_user() 路径中添加 check_object_size() 检查,以防止内核内存泄漏 (kernel memory exposure)或堆溢出 (heap overflow exploit) 等。该检查会提升系统的安全性,但也带来了一定的性能开销。

x86/uaccess: Enable hardened usercopyEnables CONFIG_HARDENED_USERCOPY checks on x86. This is done both in
copy_*_user() and __copy_*_user() because copy_*_user() actually calls
down to _copy_*_user() and not __copy_*_user().

x86/uaccess: Optimize copy_user_enhanced_fast_string() for short strings

236222d39347 (x86/uaccess: Optimize copy_user_enhanced_fast_string() for short strings) 带来 4.44% 的性能提升。

该 commit 在 v4.13-rc1 合入主线。

当处理器支持 ERMS (Enhanced REP MOVSB) 特性时,可以使用 rep movsb 指令优化内存拷贝操作,但是依据 Intel 64 and IA-32 Architectures Optimization Reference Manual,该优化在拷贝的数据量较大时效果明显,而当拷贝的数据量较小时,rep movsb 指令本身存在的开销会导致其优化效果不明显。

因而该 commit 在 64 字节以下的内存拷贝中,将 rep movsb 替换为显式的循环操作,从而带来一定的性能提升。

x86/uaccess: Optimize copy_user_enhanced_fast_string() for short stringscommit 236222d39347e0e486010f10c1493e83dbbdfba8 upstream.According to the Intel datasheet, the REP MOVSB instruction
exposes a pretty heavy setup cost (50 ticks), which hurts
short string copy operations.This change tries to avoid this cost by calling the explicit
loop available in the unrolled code for strings shorter
than 64 bytes.The 64 bytes cutoff value is arbitrary from the code logic
point of view - it has been selected based on measurements,
as the largest value that still ensures a measurable gain.Micro benchmarks of the __copy_from_user() function with
lengths in the [0-63] range show this performance gain
(shorter the string, larger the gain):- in the [55%-4%] range on Intel Xeon(R) CPU E5-2690 v4
- in the [72%-9%] range on Intel Core i7-4810MQOther tested CPUs - namely Intel Atom S1260 and AMD Opteron
8216 - show no difference, because they do not expose the
ERMS feature bit.

x86/entry/64: Remove the SYSCALL64 fast path

21d375b6b34f (x86/entry/64: Remove the SYSCALL64 fast path) 带来 4.23% 的性能下降。

该 commit 在 v4.16-rc2 合入主线。该 commit 为修复 spectre 漏洞移除了 x86 64 syscall 入口的 fast path,而全部走 slow path,从而造成了一定的性能损失。

spectre 漏洞是 2018 年爆出的处理器安全漏洞,其实际利用处理器的分支预测功能所潜在的问题,利用旁路攻击方式造成内核数据泄露。以下简单描述该攻击方式的原理。

当处理器执行间接跳转指令,例如执行 call *<mem> 指令时,<mem> 表示一个内存地址,该地址处的内存保存了一个绝对地址,call 指令需要跳转到该绝对地址。

此时 call 指令首先需要获取 <mem> 内存的值,当该地址处的内存不处于 cache 中时,处理器就必须执行读内存操作,由于读内存操作相当耗时,此时处理器硬件会执行分支预测功能。

处理器硬件内部使用 BTB (Branch Target Buffer) 来缓存 (间接跳转指令的原地址, 跳转指令的目标地址) 这一对数据,处理器硬件的分支预测即使用 BTB 来预测当前执行的间接跳转指令对应的目标跳转地址。

然而该机制存在的一个问题是,同一个处理器上的不同应用程序会共用同一个 BTB,因而 spectre 漏洞的原理即是 attacker 通过用户态程序执行特定的间接跳转指令来训练当前处理器的 BTB,从而使同一处理器上运行的 Linux 内核运行间接跳转指令时,分支预测功能就会被误导跳转到 attacker 设计的一个特定地址上。

attacker 可以使用 eBPF 机制将 attacker 编写的攻击代码注入到内核中,而通过之前描述的机制 attacker 可以使内核的间接跳转指令在预测执行过程中,跳转执行 attacker 注入的 eBPF 代码,这样通过 cache 旁路攻击就可以获取内核的内存数据,从而造成数据泄漏。

而 syscall fast path 的移除正是与 spectre 漏洞有关。Linux 内核中,x86 64 syscall 入口实现有两条路径以调用对应的系统调用。

第一条路径是用汇编写的 fast path,若当前没有开启 trace 相关的功能,则会根据系统调用号直接在 sys_call_table 中查找对应的 syscall handler 地址,并跳转执行该 syscall handler。

call *sys_call_table(, %rax, 8)

另外一条是用 C 写的 slow path,当前开启 trace 相关功能时,只能执行 slow path 即 do_syscall_64() 函数。

由于 fast path 中使用了间接跳转指令,容易遭受 spectre 漏洞的影响,因而在经过一系列的讨论之后,社区暂时移除了 x86 syscall 的 fast path 入口,而全部走 slow paith, 而这也给系统调用的性能带来了一定的回退。

x86/entry/64: Remove the SYSCALL64 fast path
The SYCALLL64 fast path was a nice, if small, optimization back in the good
old days when syscalls were actually reasonably fast.  Now there is PTI to
slow everything down, and indirect branches are verboten, making everything
messier.  The retpoline code in the fast path is particularly nasty.Just get rid of the fast path. The slow path is barely slower.

扫描下方二维码关注"Linux阅码场"

感谢您的耐心阅读,请随手转发一下或者点个“在看”吧~

阿里飞绪: poll 性能回归分析相关推荐

  1. 阿里飞猪搜索技术的应用与创新

    分享嘉宾:林睿 阿里飞猪 编辑整理:杜正海.Hoh 出品平台:DataFunTalk 导读:旅行场景的搜索起初是为了满足用户某种特定的强需求而出现的,如机票.火车票.酒店等搜索.这些需求有着各自不同的 ...

  2. 阿里飞猪一员工涉案66亿,非法获利千万;美图将加密货币作为价值储备;Linus警告不要用Linux5.12-rc1 | 极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 丁恩华 出品 | CSDN(ID:CSDNnews ...

  3. 阿里飞猪搜索技术的应用与创新(v2021-02-03)

    分享嘉宾:林睿 阿里飞猪 编辑整理:杜正海.Hoh 出品平台:DataFunTalk 导读:旅行场景的搜索起初是为了满足用户某种特定的强需求而出现的,如机票.火车票.酒店等搜索.这些需求有着各自不同的 ...

  4. 我的后端Java面经、八面阿里,已拿offer!(阿里飞猪、阿里健康、阿里菜鸟)心得感悟!

    阿里巴巴面试 自我介绍 讲一个项目,我说的区块链,然后围绕着区块链说了一堆,比如说我没回答上来的,有没有做性能测试,还有orderer节点都有什么服务 最大堆概念 排序算法比较排序时间复杂度,如何查找 ...

  5. 测试内推 | 阿里飞猪、百度、58(招聘)、知乎、欢忻网络、百果园、阿里(Lazada)、深智城、元戎启行招人啦

    学社近期有多位同学拿到阿里巴巴.字节跳动.百度.58同城.微博.京东等大厂 Offer 并拿到学社奖学金.关注公众号,回复「面试 」获取互联网大厂测试开发面试真题 .点击**「阅读原文****」,获取 ...

  6. 推荐系统[八]算法实践总结V0:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...

  7. 极客日报第81期:阿里飞猪一员工涉案66亿,非法获利千万;美图购买4000万美元加密货币,将其作为价值储备;Linus警告不要用Linux5.12-rc1

    一分钟速览新闻点! 阿里飞猪一员工四年间贩卖机票报销发票获利超千万被判六年,涉案额达 66 亿元 一加宣布与哈苏合作研发影像系统,OnePlus 9 系列将首搭 美图购买价值四千万美元的加密货币作为价 ...

  8. 一篇文章读懂阿里云负载均衡性能保障型实例

    1. 什么是负载均衡性能保障型实例? 2. 性能保障型实例如何收费? 3. 性能保障型实例规格费的定价 4. 如何选择性能保障型实例? 5. 性能保障型实例的变配操作限制 6. 性能保障型实例何时收费 ...

  9. 阿里飞猪个性化搜索排序探索实践

    导读:旅行类商品 ( 如机票.火车票.汽车票 ) 相对实物电商更加标品,用户决策因素更加单一,而行业内大多基于简单规则排序,如时间.价格或业务逻辑加权,难以满足用户的个性化出行需求.飞猪在过去一段时间 ...

最新文章

  1. 前端学习 -- 超链接
  2. 帝国cms7.5百度小程序针对搜索引擎自然搜索优化版生成静态版
  3. nginx总结二(nginx的启动停止以及版本平滑升级)
  4. 如何建设移动 DevOps?
  5. python (第八章)补充-可迭代对象(补充高阶函数,以及常用的高阶函数)
  6. idea快速生成crud_Java / Spring:如何快速生成完整的Swagger文档CRUD REST API
  7. python字符串字面量有哪四种定义方式_Python学习笔记(四)字符串型
  8. Linux IO多路复用之epoll网络编程,高并发的使用例子 (含源码)
  9. 二阶龙格库塔公式推导_带你走进最美数学公式
  10. 搞不定的C语言--extern的作用
  11. 小程序代理创业成功的五个条件
  12. pivot sqlserver 条件_SqlServer行转列(PIVOT),列转行(UNPIVOT)总结
  13. win7计算机病毒制作教程,了解病毒的秘密,为win7打造安全盔甲
  14. 我的第一届acm大赛
  15. 2022年全球程序员薪资排行出炉:中国倒数第九,GO最赚钱
  16. 想进大厂必须要知道的Web安全问题
  17. Linux碎片整理工具,Linux不需要磁盘碎片整理
  18. INET_ATON() 和 INET_NTOA()
  19. Jenkins - 默认用户名和密码及启动方法
  20. 小型计算机系统接口是什么,小型计算机系统接口是什么

热门文章

  1. windows共享文件创建----局域网办公
  2. 王利芬对话蒲易 ——花店如何成为高端电商?_北京_歇会儿网
  3. 石英晶体振荡器的基本原理
  4. 矩阵合同与相似,为什么只有当C为正交阵时才能使既相似又合同?
  5. Oracle-12:伪列rowid和rownum
  6. 抖音二面:为什么模块循环依赖不会死循环?CommonJS和ES Module的处理不同?
  7. 三国塔防魏传java_三国塔防魏传1.6详细攻略
  8. 百度云服务器无法访问项目接口,互联网要点:百度云链接无法访问是怎么回事...
  9. 移动端App广告常见的10种形式
  10. python组合无重复三位数