Systemd는 시작 시 예기치 않게 오랜 시간 동안 서비스를 활성화합니다.

Systemd는 시작 시 예기치 않게 오랜 시간 동안 서비스를 활성화합니다.

systemd-analyze plot시스템 시작 시 서비스를 실행하는 데 걸리는 시간을 분석하는 데 사용합니다 . update_sysfs_cpu_permissions.service놀라울 정도로 오랜 시간(755ms)이 걸리고 대부분의 시간을 활성 상태가 아닌 활성화 상태에서 보내는 매우 간단한 원샷 서비스가 있습니다 .

서비스 파일 내용:

# /etc/systemd/system/update_sysfs_cpu_permissions.service
[Unit]
Description=Give the group `cpu_tuners` permissions to write to the files /sys/.../cpufreq/policy*/* if the `root` user can write to them

[Service]
Type=oneshot
User=root
# For every file of mode rw-r--r-- change mode to rw-rw-r-- and owners to root:cpu_tuners (instead of root:root)
# mindepth and maxdepth are to identify we only want to change files inside policy* (though, it's not a very strong constraint and could be replaced with something stricter)
ExecStart=/usr/bin/find /sys/devices/system/cpu/cpufreq/ -mindepth 2 -maxdepth 2 -type f -perm 644 -exec /bin/sh -c 'chown root:cpu_tuners "$1"; chmod 664 "$1"' _ {} \;

[Install]
WantedBy=multi-user.target

서비스를 수동으로 실행하는 데는 시간이 많이 걸리지 않습니다.

$ time sudo systemctl start update_sysfs_cpu_permissions.service

real    0m0.155s
user    0m0.019s
sys 0m0.010s
$

전체 줄거리:https://i.stack.imgur.com/EPh93.jpg

서비스가 활성화된다는 것은 무엇을 의미합니까? 시작 시 실행하는 데 시간이 오래 걸리는 이유는 무엇입니까?

답변1

시작 시 실행하는 데 시간이 오래 걸리는 이유는 무엇입니까?

부팅 프로세스(예: bootchart)를 더 자세히 추적하지 않고서는 말할 수 없지만내 생각엔시작하는 동안 CPU를 놓고 다른 서비스와 경쟁합니까?디스크 입출력,/bin/find, /bin/sh, /bin/chmod실행 /bin/chown파일을 디스크에서 메모리로 로드해야 하기 때문입니다 .

또한 대부분의 시간은 활성 상태가 아닌 활성화 상태에서 소요됩니다.

이는 의도적으로 설계된 것입니다. Type=oneshot 서비스에는아니요기본값은 "활성" 상태입니다. Type=oneshot 서비스의 전체 목적은 모든 ExecStart=가 실행될 때 "활성화"되어 ExecStart= 명령이 완료될 때까지 "시작" 작업이 완료되지 않도록 하는 것입니다.

서비스가 활성화된다는 것은 무엇을 의미합니까?

"활성화됨"은 장치가 호출되었지만 아직 종속성 및 순서 지정 목적으로 "준비"되지 않았음을 의미합니다. 예를 들어, 데이터베이스 서버 데몬을 사용하는 경우 시작, 소켓 설정, 로그 재생 등에 약간의 시간이 걸릴 수 있습니다. 이 시간 동안 프로세스는 실행 중이지만 아직 클라이언트 연결을 허용하지 않습니다. 즉, 다른 서비스에서 이를 사용하려고 시도한다는 의미입니다. 실패할 것이다.

따라서 시작 작업이 실행되면기다리다종속성을 계속 시작하기 전에 서비스가 "활성화" 상태를 벗어나도록 합니다(있는 경우). 예를 들어 httpd.service는 대기열에서 대기하는 반면 php-fpm.service는 여전히 "활성" 상태입니다.

  • Type=forking의 경우 "활성화"는 systemd가 프로세스 "데몬"을 볼 때까지 지속됩니다(전통적인 분기 또는 이중 분기 방식 - 보다 구체적으로 초기 상위 프로세스까지 지속됨).그만두다, 그 자식이 인계 받도록 하세요).

  • Type=notify의 경우 프로세스가 지정된 소켓이나 파이프를 통해 systemd에 "READY=1" 메시지를 보낼 때까지 "활성화"가 계속됩니다.

  • Type=simple의 경우 기본적으로 "활성화" 상태가 없습니다(사람들은 "Type=simple이 systemd를 사용하는 실제 방법입니다"라고 불평할 때 이를 잊어버리는 경향이 있습니다).

  • Type=oneshot의 경우 귀하의 경우와 같이 "활성화"하십시오.서비스가 작업을 완료할 때까지 계속됩니다.즉, ExecStart=의 모든 명령이 완료될 때까지입니다.

(ExecStartPost=는 Type=simple의 경우에도 "활성화" 상태를 확장할 수 있으며 일부 작업에 사용할 수 있습니다.~ 해야 하다서비스가 시작된 후 실제로 사용할 준비가 되기 전에 완료됩니다. )

따라서 이 예에서 "활성화"를 유지한다는 것은 다른 부팅 서비스가 장치를 나열하는 경우 After=/bin/find가 완료되고 권한이 실제로 업데이트될 때까지 올바르게 지연된다는 의미입니다.

User=root를 제거해 보십시오. 제대로 문서화되지 않은 부작용이 있을 수 있습니다.

사용자 설정 =아니요PAMName=은 UID/GID만 변경합니다.

관련 정보