Linux没有(还)遵循POSIX.1标准,它说的是一renice对过程的影响“的过程中所有的系统范围线程”,因为根据并行线程(7)文档“线程不共用一个很好的价值。”
然而,有时,renice与给定进程相关的“一切”可能很方便(一个例子是 Apache 子进程及其所有线程)。所以,
renice所有线程?renice所有子进程?我正在寻找一个相当简单的解决方案。
我知道流程组有时会有所帮助,但是,它们并不总是符合我想要做的:它们可以包含更广泛或不同的流程集。
使用cgroupmanaged bysystemd也可能会有所帮助,但即使我有兴趣了解它,我也主要寻找“标准”解决方案。
编辑:还有,man (7) pthreads说“一个进程中的所有线程都放在同一个线程组中;线程组的所有成员共享同一个 PID”。那么,甚至有可能renice没有自己的 PID 吗?
来自man renice:
超级用户以外的用户只能改变他们拥有的进程的优先级,并且只能在 0 到 PRIO_MAX (20) [...]
所以,我可以renice向上处理我自己的进程(给它们较低的优先级)但永远不会向下:
$ renice 10 22316
22316 (process ID) old priority 0, new priority 10
$ renice 9 22316
renice: failed to set priority for 22316 (process ID): Permission denied
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我可以理解为什么普通用户不能将 nice 值设置为低于 0,但是为什么既然我可以将优先级降低到 10,我就不能再将它提高到 9?这有什么“安全原因”?我有权启动一个nice值为9的进程,那么为什么我不能将它重新设置为9呢?
编辑:我应该学会向下滚动。原来这被列为一个错误man renice:
BUGS
Non super-users can not increase scheduling priorities of their own
processes, even if they were the ones that decreased the priorities
in the first place.
Run Code Online (Sandbox Code Playgroud)
这更令人困惑。如果他们认为这种行为是一个错误,为什么不改变它呢?该 …
有人能告诉我指定nice级别和子进程之间的关系是什么吗?
举例来说,如果我有一个默认nice的0,我开始用一个脚本nice 5,这反过来又启动一些子进程(在这种情况下,关于平行20),什么是子进程的很好吗?
该nice命令允许您调整程序的调度优先级(“niceness”)。在我使用过的所有类 Unix 系统上,niceness 由一系列整数指定,其中 -20 是最有利的调度优先级,0 是默认值,19 是最不利的。
将 0 作为默认的 niceness 已经足够直观了,但是为什么选择 -20 和 19 作为范围的端点呢?为什么不是 -128 和 127,它们完全适合有符号的 8 位字节?或者为什么不从 -100 到 100,这对小数点的人来说更直观,或者类似但更符合人体工程学,-99 到 99?-20 到 19 范围是任意选择的,还是nice与最初与之交互的调度程序的内部结构有某种关系?(我知道今天没有这种关系,至少对于 Linux,它的调度程序使用 0 到 139 范围内的优先级。但是,我对 -20 到 19 范围的历史原因很感兴趣。)
我想以 -20 的不错值开始一个过程。这需要我使用类似的命令
sudo nice -n -20 matlab
Run Code Online (Sandbox Code Playgroud)
但是,这也以 root 身份启动 matlab。有没有办法让matlab成为非root用户?
我目前的做法是
sudo nice -n -20 sudo -u myusername matlab
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来像一个黑客。有没有直接的方法来做到这一点?
所有调度都是抢占式的:如果一个具有更高静态优先级的进程准备好运行,当前运行的进程将被抢占并返回到等待列表中等待它的静态优先级。
这会导致非常低的 nice 值 (+19) 在系统上有任何其他更高优先级负载时真正为进程提供很少的 CPU,并使高 nice 值 (-20) 将大部分 CPU 提供给需要它的应用程序
那么,更改 nice 值将如何影响程序的执行?它是否类似于 RT 调度(具有较高 nice 值的程序将中断具有较低 nice 值的程序)?
互联网上的所有信息都是如何使用nice,以及如何更改进程的优先级。没有链接解释具有不同优先级的进程究竟是如何工作的。我什至找不到源代码。
根据手册页和维基百科;nice范围从 -20 到 20。
但是,当我运行以下命令时,我发现某些进程具有非数值,例如 (-)。请参阅标题为“NI”的左起第六列。
(-) 的美好表示什么?
ps axl
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1 0 20 0 19356 1548 poll_s Ss ? 0:00 /sbin/init
1 0 2 0 20 0 0 0 kthrea S ? 0:00 [kthreadd]
1 0 3 2 -100 - 0 0 migrat S ? 0:03 [migration/0]
1 0 4 2 20 0 0 0 ksofti S ? 0:51 [ksoftirqd/0]
1 0 5 …Run Code Online (Sandbox Code Playgroud) 我有一个不那么重要的常规进程,但会消耗这么多的 CPU 能力,我还有一个非常重要的进程,但它大部分时间都处于空闲状态,但是当它找到工作时,它确实需要很高的计算能力
我试图与运行nice -20 ./low_priority_process和nice --20 ./high_priority_process,但仍然较低优先级占用CPU的显著量时高优先级的进程是需要的人,我怎么可以运行一个过程,真的会产生或使用时CPU供电另一个进程甚至自动挂起
在 systemd 服务文件中,可以设置以下与调度相关的选项(来自systemd.exec手册页,如果我错了,请纠正我):
Nice 为执行的进程设置默认的 nice 级别(调度优先级)。取一个介于 -20(最高优先级)和 19(最低优先级)之间的整数。有关详细信息,请参阅setpriority(2)。
这是熟悉的nice级别。由于最近的 linux 内核的“自动分组”功能,它的效果似乎在某种程度上被“颠覆”了。所以下面的选项可能是我真正想要设置的,以保持进程在我的桌面体验中表现良好。
CPUSchedulingPolicy 为执行的进程设置 CPU 调度策略。采用其他、批处理、空闲、fifo 或 rr 之一。有关详细信息,请参阅sched_setscheduler(2)。
CPUSchedulingPriority 设置已执行进程的 CPU 调度优先级。可用的优先级范围取决于所选的 CPU 调度策略(见上文)。对于实时调度策略,可以使用 1(最低优先级)和 99(最高优先级)之间的整数。有关详细信息,请参阅sched_setscheduler(2)。
CPUSchedulingResetOnFork 采用布尔参数。如果为 true,当执行的进程分叉时,提升的 CPU 调度优先级和策略将被重置,因此不会泄漏到子进程中。有关详细信息,请参阅sched_setscheduler(2)。默认为假。
我理解最后一个选项。我从前两个的解释中了解到,我可以选择一个调度策略,然后根据该策略,选择一个优先级。我并不完全清楚我应该为哪种任务选择什么。例如,为备份任务选择“空闲”是否安全(相对 CPU 密集型,因为重复数据删除),还是另一种更适合?
总的来说,我正在寻找对每项政策、每项优先事项和针对特定目的的适用性的易于理解的概述。与nice级别的交互也很有趣。
除了 CPU 调度,还有 IO 调度。我想这对应于ionice(如果我错了,请纠正我)。
IOSchedulingClass 为执行的进程设置 I/O 调度类。采用 0 到 3 之间的整数或字符串 none、realtime、best-effort 或 idle 之一。有关详细信息,请参阅ioprio_set(2)。
IOSchedulingPriority 设置已执行进程的 I/O 调度优先级。取一个介于 0(最高优先级)和 7(最低优先级)之间的整数。可用的优先级取决于所选的 I/O 调度类(见上文)。有关详细信息,请参阅ioprio_set(2)。
我们在这里看到与 CPU …
我需要执行一组更改了友好级别的“管道”命令。例子:
nice -n 15 command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)
在这种情况下,仅对 command1 将 niceness 更改为“15”。如何为整个命令集(command1、command2 和 command3)更改它?