CẬP NHẬT : Đã biến giải pháp của tôi thành một tập lệnh python độc lập.
Giải pháp này đã nhiều lần cứu tôi. Hy vọng rằng những người khác thấy nó hữu ích. Tập lệnh python này sẽ tìm thấy bất kỳ hạt nhân jupyter nào sử dụng nhiều hơn cpu_threshold
CPU và nhắc người dùng gửi một SIGINT
hạt nhân (KeyboardInterrupt). Nó sẽ tiếp tục gửi SIGINT
cho đến khi mức sử dụng cpu của nhân ở bên dưới cpu_threshold
. Nếu có nhiều nhân hoạt động sai, nó sẽ nhắc người dùng ngắt từng nhân (sắp xếp theo mức sử dụng CPU cao nhất đến thấp nhất). Xin gửi lời cảm ơn sâu sắc tới gcbeltramini vì đã viết mã để tìm tên của nhân jupyter bằng cách sử dụng jupyter api. Tập lệnh này đã được thử nghiệm trên MACOS với python3 và yêu cầu sổ ghi chép jupyter, yêu cầu, json và psutil.
Đặt tập lệnh vào thư mục chính của bạn và sau đó cách sử dụng sẽ giống như sau:
python ~/interrupt_bad_kernels.py
Interrupt kernel chews cpu.ipynb; PID: 57588; CPU: 2.3%? (y/n) y
Mã tập lệnh bên dưới:
from os import getpid, kill
from time import sleep
import re
import signal
from notebook.notebookapp import list_running_servers
from requests import get
from requests.compat import urljoin
import ipykernel
import json
import psutil
def get_active_kernels(cpu_threshold):
"""Get a list of active jupyter kernels."""
active_kernels = []
pids = psutil.pids()
my_pid = getpid()
for pid in pids:
if pid == my_pid:
continue
try:
p = psutil.Process(pid)
cmd = p.cmdline()
for arg in cmd:
if arg.count('ipykernel'):
cpu = p.cpu_percent(interval=0.1)
if cpu > cpu_threshold:
active_kernels.append((cpu, pid, cmd))
except psutil.AccessDenied:
continue
return active_kernels
def interrupt_bad_notebooks(cpu_threshold=0.2):
"""Interrupt active jupyter kernels. Prompts the user for each kernel."""
active_kernels = sorted(get_active_kernels(cpu_threshold), reverse=True)
servers = list_running_servers()
for ss in servers:
response = get(urljoin(ss['url'].replace('localhost', '127.0.0.1'), 'api/sessions'),
params={'token': ss.get('token', '')})
for nn in json.loads(response.text):
for kernel in active_kernels:
for arg in kernel[-1]:
if arg.count(nn['kernel']['id']):
pid = kernel[1]
cpu = kernel[0]
interrupt = input(
'Interrupt kernel {}; PID: {}; CPU: {}%? (y/n) '.format(nn['notebook']['path'], pid, cpu))
if interrupt.lower() == 'y':
p = psutil.Process(pid)
while p.cpu_percent(interval=0.1) > cpu_threshold:
kill(pid, signal.SIGINT)
sleep(0.5)
if __name__ == '__main__':
interrupt_bad_notebooks()