我们是否应该保留同时多线程?

SMT技术通过共享处理器资源提高性能,但近年来的安全漏洞使其成为双刃剑。文章探讨了SMT的利弊,包括其在芯片尺寸、功耗效率及现代CPU普及上的优势,同时也指出了其在系统调优、实时负载处理及安全风险上的挑战。面对L1TF和MDS等安全威胁,禁用SMT成为了一种可能的选择。

SMT有利也有弊,我们究竟该如何掌控?

作者 | Matt Fleming

译者 | 弯月,责编 | 屠敏

出品 | 优快云(ID:优快云news)

以下为译文:

无论你在哪台计算机上阅读此文,操作系统显示的CPU很有可能并非是实际的物理处理器。 这是因为大多数现代处理器都使用同时多线程(simultaneous multithreading,即SMT),通过并行执行任务来提高性能。

英特尔的SMT实现是众所周知的超线程(hyperthreading),最初于2002年引入,旨在不增加时钟频率的前提下提高奔腾4和志强CPU的性能。直到2008年英特尔推出Nehalem微体系结构之前,除了酷睿产品线之外的大多数英特尔的CPU都支持超线程技术(HTT)。最近,英特尔宣布他们的酷睿产品线将不再使用超线程。

AMD也涉足了SMT,下图显示了Zen微体系结构中SMT的工作方式。

如上图所示,有些组件专属于每个线程,而有些组件则被共享。哪些部分被共享了?这取决于实现方式,不同的微体系结构也不尽相同。但通常都是执行单元的某部分被共享。 

对于x86架构,SMT线程通常成对出现,这些线程在访问共享处理器硬件时需要互相竞争。SMT有效地利用了线程在硬件使用方面的天然差距。或者如Pekka Enberg所说:

使用SMT有利也有弊。

SMT的好处

与完整地复制处理器资源相比,SMT实现在芯片尺寸和功耗方面的效率要高很多。

英特尔声称,如果用SMT处理多线程工作负载,那么芯片尺寸只需增加不到5%,就可以换来 30%的性能提升。

实际的效果在很大程度上取决于工作负载,而且正如一切性能相关的问题一样,确定效率提升的唯一方法就是自己进行测试。

我支持SMT的另一个原因是现代 x86 CPU 统统使用了SMT。因此,这是最简单的提高性能的方式。你只需要确保在BIOS配置中打开SMT即可。

SMT的弊端

SMT最大的优势以及最大的劣势之一就在于,操作系统并不会明确指示SMT是否已启用。在大多数情况下,这都没问题的,因为这是不必要的干扰。但是,在诸如容量规划、对系统调优以处理实时负载等问题上,人们的确需要知道SMT是否已经启用。

比如,在把物理CPU分配给虚拟机时,如果不知道SMT是否已启用,那么很容易认为将CPU数量加倍就能让性能加倍,但在绝大多数情况下这种希望都会落空,因为这些CPU实际上是SMT,它们会互相竞争处理器资源。

现代x86处理器拥有很多核心(最新的AMD Rome CPU拥有64个核心,顶配的英特尔酷睿i9有18个核心),即使不需要启用SMT也能获得很多性能。

但不利于SMT的最大原因,也是最主要的原因,就是近年来层出不穷的安全漏洞,包括L1TF和MDS。

2018年8月,OpenBSD建议完全禁用SMT,它是第一个提出这种建议的操作系统,因为它认为SMT会出现更多的漏洞。事实证明这种做法是正确的。

上个月,Greg Kroah Hartman 在 Open Source Summit 上发表的演讲中,对OpenBSD的前瞻性做法大为赞赏,他表示他十分“敬重”OpenBSD这个项目,因为他们做出了艰难的决定,在性能和安全中选择了安全。

如何禁用SMT

许多用户都在考虑完全禁用SMT。至于是否应该禁用,取决于你的个人情况。

但如果你想禁用,那么首先应该进行性能测试,以理解禁用SMT对性能的影响。也就是说,你需要一种方便的做法来启用或禁用SMT。

通常你需要修改BIOS设置,但如果你无法访问BIOS,并且使用的是Linux,那么可以在/sys/devices/system/cpu/smt/control文件中指定"off"来禁用SMT,如下所示:

$ nproc
4
$ echo off > /sys/devices/system/cpu/smt/control
$ nproc
2

如果想重新启用 SMT,则只需要在同一个文件中指定"on"即可。

那么,我们是否应该保留SMT?我们无法保证今后不会发生芯片级别的安全漏洞,因此如果你担心安全问题,那么最可靠的做法就是禁用SMT。如果你担心会损失性能,那就需要运行性能测试。

原文:https://www.codeblueprint.co.uk/2019/11/05/does-smt-make-sense.html

本文为 优快云 翻译,转载请注明来源出处。

【End】

热 文 推 荐 

春晚亲民,快手上行:探秘春晚红包的另一种打开方式

拼多多求变 200 天:撒钱百亿元,江湖人称拼爹爹?

面对疫情,AI 能做什么?

☞小网站的容器化(上)

区块链第一,情商上榜,2020找工作需要哪些技能?

你点的每个“在看”,我都认真当成了喜欢

### Redis 线程模型概述 Redis 的线程模型经历了不同的发展阶段,早期版本(v4.0 之前)主要采用单线程模型,而自 Redis v6.0 开始引入了多线程支持。以下是两种模型的区别及其特点。 #### 单线程模型 Redis 在 v6.0 之前的版本中采用了经典的单线程架构[^3]。这种模型的核心在于通过一个事件循环(event loop),利用 I/O 多路复用技术(如 `select`、`epoll` 或 `kqueue`)来高效地管理客户端连接并处理请求。具体来说: - **文件事件处理器**:Redis 基于 Reactor 模式实现了文件事件处理器(File Event Handler)。该处理器负责监听多个 socket 连接上的事件,并根据事件类型调用相应的回调函数进行处理[^5]。 - **优点**: - 避免了多线程环境下的锁竞争和上下文切换开销。 - 设计简单,易于调试和优化。 - 对于绝大多数场景而言,CPU 并不是 Redis 性能的主要瓶颈;真正的瓶颈通常是网络 I/O[^3]。 然而,单线程模型也有局限性——当某个命令的执行时间较长时(如复杂计算或大对象操作),可能会阻塞整个事件循环,影响其他客户端的响应速度。 --- #### 多线程模型 随着 Redis 功能的扩展和技术需求的变化,Redis 自 v6.0 起引入了部分多线程的支持[^2]。尽管如此,Redis 的核心仍然是围绕单线程运行,新增的多线程特性主要用于特定场景下提升性能。主要包括以下几个方面: - **I/O 处理中的多线程**:在 Redis v6.0 中,网络读写操作可以通过配置启用多线程模式。此时,主线程仍然负责接收新连接和分发任务给工作线程池,而实际的数据读取/写入由这些工作线程完成[^1]。 - **持久化过程中的多线程**:对于 AOF 日志重写等耗时操作,也可以分配独立的工作线程来减少对主线程的影响[^4]。 需要注意的是,即使启用了多线程功能,默认情况下 Redis 的命令执行依然保持串行化,即每次只有一个命令会被解析和执行。这有助于维持 Redis 数据结构的一致性和高性能表现。 --- ### 单线程 vs 多线程区别总结表 | 特性 | 单线程模型 | 多线程模型 | |-------------------|----------------------------------|----------------------------------| | 核心逻辑 | 所有操作都在单一主线程内完成 | 主线程配合辅助线程共同协作 | | 使用范围 | 请求处理、数据存储与检索 | 网络 IO 及某些后台任务 | | 上下文切换成本 | 极低 | 较高 | | 锁机制依赖 | 不需要额外加锁 | 存在线程间同步问题 | 综上所述,虽然 Redis 已经具备了一定程度上的多线程能力,但从整体上看它依旧保留着以单线程为主导的设计理念[^2]。 ```python import redis # 创建 Redis 客户端实例 r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 测试简单的键值操作 r.set('test_key', 'value') print(r.get('test_key')) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值