Systemd
系統任務和限制
首先:請不要將此問題標記為 Stack Overflow(是的,Python 是上下文的主要部分,但我的問題最終是關於 Systemd)
我目前正在編寫一個 Python 程序,該程序將位於伺服器上並通過 Systemd 進行控制(啟用,以便在伺服器出現故障時重新啟動等)。我擔心的是“任務”部分在
systemctl status
不斷增加。... Active: active (running) since Wed 2020-08-26 18:31:12 UTC; 14min ago Main PID: 1657 (python3) Tasks: 178 (limit: 637) <-- ...
推斷此資訊,在達到限制之前將需要 50 多分鐘(從服務開始)。我的問題不是“為什麼我的程式碼被破壞”、“我如何提高這個限制”之類的。相反,我的問題是:Systemd 認為任務是什麼以及達到限制時會發生什麼(發送信號以終止服務等)?
有了這些資訊,我希望了解為什麼我的 Python 腳本(看起來是)任務數量線性增加(並隨後解決了這個問題)。
systemd.resource-control(5)給了我們一個提示:
TasksMax=N Specify the maximum number of tasks that may be created in the unit. This ensures that the number of tasks accounted for the unit (see above) stays below a specific limit. This either takes an absolute number of tasks or a percentage value that is taken relative to the configured maximum number of tasks on the system. If assigned the special value "infinity", no tasks limit is applied. This controls the "pids.max" control group attribute. For details about this control group attribute, see Process Number Controller[7]. The system default for this setting may be controlled with DefaultTasksMax= in systemd-system.conf(5).
所以這個限制是基於“pids.max”的。每當您的程序呼叫
fork()
或clone()
. 在 python 的上下文中,有一個os.fork()
可能呼叫同名的系統呼叫。我不確定在哪些其他情況下python
會進行這些系統呼叫,但是如果您沒有產生數百個程序,那麼我希望它與產生的執行緒數有關。手冊頁引用了一些很好的文獻:$$ 7 $$程序號控制器