我有一个 Linux 系统,我们使用 cgroups 创建了两个 cpu_exclusive cpuset,A 和 B,并且我们将所有用户线程和所有未绑定的内核线程迁移到附加到 cpuset A 的 cgroup。在 cpuset A 中运行的事物具有不同的调度程序策略和不同的优先级,并且 cpuset A 中运行的线程比 cpuset A 中的内核数多得多。
还有一些非常活跃的进程附加到 cpuset B 上,这些进程中的用户线程总数永远不会大于 cpuset B 中专门可用的内核数。 目标是屏蔽这些在 cpuset 中运行的重要任务B 来自机器上的其他活动并最大限度地减少处理延迟。
在这样的设置中,在 cpuset B 中运行的用户线程的调度策略/优先级是否有任何可观察到的影响?换种说法:将 B cpuset 线程的调度策略从默认的 SCHED_OTHER 更改为 SCHED_FIFO 或 SCHED_RR 会有什么后果,好还是坏?
似乎答案应该是“否”,因为调度程序应该能够为在 cpuset B 中运行的每个线程分配其自己的专用内核,因此不会有任何优先级或调度,因此 B 的策略和相对优先级cpuset 线程无关紧要。另一方面,需要担心绑定的内核线程和“调度程序域”方面,可能还有其他我没有考虑过的事情。
在任何实际意义上,在过度配置的独占 cpuset 中运行的线程的调度策略和优先级是否重要?
If I do the following command on my standard Linux Mint installation:
comp ~ $ ps -eo rtprio,nice,cmd
RTPRIO NI CMD
...
99 - [migration/0]
99 - [watchdog/0]
99 - [migration/1]
- 0 [ksoftirqd/1]
99 - [watchdog/1]
Run Code Online (Sandbox Code Playgroud)
我得到了一些实时优先级为 99 的进程。
rtprio在非实时 Linux 中是什么意思?这是否意味着如果我只运行一个rtprio99的程序,它会实时运行?实时操作系统在这个故事中处于什么位置?
我正在尝试了解完全公平调度程序 (CFS)。根据Linux 内核开发中的Robert Love ,第 3 版(斜体他的,粗体我的):
CFS 不是为每个进程分配一个时间片,而是根据可运行进程总数计算进程应该运行多长时间。CFS 不使用 nice 值来计算时间片,而是使用 nice 值来加权进程将接收的处理器比例:较高值(较低优先级)的进程相对于默认 nice 值接收分数权重,而较低值(更高的优先级)进程获得更大的权重。
然后每个进程运行一个“时间片”,该时间片与其权重除以所有可运行线程的总权重成正比。为了计算实际时间片,CFS 为其在完美多任务处理中“无限小”调度持续时间的近似值设定了目标。这个目标称为目标延迟......让我们假设目标延迟是 20 毫秒,并且我们有两个具有相同优先级的可运行任务。无论这些任务的优先级如何,每个任务都会运行 10 毫秒,然后抢占另一个。如果我们有四个相同优先级的任务,每个任务将运行 5 毫秒。如果有 20 个任务,每个任务将运行 1 毫秒....
现在,让我们再次考虑两个可运行进程的情况,除了有不同的 nice 值——比如说,一个使用默认的 nice 值(零),另一个的 nice 值为 5。这些 nice 值具有不同的权重,因此我们的两个进程接收处理器时间的不同比例。在这种情况下,权重对 nice-5 过程产生大约 1/3 的惩罚。如果我们的目标延迟再次是 20 毫秒,我们的两个进程将分别收到 15 毫秒和 5 毫秒的处理器时间。
第一个粗体句子表示无论优先级如何,任务都具有相同的时间片,而第二个表示时间片取决于 nice 值。哪个是正确的,或者我错过了什么?
我prlimit在 Ubuntu 中使用我的沙箱来做一些资源限制,这非常有帮助。但是,我不太确定如何处理RLIMIT_NICE. 文档说:
RLIMIT_NICE(自 Linux 2.6.12 起,但请参阅下面的 BUGS)指定可以使用 setpriority(2) 或 nice(2) 将进程的 nice 值提高到的上限。
但是,根据getpriority(2),只有首先由超级用户拥有的进程才能提高它的价值。但如果是这种情况,该RLIMIT_NICE值不会增加太多功能,因为特权用户RLIMIT无论如何都可以任意降低或提高值。
所以我不明白如何使用或解释RLIMIT_NICE. 对于非特权用户来说,整个事情似乎毫无用处,因为他们一开始无法提高优先级,并且将其设置为低于当前优先级是没有意义的。不过,对于超级用户它并没有真正添加任何东西要么是因为nice,和RLIMIT_NICE软,硬限制,可以任意提高。
那么背后的想法是RLIMIT_NICE什么?
有没有办法重点关注 X 应用程序的优先级,最好是在 CPU 和 I/O 方面?
类似于所有 X 应用程序的优先级都被优化和离子化,但是当它们获得焦点时,它们会被优化和离子化回到正常水平。
我不想重新发明轮子,所以我希望有人已经开发了一个可以做到这一点的应用程序。
在/etc/fstab文件内部的第六列中,有一个数字对应于是否应该扫描文件系统的错误。可能的值为:
0 - skip
1 - high priority
2 - low priority
Run Code Online (Sandbox Code Playgroud)
为什么在 /etc/fstab 中引入了 fsck 'priority'?

我想更好地了解 cgroups,并想了解应用 cgroups 的用例。
cgroups 是对不同应用程序进行优先级排序的好方法(即,给予特定类型的应用程序更高的优先级,如 Web 服务器)?
在 Windows 上,我经常将游戏进程的优先级更改为“高”或“实时”以获得性能提升。这从未导致我的硬件出现任何问题。我在想,也许我可以在 Linux 上使用chrt命令来更改游戏进程的实时优先级,因为reniceing,即使到 -20(最高优先级)似乎也没有提供任何明显的提升。但是,在不知道它是否可能对我的 CPU 有害的情况下,我对这样做持谨慎态度。谁能告诉我风险?
我知道ionice当您有多个进程请求访问相同的磁盘资源时如何帮助您,但是当您有多个磁盘时它如何工作?
例如,您有一个rsync操作从Drive A -> Drive Brsync移动数据,另一个操作从Drive C -> Drive D移动数据。
从理论上讲,由于它们不竞争资源,因此ionice这些rsync进程之一不应改变其吞吐量。这是它的工作方式,还是会影响性能?
此外,在独立于驱动器速度的linux系统上可能遇到的总I/O是否有一些“上限” ?就像连接 100 个SSD驱动器一样,在某些时候,操作系统会遇到驱动器速度之外的瓶颈吗?
我知道您可以使用setpriority或nice或来更改流程的好处renice。
但是,Linux 是否会在没有用户输入的情况下自动调整/更改进程优化?
我有一个setpriority在 C 中使用的进程,如下所示:
setpriority(PRIO_PROCESS, 0, -1)
Run Code Online (Sandbox Code Playgroud)
当进程运行时,我可以通过运行htop看到它的 niceness 值现在是 -1 。
在调查远程机器上的崩溃时,向我提供了 htop 的输出。我注意到此进程的 niceness 值在一个实例上更改为 0,在另一个实例上更改为 6。我想知道这是由内核更改的,还是更改此值的唯一方法是让用户或脚本故意进行更改。
priority ×10
linux ×8
nice ×4
scheduling ×4
process ×3
cgroups ×2
filesystems ×1
fsck ×1
fstab ×1
games ×1
hardware ×1
ionice ×1
performance ×1
real-time ×1
ulimit ×1