用例对CPU和IO具有不同的进程优先级?


9

Linux进程可以具有不同的CPU和IO优先级(nice和ionice)。

为什么需要具有不同的CPU和IO优先级?

现实世界中是否有与众不同的用法?

您发现现实中哪些用例需要不同的CPU和IO优先级?例如高于正常的CPU优先级,但低于正常的IO优先级,反之亦然。

Answers:


6

“ nice”的默认行为是在更改精美程度时也调整应用程序的“ io”优先级。

当然,一切都取决于您的工作量,但是任何操作系统的关键方面之一就是它如何分配资源以及如何处理竞争

理解良好的功能实际上很重要,因为在竞争进程的负载下,操作系统的行为方式可能会对其余工作负载产生影响。

竞争是衡量不同应用程序如何竞争同一资源(如CPU)的度量。

处理负荷

自从引入了完全公平的调度程序以来,nice只是每个进程的“ weight”子句的前端。可以在proc中查看。

$ cat /proc/self/sched
---------------------------------------------------------
...
se.load.weight                     :                 1024
...

改变美感只会改变体重:

$ nice -n 5 cat /proc/self/sched 
---------------------------------------------------------
...
se.load.weight                     :                 335
...

CPU争用的度量是通过完全公平的调度算法完成的。每个应用程序都分配有一个“权重”值,在争用CPU时间的情况下,通过将所有争用CPU时间的处理合计并根据其权重值为它们分配最低的公称CPU时间,在各个进程之间分配时间。

如果我有3个都希望使用CPU时间的应用程序,则默认情况下它们会收到1024作为正常权重。如果我有一个进程具有上述类似的+5,则所有三个权重的总和为2383,如果所有3个进程都在那一秒内请求CPU,那么经过处理的进程将在给定的第二秒内获得大约15%的cpu时间。 。

为什么需要具有不同的CPU和IO优先级?

尼斯实际上仅是在系统负载时玩弄什么,即-操作系统如何根据所需的任何因素来定义竞争进程之间的时间间隔。

这对您的影响或对您的关系受不同应用程序之间的交付优先级以及交付每个应用程序的时间所约束。

美好的事物真的只有做东西时,你的系统负载下(还有更多的东西想关注的莫过于CPU或者硬盘可以处理)。它仅指示内核在这种情况下如何分配资源。

现实世界中是否有与众不同的用法?

如果您有许多竞争的过程或要完成的工作比CPU所能完成的更多,那么尼斯会为您提供一些相对稳定的保证,以确保首先完成的工作。如果您说出的报告应该在另一个报告完成之前发送,这对您可能很重要。

在台式机系统上,美观甚至更为重要。某些应用程序具有实时行为,因此在加载过程中被更频繁地唤醒,可以防止数据过时。例如,Pulseaudio属于此类。

可能需要其他应用程序来为从属应用程序分配工作。例如,许多apache请求说像MySQL这样的SQL服务器可能会阻塞很长一段时间,因为SQL的服务速度不够快,因为-某些其他报告正在争夺CPU时间。因此,不仅SQL停滞了,Apache也停滞了。有时SQL可能会受到伤害,因为通常工作线程比apache线程少得多,而apache线程作为一个组进行竞争,以便由调度程序更好地进行权衡,因此为SQL分配更多的CPU时间可以使事情变得平淡。

UpdateDB(一种为文件建立索引的程序)在深夜运行,并且磁盘占用很大。降低其IO调度优先级可能会很有用,以使当时的其他应用程序优先于那些不重要的事物。

您发现现实中哪些用例需要不同的CPU和IO优先级?

很少。尽力是尽力而为的方法。作为一个经验法则,我不太关心应用的表现如何,以及 更多关于他们如何厉害可以执行。起初听起来可能有些倒退,但是我要满足的服务交付保证对我来说更重要。

我希望有信心说“即使在糟糕的一天,您的工作也会在X个时间段内完成”。如果运行得更快,那只是一个好处。

我通常会首先生成约定的规范,例如:

  • 保证所有Web应用程序都能在0.3秒内完成请求。
  • 保证系统上的所有SQL请求都将在0.1秒内完成。
  • 该Web应用程序应处理的IOPS不超过50,并提供1000个文件。
  • Web应用程序的内存总量总计不超过250Mb。

并提出如下要求:

  • 所有网络请求应在0.05秒内完成。
  • 所有SQL请求应在0.02秒内完成。
  • 应该有足够的内存来处理所有请求。
  • IO要求应得到满足。

只要提供了正确的规范,我就可以使用控制组的更高效方法来实现这些目标,而无需进行虚拟化。

如果应用程序在指定的范围内运行,控制组使我能够为资源分配提供相当可靠的服务级别保证。这意味着即使在负载很大的系统上,我也可以保证相关应用程序的资源可用性,并保证同一盒子上其他应用程序的空间!

如果我们以您的CPU和IO为例。我设置了满足这些要求的限制:

# cd /sys/fs/cgroup/blkio/apache
# echo "253:0 100" >blkio.throttle.read_iops_device 
# echo "253:0 50" >blkio.throttle.write_iops_device 
# echo "253:0 102400" >blkio.throttle.read_bps_device

因此100k字节要读取100 iops。

# cd /sys/fs/cgroup/cpu/apache
# echo 1000000 >cpu.cfs_period_us
# echo 60000 >cpu.cfs_quota_us 

在1秒的时间间隔内,分配0.06秒的CPU。

# cd /sys/fs/cgroup/cpu/sql
# echo 1000000 >cpu.cfs_period_us
# echo 20000 >cpu.cfs_quota_us

在1秒的时间间隔内,分配0.02秒的CPU。

提供其他竞争的cgroup不会做任何愚蠢的事情,承受负载对我的服务交付影响较小,因为我知道如何为每个应用程序分配CPU。

具有这种性质的对照组仍然是尽力而为,但是与这种努力相比,他们提供了更多的控制权。


我在问是否需要不同的CPU和IO优先级。您说在“很少”用例中,您发现需要具有不同的CPU和IO优先级。你能参考一下吗?
爱德华多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.