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

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

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

让他们与众不同有什么实际用法吗?

你发现哪些真实世界的用例需要不同的CPU和IO优先级? 像高于正常的CPU优先级,但低于正常的IO优先级,反之亦然。

“nice”的默认行为是当niceness改变时也调整应用程序的'io'优先级。

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

对于理解什么样的好处真的很重要,因为当从竞争的进程加载时,操作系统的行为方式可能会影响其余的工作负载。

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

处理负载

自从完全公平的调度程序被引入以后,好的仅仅是每个过程的“权重”条款的前端。 哪些可以在proc中查看。

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

改变正气只会改变重量:

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

CPU争用的措施是由完全公平的调度algorithm完成的。 每个应用程序都被分配一个“权重”值,在竞争CPU时间的情况下,时间被分成两个进程,通过总计CPU时间的所有处理竞争,并根据它们的权重值为其分配最低的公用面额CPU时间。

如果我有3个应用程序都想要使用CPU时间,默认情况下他们会收到1024作为正常的权重。 如果我有一个像上面那样好的+5的进程,那么所有三个权重将总计为2383,如果所有3个进程都在那个时候请求CPU,那么在给定的秒内,nched进程将因此获得大约15%的cpu时间。

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

当系统处于负载状态时,尼斯确实只是在玩弄什么,也就是说,操作系统如何根据任何必要因素定义的在竞争过程之间切换时间。

这对你有什么影响或者是否与你有关系,受到不同应用程序相互之间的交付优先级的限制,以及交付每个应用程序所需的时间。

当你的系统处于负载状态时(比起CPU或磁盘可以处理的东西更多的是需要关注的东西) ,尼斯确实只会有所作为 。 它只是指示内核在这种情况下如何分配资源。

让他们与众不同有什么实际用法吗?

如果你有许多竞争的过程或者要做的工作超过CPU所能完成的工作,那么善良会为你提供一些相对稳定的保证,以确定哪些工作能够先完成。 如果您的观点是在另一份报告完成之前生成应该交付的报告,这对您可能很重要。

在桌面系统上,善良可以变得更加重要。 某些应用程序具有实时行为,因此在加载过程中经常被唤醒可以防止数据过时。 例如,Pulseaudio属于这个类别。

其他应用程序可能需要为依赖应用程序工作。 例如,很多apache请求说像SQL这样的SQL服务器可能会阻塞很长一段时间,因为SQL没有提供足够快的速度,因为有些其他报告正在争夺CPU时间。 所以不仅SQL停滞,Apache也是如此。 SQL可能会在这里受到伤害,因为通常工作线程远远less于apache线程竞争作为一个组,以便调度程序更有利于权衡,所以给SQL更多的CPU时间会增加。

UpdateDB(一个索引文件的程序)在晚上运行很晚,而且非常繁重。 减less其IO调度优先级可能是有用的,以便当时的其他应用程序优先于那些事物顺序不重要的事物。

你发现哪些真实世界的用例需要不同的CPU和IO优先级?

很less。 善良是一种尽力而为的方式。 作为一个经验法则,我不太关心应用程序的performance如何, 关心他们可以执行多less。 这听起来可能倒退,但我有服务提供保证,以满足哪些对我来说更重要。

我希望有信心说:“即使在糟糕的一天,你的东西也会在X时期内完成”。 如果速度更快,那只是奖金。

我通常会开始通过生成一致的规范,如:

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

并提出要求如下:

  • 所有的networking请求应在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。

提供其他相互竞争的cgroups不要做任何愚蠢的事情,在我的服务交付中负载不那么重要,因为我知道如何为每个应用程序抛出CPU。

这种性质的控制群体仍然是最好的努力,但他们提供更多的控制,而不是善良和离子。