在jupyter/ipython笔记本中设置优先级/ niceness

5

有没有办法在Jupyter Notebook中降低CPU优先级?例如,在计算服务器上运行长时间参数搜索时,可以将该笔记本内的优先级设定为低于其他人实时工作的笔记本。

2个回答

3
也许设置你的python进程的优先级就足够了?因为可能启动的进程会继承这个优先级。 如果可以,下面的代码可能会有帮助:
import psutil
psutil.Process().nice(19)# if on *ux
psutil.Process().nice(psutil.IDLE_PRIORITY_CLASS)# if on win

1

我猜您可以调整整个服务器的优先级(不知道如何调整特定笔记本电脑的优先级)。如果其他笔记本电脑在不同的笔记本电脑服务器进程上运行,您可以从子shell中执行此操作:

---------------------------------------------------------------
  !for pid in `pgrep -f jupyter`; do { renice -20 $pid; }; done
---------------------------------------------------------------

9721 (process ID) old priority 19, new priority -20
12449 (process ID) old priority 19, new priority -20
25502 (process ID) old priority 19, new priority -20

或者,如果您想使用Python完成此操作,请先获取正在运行的服务器列表:

>>> from notebook import notebookapp
>>> servers = list(notebookapp.list_running_servers())
>>> servers
[{'url': 'http://localhost:8888/', 
  'base_url': '/', 
  'token': '5ea29b3...7e1fba5331ae', 
  'secure': False, 
  'pid': 9721, 
  'hostname': 'localhost', 
  'password': False, 
  'port': 8888, 
  'notebook_dir': '/home/paulos/work'
}]

如果需要,筛选出您想要的列表。

pids = [_['pid'] for _ in servers if meets_condition(_)]

然后调用 setpriority:
>>> from ctypes import cdll
>>> libc = cdll.LoadLibrary("libc.so.6")
>>> pids = [_['pid'] for _ in servers]
>>> for pid in pids:
        print("old priority for PID", pid, "is", libc.getpriority(0, pid))
        libc.setpriority(0, pid, 20)
        print("new priority for PID", pid, "is", libc.getpriority(0, pid))

old priority for PID 9721 is 0
new priority for PID 9721 is 19

renice似乎需要sudo权限。你有什么解决办法吗? - waterproof
有趣的是,我认为你应该能够增加自己进程的“niceness”,但如果你的操作系统不允许,你别无选择,只能使用特权升级。您可以尝试为此用户列入renice命令白名单(以不需要sudo密码),并使用带有sh模块的子shell,类似于sh.sudo("renice", niceness, pid) - Paulo Scardine
谢谢。我只打算继续使用Python选项,因为它似乎运行得很好。 - waterproof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接