关注了就能看到更多这么棒的文章哦~

The search for the correct amount of split-lock misery

By Jonathan Corbet
October 19, 2022
DeepL assisted translation
https://lwn.net/Articles/911219/

X86 与许多其他架构不同,它能支持那些会影响超过一个 cache line 的原子操作(atomic operation)。但是,这种支持也带来了代价,不尽包括整个系统的性能方面的代价,甚至在安全性方面也有代价。在过去的几年里,内核开发人员一直在努力阻止使用这种 "split-lock" 操作。但是,现在,有一群用户感到有点太受伤了,于是就引出了一个讨论,使用有问题、但在架构上是合法的操作的用户,应该得到多大程度的不便。

跨越 cache line 边界的原子操作存在的问题是,系统总线必须要采取特殊措施来确保两个 cache line 都在受到保护,不会被多方并发同时访问到(concurrent access)。在实践中,这就意味着在操作过程中要锁住总线(locking the bus),这可能会使得系统中的其他处理器都无法继续执行。只有有一个恶意的程序来执行一个紧凑的会导致 split-lock 操作循环,就可以破坏整个系统的性能。由于这个原因,split-lock 操作长期以来一直不被人看好。

不幸的是,恶意软件(或只是写得不太好的软件)对于这些反对意见完全无动于衷。因此,从 2019 年开始,内核开发人员就在寻求更有说服力的方式来表达他们的观点。最初的工作是由 Fenghua Yu 完成的,但最后,Peter Zijlstra 的 patch 在 2020 年 1 月被合并到 5.7 内核版本中。它使内核有能力对 split-lock 操作引起的 trap 采取一些行动,并提供了三种选项,可由 split_lock_detect= 这个 kernel 命令行参数来选择:

  • off,内核的行为会跟以前一样;不检测 split-lock 操作,出现的时候不做任何事情。

  • warn(默认值),在检测到 split-lock 操作时在系统日志中发出 warning(warning 频率会有限制)。

  • fatal,让内核立即 kill(用 SIGBUS)这些试图进行 split-lock 的进程。

我们希望 warning 模式足以提醒用户注意这个问题,并让软件能得到正确的 fix,同时不影响任何人使用自己的系统。但是,到了今年早些时候的 5.19 开发周期,似乎对于去除 split-lock 操作并没有太大进展,,拒绝服务(denial-of-service)的问题还是跟以前一样现实存在。因此,人们决定采取更强硬的立场来克制 split-lock。

当然,选项之一是默认切换到 fatal 模式,但这会是一个非常严厉的解决方案。Tony Luck 采取了不同的方案,他写了一个 patch,标题是 "让分裂锁的人活得很痛苦(make life miserable for split lockers)"。这个 patch 中修改了 warning 模式,会对导致了 split-lock 的进程进行惩罚,但不会真正去 kill 它们。相反,在检测到 split-lock 时就会让它受到 10ms 级别的 delay,并且通过 semaphore 保证序列执行。当选择这种模式时,使用了 split-lock 的恶意程序仍然会拖慢自己执行的速度,但对整个系统不再有太大影响了。这一改动是在 5.19 合并窗口期间合入的。

9 月中旬,一个名为 "pibberflibbits" 的 GitHub 用户发布了一份 bug report,称 Linux 上的 God of War (战神)游戏的性能变得 "低得离谱"。参与讨论的人们花了一点时间,最终发现问题出在 split-lock 的这个额外惩罚上。显然,战神并不满足于仅使用普通的 lock,所以游戏中使用了许多 split locking。Luck 的 patch 确实达到了预期的目的,战神玩家现在是过得很痛苦。

不过,Guilherme G. Piccoli 并没有庆祝这场对战神的胜利;相反,他发布了一个 patch,认为 "不应该修改 default 配置选项,让旧的应用或者专有软件表现下降,尤其是原有的 config 选项能正常工作的情况下"。这个 patch 对 warn 模式恢复到了的旧的行为,并增加了一个新的 seq 模式,该模式会像现在的 warn 模式一样拖慢 split-lock 用户的速度。warn 模式仍然是默认的,这就解除了游戏界的苦难。

对这一改动的意见不太一致。Luck 指出,游戏玩家可以通过在内核命令行上用 split_lock_detect=off 重启,就能直接禁用 split-lock 检测。他说,如果要增加 seq 模式,那么也应该是默认的。他还建议向《战神》的发行商提交一个 bug,从而让其 fix 它自己的问题。

不过,其他人不同意。Joshua Ashton 认为这个问题是个普遍问题。"这不仅仅是《战神》的具体一个游戏的问题。有许多老的作品永远不会再更新了,也就无法 fix 这个问题。这些游戏以前能很好地运行,性能也很好"。其他人指出,许多游戏玩家不太可能做到去调整内核的命令行参数。Dave Hansen 观察到,造成痛苦的这个计划已经按计划运作,并将问题暴露出来了。但是他继续说道:

我的直觉告诉我,我们应该保留 warning,不再让人们痛苦了。那些能够 fix 这些 bug 的人可能也是会看 dmesg 的人,他们不需要经受这样的痛苦来得到额外的提示。那些运行 Windows 游戏的人不看 dmesg,只想在没有痛苦的情况下玩他们的游戏。

不过,Luck 认为,split-lock 会给其他进程(除了这个有责任的进程之外)制造了痛苦,而目前的模式 "在多用户系统上非常有效"。他建议,也许可以开发某种启发式方法,让这些折腾用户的行为就限制在多用户系统中。

不过,最终 Thomas Gleixner 给出了明确的答案,他指出,默认情况下拖慢 split-lock 的速度,这是发行版中可以做出的唯一选择;其他任何方案都会产生一个容易被利用的拒绝服务漏洞。所以拖慢速度的做法需要保留。"减少受攻击的暴露面,会比某个应用程序出现问题要更重要"。不过,他确实建议说,可以添加一个 sysctl 开关来控制 split-lock 的检测;这就可以让那些使用这种出现了的应用程序的用户能回到以前的性能,而不需要弄清楚如何改变 kernel 命令行参数,也不需要重启他们的系统。

这就是 Piccoli 为解决这个问题所提交的第二个版本中采取的方法。新增了 kernel.split_lock_mitigate 开关,如果设置为 0 的话将禁用对使用 split-lock 的进程所进行的惩罚(同时保留发送到 system log 的 warning)。默认情况是保留这个减速的行为。这个 patch 似乎让每个人都很满意,而且看起来很可能会进入 6.2 版内核。受影响的玩家将不得不去相应设置新的开关,也就是说要想成为真正的战神,得先知道要调整系统中的哪些 sysctl。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

LWN:split-lock用户应该受到多重的惩罚?相关推荐

  1. windows10访问ubuntu samba共享文件夹报错:不允许一个用户使用一个以上用户与服务器多重连接(没解决)

    如图,解决方法参考:Windows共享文件夹无法访问,提示"不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接" 不过还是没有用... 20220217 可以查看下ubu ...

  2. 微信被指监听用户,腾讯回应;谷歌意外推送 Android 11 Beta 更新;Linux 5.7 发布 | 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自视觉中国 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客 ...

  3. java 抢单 缓存服务器_第二节:抢单流程优化1(小白写法→lock写法→服务器缓存+队列→redis缓存+队列)...

    一. 小白写法 1.设计思路 纯DB操作 DB查库存→判断库存→(DB扣减库存+DB创建订单) 2.分析 A.响应非常慢,导致大量请求拿不到结果而报错 B.存在超卖现象 C.扣减库存错误 3.压测结果 ...

  4. oracle新建用户名和密码,Oracle安装后忘记用户名或密码+创建新登陆用户

    新安装Oracle 11g,不料没记住安装时的用户名和密码. 不用担心,打开sqlplus. 按如下步骤,新建一个登陆用户: 第一步:以sys登陆  sys/密码 as sysdba  此处的密码任意 ...

  5. Oracle 数据库用户锁定与解锁,用户锁定最大密码失败次数设置方法,ORA-28000: the account is locked问题解决方法

    用户多次密码输入错误达到一定值就会被锁定. -- 用户锁定方法 alter user 数据库名 account lock; -- 用户解锁方法 alter user 数据库名 account unlo ...

  6. Oracle编程入门经典 第3章 建立以及管理用户和表

    数据定义语言(DDL). 怎样建立我们自己的用户账号. 可以用于Oracle表的不同数据类型. 怎样在表上建立约束. 怎样使用数据词典获取与数据库中对象有关的信息. 3.1 数据定义语言 DDL通常用 ...

  7. 在命令行下进行Oracle用户解锁

    在DBA的日常工作中,经常遇到为Oracle用户解锁的操作:这篇文章给出在命令行下进行Oracle用户解锁的操作方法,通过几条简单的解锁语句就能完成此项工作.下面是具体的过程: 默认的scott用户是 ...

  8. 推荐系统炼丹笔记:阿里DMIN多重兴趣网络

    作 者:一元 公众号:炼丹笔记 背景 许多现有的建模开始基于用户的历史行为序列进行建模并且取得了相当不错的效果,为了捕获用户动态和变化的兴趣, 我们观测到用户经常在某个时间点拥有大量的兴趣, 与此同时 ...

  9. Oracle中管理用户(创建用户,用户加锁,用户解锁,修改用户密码,授权登录权限,撤销登录权限,授权连接权限,conn命令,创建角色,并为角色赋权限,将角色赋给指定用户)

    SQL> create user abc identified by password; 用户已创建. SQL> --为abc赋予登录权限,1. connect 2. create ses ...

最新文章

  1. 应用按home键无最近应用
  2. node的包管理工具:yarn和npm
  3. 电脑不能安装虚拟机--解决办法
  4. 【题解】 bzoj4472: [Jsoi2015]salesman (动态规划)
  5. 【转载】分布式事务 介绍
  6. SAP UI5 应用的调试标志位的本地存储逻辑 - local storage 使用的一个例子
  7. Windows防火墙增加访问端口
  8. rdkit GetAtoms获取化合物每个位置的索引;rdkit FindMCS大公共相同结构 找不同化合物之间的差异
  9. mongodb 数据库迁移
  10. execute()方法
  11. stata行logistic回归交互项(交互作用)的可视化分析(1)
  12. 系统性能调优技术实战
  13. 金蝶ERP服务器系统中间件,中间件在ERP系统中的作用及发展趋势
  14. Spring @Aspect注解
  15. 江苏省计算机二级高级office知识点,计算机二级高级Office常见知识点积累
  16. Android实现涂鸦功能
  17. 有哪些你一打开,就令你惊讶的网站?
  18. GNS3的RIP协议的动态路由配置
  19. HTML: 点击链接时在新窗口打开
  20. sql中的窗口函数:lead,lag

热门文章

  1. 中国佛学200句震撼世界的禅语
  2. 从事iOS开发八年,却只发布了一款APP
  3. INTJ的恋爱心理,INTJ的婚姻观念
  4. Python下的网络抓包库
  5. C语言之前的A、B语言又是什么?(计算机语言发展史)
  6. Python基础语法全体系 | 深入剖析字符串类型及其操作
  7. 关于实时个性化营销中的数据应用
  8. 铕-铽-钆-六氟乙酰丙酮(HFA)三元配合物|磷光铱(Ⅲ)配合物(ftfmppy)2Ir(TSAP)|(dfppy)2Ir(PSAP)-齐岳合成试剂
  9. 快速落地基于“AIGC+数字人”的数字化内容生产
  10. c语言中将十六进制数转换为十进制数程序,C语言中十六进制转十进制两种实现方法...