我正在尝试将某些流程优先于其他流程。这是我正在使用的主要脚本,嘲笑CPU密集型进程:
simple_app.py
import os
from multiprocessing import Pool, cpu_count
def f(x):
while True:
x*x
if __name__ == '__main__':
cpu = cpu_count()
pid = os.getpid()
print('-' * 20)
print('pid: {}'.format(pid))
print('Utilizing {} cores'.format(cpu))
print('Current niceness: {}'.format(os.nice(0)))
print('-' * 20)
pool = Pool(cpu)
pool.map(f, range(cpu))
我的下一步是生成大量(具体地说,在本例中是9个(运行以下代码的进程:
simple_runner.sh
# Start with lowest priority
nice -19 python3 simple_app.py &
# Much higher priority
nice -0 python3 simple_app.py &
# Lower priority spawned
nice -10 python3 simple_app.py &
# Higher priority again
nice -7 python3 simple_app.py &
# Highest priority yet
nice -1 python3 simple_app.py &
# Highest priority yet
nice -0 python3 simple_app.py &
# Highest priority yet
nice -0 python3 simple_app.py &
# Highest priority yet
nice -0 python3 simple_app.py &
# Highest priority yet
nice -0 python3 simple_app.py
然后,我监视每个进程,报告子CPU利用率,在这里:
process_reporting_server.py
import os
import time
import argparse
import pprint
from multiprocessing import Pool, cpu_count
import psutil
def most_recent_process_info(pid, interval=0.5):
while True:
proc = psutil.Process(pid)
children_cpu_percent = [child.cpu_percent(interval) for child in proc.children()]
children_cpu_percent_mean = sum(children_cpu_percent) / len(children_cpu_percent) if children_cpu_percent else -1.
print('Time: {}, PID: {}, niceness: {}, average child CPU percent: {:.2f}'.format(
time.ctime(),
pid,
proc.nice(),
children_cpu_percent_mean)
)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-p', '--pids', type=str, help='Whitespace-delimited string containing PIDs', dest='pids')
parser.add_argument('-s', '--seconds', type=int, help='Seconds to sleep', default=10, dest='seconds')
args = parser.parse_args()
pids = list(map(int, args.pids.split()))
pool = Pool(len(pids))
pool.map(most_recent_process_info, pids)
我想看看被赋予较低精细度值的进程是否真的被优先考虑。所以我要做的是:
运行simple_app_runner.sh
:
$ ./simple_app_runner.sh
--------------------
pid: 45036
Utilizing 8 cores
Current niceness: 0
--------------------
--------------------
pid: 45030
Utilizing 8 cores
Current niceness: 19
--------------------
--------------------
pid: 45034
Utilizing 8 cores
Current niceness: 1
--------------------
--------------------
pid: 45032
Utilizing 8 cores
Current niceness: 10
--------------------
--------------------
pid: 45033
Utilizing 8 cores
Current niceness: 7
--------------------
--------------------
pid: 45037
Utilizing 8 cores
Current niceness: 0
--------------------
--------------------
pid: 45038
Utilizing 8 cores
Current niceness: 0
--------------------
--------------------
pid: 45031
Utilizing 8 cores
Current niceness: 0
--------------------
--------------------
pid: 45035
Utilizing 8 cores
Current niceness: 0
--------------------
然后,这是报告:
$ python3 process_reporting_server.py -p '45036 45030 45034 45032 45033 45037 45038 45031 45035'
稍微清理一下,用熊猫进行分析,我们发现在五分钟的时间间隔内,指定的精细度似乎无关紧要:
>>> df.groupby('nice')['mean_child_cpu'].max()
nice
0.0 10.50
1.0 9.75
7.0 8.28
10.0 8.50
19.0 21.97
我是不是完全错过了什么?为什么我指定的精细度似乎不会影响CPU资源的优先级?
我认为您没有遗漏任何内容。我的经验是,最重要的过程是第一位的,其他人都在为剩下的东西而战。如果只将一个进程重新设置为-1,并将其余进程保留为-0,则可能会得到相同的结果(对于像这样的纯cpu绑定进程(。
这是因为人们通常真的不希望优先级像我们有时期望的那样严格。就像现在我发布这篇文章时,我的平均负载超过200,还有一堆重新冻结(更高优先级(的流程在进行。如果所有这些进程都是真正的猪,那就不太"好"了。我喜欢我仍然可以在所有cpu负载的情况下使用我的浏览器。
有一次,我觉得你可以改变优先级排队,至少在一些unix上是这样。我隐约记得我的一些客户要求我们这样做,我们(系统管理员团队(说"不是一个好主意",客户要求我们做,我们做",然后客户要求我们撤销它。调度是一项棘手的业务。
以下是封面下发生的事情的介绍:http://www.cs.montana.edu/~chandrima.sarkar/AdvancedOS/SchedulingLinux/index.html请特别注意底部的部分——"算法的伸缩性不好",这与我的第一段密切相关。