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时期内完成”。 如果速度更快,那只是奖金。
我通常会开始通过生成一致的规范,如:
并提出要求如下:
提供规范是真实的,然后我不用虚拟化就可以实现这些目标,使用更为有效的控制组方法。
通过控制组,我可以为资源分配提供相当可靠的服务级别保证,使应用程序可以在指定的边界内运行。 这意味着,即使在负载下的系统上,我也可以保证相关应用程序的资源可用性,并保证在同一个盒子上的其他应用程序的空间!
如果我们拿你的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。
这种性质的控制群体仍然是最好的努力,但他们提供更多的控制,而不是善良和离子。