为什么选择低延迟内核而不是通用或实时内核?

安装了Ubuntu Studio 12.04之后,我发现它使用了一个低延迟内核。
我搜索了一下如何解释和切换回实时或通用内核的方法。然而,看起来Linux的这部分还没有被涵盖到解释细节的范围内。
问:为什么选择低延迟内核而不是通用或实时内核?
附注:我已经阅读了这个问题的答案this和这篇文章this

对于未来的读者,我强烈推荐阅读这篇论文 - Will Eccles
5个回答

这些是一些简单的指南,旨在帮助您了解应该按照哪个内核以及什么顺序进行测试以适应您的使用情况。
- 如果您的系统不需要低延迟,请使用-generic内核。 - 如果您需要低延迟系统(例如用于录制音频),请首选-preempt内核。它可以降低延迟,但不会牺牲节能功能。此内核仅适用于64位系统(也称为amd64)。 - 如果-preempt内核无法提供足够的低延迟满足您的需求(或者您有一个32位系统),则应尝试-lowlatency内核。 - 如果-lowlatency内核还不够,请尝试-rt内核。 - 如果-rt内核对您来说不够稳定,请尝试-realtime内核。 Ubuntu帮助来源

这取决于您将如何使用您的工作室发行版。对于大多数需要快速终端用户响应时间的用户来说,通用内核就足够好了;而对于那些需要进行专业视频编辑,甚至一个简单的帧丢失都是不可接受的用户来说,则需要实时内核。

要获取更详尽易懂的博客文章,请点击这里阅读链接


1我已经阅读了你发布的前一篇文章。关于第二篇,那些事实有多可靠? - Starx
嗯,那些测试结果说明了一切。如果Ubuntu团队在首要考虑因素中选择了延迟,肯定是有原因的。所以现在你想知道差异,现在你知道了。问题解决了吗? - ubuntu fan
5不,我不认为问题已经解决了。如果你的回答有什么作用,那只会更加增加我的好奇心。 - Starx
152015年的时候,这些还有没有存在?"-preempt"、"-rt"和"-realtime"内核已经不存在了。 - naught101

我是这篇博客文章的作者,由Ubuntu粉丝链接:http://sevencapitalsins.wordpress.com/2007/08/10/low-latency-kernel-wtf/

那篇博客文章没有提供任何事实,只是一种理论。实际上,它的工作方式是这样的:处理器会更频繁地"停下来"查看是否有一些需要立即处理的进程。这意味着这些进程将在其他进程之前执行,因此在编码时不会跳帧,或者在鼠标点击和敌人死亡之间没有巨大的延迟时间。这并不意味着所有进程都会更早结束:实际上,CPU在决定下一个要执行的进程和进行上下文切换时会失去更多时间。因此,总执行时间更长,这就是为什么没有人在Web服务器或数据库机器上运行可抢占内核的原因。但对于游戏服务器来说,可抢占的300Hz(甚至1000Hz)内核是最好的。

但现在的处理器有很多核心,所以当只有少数进程需要处理时,它们可以轻松分配到不同的核心上,而不是等待一个核心处理。

(stackexchange 需要我提供参考资料/个人经验:我是一名电子工程师,在http://www.gamezoo.it 上维护多个游戏服务器的血腥新手玩家)。

所以,根据经验,我会说:如果您的处理器是强大的高频四核处理器,并且在编码/解码/游戏时通常不会打开大量网页(嗯),您可以尝试使用通用内核(或者如果存在的话,i686 或 amd64 内核),以获得最高可能的吞吐量(即处理器能够执行的原始计算)。如果您遇到问题(应该只是些小问题),或者您的机器略微不如市场上顶级产品强大,那就选择 -preempt。

如果你使用的是只有一两个核心的低端机器,那么建议尝试使用-lowlatency选项。你也可以尝试使用-realtime选项,但是你会发现它往往会阻塞进程,直到“实时”进程完成它们的任务。我相信实时内核不是“原始”的内核,而是应用了CONFIG_PREEMPT_RT补丁的内核。我认为实时内核只适用于在嵌入式系统上构建单个应用程序的人,普通桌面用户通常运行大量应用程序,因此不会真正受益于实时内核。
最后,如果你想自己重新编译内核以获得低延迟的桌面环境,以下是最相关的内核选项:
PREEMPT=y

并且:

CONFIG_1000_HZ=y

为了节省电力,您可以尝试这个方法:
CONFIG_NO_HZ=y

我注意到你提到了服务器的维护,我正在尝试找出适合Valve Source Dedicated Server(特别是CSGO)的最佳内核。大多数我找到的CS主题都与需要1000Hz内核的GoldSrc有关。对于Srcds来说,低延迟是否不好?如果无关紧要的话,我将继续使用低延迟,因为这是我目前拥有的(我将CPU核心隔离用于128 tick Srcds服务器,因为它实际上并不从多线程中受益)。 - Vincent De Smet
这些提示很有用,我会彻底改变以提前行动。我并不急着让我的核心像个肮脏的海盗一样行事。 - userDepth

我有一台旧笔记本电脑,搭载双核 AMD A6-4400M 处理器,主频为 1600MHz。我很少使用它,只在办公室外阅读邮件和浏览休闲网站。最近出现了一些问题,可能与软件更新有关,导致它变得不响应。例如,输入十几个字符却看不到第一个字符,或者经常会弹出询问是否强制退出进程的小部件。
通过运行命令“sudo apt-get install linux-lowlatency”并重新启动后,它变得流畅且响应迅速(uname -r 5.0.0-20-lowlatency)。太棒了,我应该在多年前就换成这个系统了。让我再次强调 Seven 的回答:除非你想要从一个数字计算服务器中挤取最大值,否则请选择-preempt!

这是我的直觉,也是我在搜索这个问题的原因。正是我正在寻找的答案,感谢确认,我现在会自己尝试一下 :D -- 另外回答https://askubuntu.com/a/1244714/49478也很好! - odinho - Velmont

有三个主要的性能参数来优化内核,其中一个很少在其他两个参数的背景下讨论,几乎从不进行基准测试。这导致我们对性能的认识降低和偏颇:
1. 吞吐量:媒体所进行基准测试和讨论的内容。衡量在给定时间内处理器可以传输多少数据。
2. 能效:通常也会进行基准测试;根据测量方式不同,它衡量处理一定量数据或保持系统运行一段时间所需的能源或热量成本。这对于笔记本电脑的电池寿命以及运行服务器或其他“始终开启”硬件的成本都有影响。
3. 延迟:几乎从不进行基准测试,但同样重要。它是信号或数据通过路径传输所需的平均时间,通常以毫秒为单位衡量。术语“抖动”描述了延迟随时间变化的波动,并且是延迟性能的一个子组成部分。
这是一个经典的“三选二”的情况。你可以选择吞吐量和能效,但会牺牲延迟。你可以选择吞吐量和低延迟,但会牺牲能效。你可以选择低延迟和能效,但会牺牲吞吐量。
这种权衡的一个例子是“赛跑入睡”:https://en.wikipedia.org/wiki/Race_to_sleep(由于某种原因已经不存在了,但是https://www.quora.com/What-is-race-to-halt-strategy-to-make-a-processor-energy-efficient还在)。不幸的是,CPU从各种睡眠状态中“唤醒”需要几毫秒的时间(睡眠越深,唤醒时间越长),这使得CPU频率调整对延迟性能非常糟糕,可能是最大的问题之一。这就是为什么即使是Mac OS系统也会极大地受益于禁用CPU频率调整以防止缓冲区溢出和欠流(缓冲区溢出是指进程花费太长时间来完成和重定向,因此最后一位被丢弃,而缓冲区被重新填充;而欠流是指未能及时充分填充缓冲区进行处理。两者通常被称为“xruns”,表示潜在的数据丢失)。
另一个是逻辑核心和对称多线程,它是“竞争休眠”的一个子集,通过更高效地利用所有核心来实现,但代价是增加了任何单个进程完成所需的时间。这对于能源效率和吞吐量都是有益的,但不利于延迟,延迟关注的是个别“任务关键”任务能够可靠快速地完成,而不是一组任务的总和。
通用内核适用于不涉及延迟和将一定数量的信息路由到处理器并传输到目的地的任何用例。通常情况下,通用内核提供最大的吞吐性能和能源效率,但会降低延迟优先级。
低延迟、实时和实时内核提供了不同程度的延迟关注,以及牺牲或降低吞吐量和/或能源效率。使用情况决定了在哪种情况下最合适使用哪种内核,并且这些不是唯一的选择。例如,还有https://liquorix.net/,它声称通过在吞吐量上做出小的牺牲,相对较大地提高了延迟性能,从而针对大多数常见的使用场景进行了优化。
这个问题的组成部分与其他问题混淆地重叠在一起,而且随着内核线之间的性能差异逐渐消失,这个问题的某些部分正在变得过时。例如,-generic内核已经包含了许多低延迟优化(如PREEMPT),使得其他专用内核更加专业化。很难给出具体的数字,但在我的系统上,-generic现在可以处理大约20毫秒的延迟,并且具有一定的可靠性(最小或没有缓冲区溢出或欠运行)。
我真诚地认为这种分裂存在于开源软件的副产品中,其中内核线和软件通常会进行分叉,以优化它们以适应特定的用例(是的,“-generic”是一个特定的用例,只是碰巧涵盖了大多数用例 :)),并且几乎完全忽视了对-generic用户体验的低延迟性能调优在Linux和Windows范式中的重要性。

Mac OS X是不同的,你可以在这里阅读原因:https://www.cse.unsw.edu.au/~cs9242/10/lectures/09-OSXAudiox4.pdf(这是政治和经济的结果,而不是天才和远见!)。结果是在吞吐性能上稍微做出了妥协,以便更好地处理延迟问题的系统。因此,Mac OS X及其iOS衍生版成为数字多媒体制作市场的主导者。只有一个内核。非多媒体用户对于Mac OS X的吞吐性能持续较低并不抱怨,因为实际上没有人关心文件转码需要29秒还是30秒,或者启动程序需要4.75秒还是5秒(即使是基准测试人员和“性能狂人”每天在现实世界中也注意不到这些差异),而每个人都关心用户体验是否出现卡顿和音频故障。这与延迟和响应速度的重要性有关,而不是吞吐性能的问题(这是基准测试大战唯一关注的问题),直到目前为止,只有Mac OS X真正对整个操作系统设计给予了认真考虑。

https://liquorix.net/也许在调整性能优先级方面更符合Mac的内核(我正在确认这一点)。而且我相信(也希望)-generic内核正朝着这个方向发展。对于90%左右的用户来说,这已经足够好了,除非是那些真正需要a. 尽可能获得所有吞吐量或者b. 需要极低的无故障延迟和抖动的极端情况。对于这些情况,总会有一些定制的内核可供选择。我记得NASA使用自己的内核,但我可能记错了 :)


《赛跑入眠》维基百科条目缺失,需要新的条目吗?-> https://www.google.com/search?channel=fs&client=ubuntu&q=Race_to_sleep. - Hannu
https://www.quora.com/What-is-race-to-halt-strategy-to-make-a-processor-energy-efficient - ethan

从上述引用的文件(http://www.versalogic.com/mediacenter/whitepapers/wp_linux_rt.asp)中
  1. 软实时系统可以提供较低的平均延迟,但不能保证最大响应时间。
  2. 硬实时系统在任何时候都能满足所需的截止日期(100%),即使在最坏情况下的系统负载下也是如此。
  3. 根据Yaghmour [4]的说法,“实时处理涉及到的是保证,而不是速度。”
文章指出,对于硬实时内核来说,响应性或时间限制是最重要的特性,因此有时会延迟非关键活动以保证准时完成任务,而对于低延迟或其他软实时内核,则会试图降低一般延迟,这在大多数情况下有助于提高系统速度。请仔细阅读该文章。

没错,但我们需要知道哪个内核变体与哪个实时系统的“硬度”相匹配。 - Melebius