우선: 이 질문에 스택 오버플로라는 태그를 지정하지 마십시오. (예, Python은 컨텍스트의 주요 부분이지만 제 질문은 궁극적으로 Systemd에 관한 것입니다.)
저는 현재 서버에 앉아서 Systemd를 통해 제어되는 Python 프로그램을 작성 중입니다(활성화되면 서버가 다운되면 다시 시작됩니다). 내 관심사는 "작업" 섹션이 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 스크립트가 작업 수가 선형적으로 증가하는 이유를 이해하고 문제를 해결하기를 바랍니다.
답변1
systemd.resourcecontrol(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"를 기반으로 합니다. 프로세스가 호출할 때마다 PID가 생성됩니다.fork()
또는clone()
. Python의 맥락에는os.fork()
동일한 이름의 시스템 호출을 호출할 수 있습니다. 이러한 시스템 호출 이 어떤 다른 상황에서 수행되는지는 잘 모르겠지만 python
수백 개의 프로세스를 생성하지 않는 경우 생성된 스레드 수와 관련이 있을 것으로 예상됩니다.
매뉴얼 페이지에는 몇 가지 좋은 문헌이 인용되어 있습니다.[7] 프로세스 번호 컨트롤러
답변2
스크립트에 다음 명령을 추가하면 됩니다.systemctl restart yourproject.service
설명: 을 사용하면 systemctl restart
프로젝트에 항상 새로운 작업이 있습니다.