systemd 없이 시작하면 systemd 서비스가 CPU를 100% 사용합니다.

systemd 없이 시작하면 systemd 서비스가 CPU를 100% 사용합니다.

저는 최신 업데이트가 포함된 Debian Jessie를 사용하고 있습니다. 서버가 시작될 때 스크립트를 실행하기 위해 systemd 서비스를 만들었습니다. 구성은 다음과 같습니다.

[Unit]
Description=(my description)

[Service]
ExecStart=/usr/bin/bot
Restart=restart-always

[Install]
WantedBy=multi-user.target

/usr/bin/botMono 실행 파일을 실행하는 스크립트입니다. 여기에는 다음이 포함됩니다:

#!/bin/bash
(cd /path/to/my/executable && mono bot.exe)

(여기서 경로를 바꿨는데 스크립트의 경로가 정확합니다.)

/usr/bin/bot스크립트를 정상적으로(내 터미널에서만) 실행하면 /usr/bin/bot예상대로 작동합니다. topCPU의 0~20%를 사용한다고 보고하며 이는 정상적인 현상입니다. 그런데 로 시작하면 service bot start항상 topCPU를 100% 이상 사용한다고 나옵니다.

두 경우 모두 bot예상대로 작동합니다 .

CPU 사용량의 이렇게 큰 차이를 어떻게 설명할 수 있습니까?

감사해요.

답변1

문제는 systemd에 있지 않습니다.

Systemd는 표준 입력(=/dev/null) 없이 프로세스를 실행합니다. 모든 시스템 호출은 read()즉시 완료됩니다(일반 표준 입력을 사용하고 read()새 데이터가 도착할 때까지 차단됩니다). 일반적으로 read()완료되지 않은 루프를 호출하면 엄청난 CPU 사용량이 발생합니다. 이를 확인하려면 실행 중인 프로세스에 연결을 사용해 보십시오 strace -p <pid>.

프로세스는 표준 입력 없이 실행되도록 조정하거나 제안된 screen명령과 같은 일부 래퍼를 사용해야 합니다.nohup

답변2

botscreen나는 다음과 같이 내 것을 아래에 넣어 "고정"했습니다 .

[Unit]
Description=(my description)

[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/screen -dmS bot /usr/bin/bot
Restart=restart-always

[Install]
WantedBy=multi-user.target

내 프로세스를 화면에 표시하면 높은 CPU 사용량이 해결된 이유는 모르겠지만, 작동했습니다.

답변3

@niziak의 솔루션에 따르면 입력이 차단됩니다. 제 경우에는 StandardInput=tty[서비스]를 추가해서 해결되었습니다. 출력을 /dev/tty12의 (사용되지 않은) 콘솔로 리디렉션했습니다.

내 [서비스] 섹션:

[Service]
ExecStart=/usr/local/bin/vtclock -1  -c| -f /tmp/ntpstatus
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=simple
User=vtclock
StandardInput=tty
StandardOutput=tty
StandardError=null
TTYPath=/dev/tty12 

(OS = Ubuntu 16.04.3 LTS, systemd 서비스를 처음 시도했습니다)

답변4

C#/.NET Core에서 콘솔 애플리케이션을 개발한 경우 다음을 사용하여 콘솔을 계속 실행하지 마세요.

Console.Read();

Linux에서 시스템 서비스로 애플리케이션을 실행하면 CPU 사용량이 100%가 되기 때문입니다.

대신 다음을 사용하십시오.

while (true) { Console.ReadKey(); }

나는 같은 문제를 가지고있다.

관련 정보