실시간 스케줄링은 고정밀 및 낮은 지연이 필요한 일부 프로세스에게 중요합니다. 이러한 프로세스를 서비스로 실행하는 것은 흔하지만 일반 사용자가 사용자 세션에서 실행해야 하는 경우도 있습니다. Red Hat Enterprise Linux (RHEL)은 사용자 프로세스에 대한 실시간 스케줄링을 허용하도록 User slice를 구성하는 솔루션을 제공합니다.
프로세스에 대한 실시간 스케줄링을 활성화 문제 발생
문제는 사용자가 사용자 세션에서 실행되는 프로세스에 대한 실시간 스케줄링을 활성화하는 데 있습니다. 기본적으로 사용자가 실행하는 프로그램은 CPU Accounting이 활성화되면 Real-Time 할당이 없는 user.slice
CPU cgroup에서 실행됩니다.
실시간 프로그램 스케줄링에 맞게 구성
이 문제를 해결하기 위해 다음 단계를 따라 user.slice
유닛을 실시간 스케줄링에 맞게 구성하세요.
전제 조건
사용자가 실시간 프로그램을 실행할 수 있는 능력이 있어야 합니다. 이는 보통 해당 사용자에 대한 /etc/security/limits.conf
에서 rtprio
제한을 구성하는 것을 포함합니다.
# grep testuser /etc/security/limits.conf
testuser - rtprio 90
구성 단계
userslice-config.service
유닛 생성:user.slice
유닛을 구성하는 서비스 유닛을 만듭니다. 이 유닛은 CPU cgroup에 대한 실시간 할당을 설정합니다.
# cat > /etc/systemd/system/userslice-config.service << EOF
[Unit]
BindsTo=user.slice
After=user.slice
[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/sbin/sysctl -n kernel.sched_rt_runtime_us > /sys/fs/cgroup/cpu/user.slice/cpu.rt_runtime_us"
RemainAfterExit=yes
EOF
user.slice
유닛을 위한 Drop-In 구성 생성:user.slice
유닛을 자동으로 구성 서비스를 가져오도록 하기 위해user.slice
유닛을 위한 drop-in 구성을 만듭니다.
# mkdir -p /etc/systemd/system/user.slice.d
# cat > /etc/systemd/system/user.slice.d/config.conf << EOF
[Unit]
Requires=userslice-config.service
[Slice]
CPUAccounting=yes
EOF
systemd
다시로드: 변경 사항을 적용하려면systemd
를 다시로드합니다.
# systemctl daemon-reload
user.slice
유닛 재시작 또는 시스템 재부팅: 변경 사항을 활성화하려면user.slice
유닛을 다시 시작하거나 시스템을 재부팅합니다.
# reboot
- 사용자의 실시간 할당 확인: 사용자로 로그인한 후 (
testuser
를 예로 들었습니다), 사용자가 이제 실시간 할당을 가지고 있는지 확인합니다.
$ grep "cpu,cpuacct" /proc/self/cgroup
8:cpu,cpuacct:/user.slice
$ cat /sys/fs/cgroup/cpu/user.slice/cpu.rt_runtime_us
950000
$ ./rt_minimal
스케줄링 정책을 SCHED_RR 및 우선순위 90으로 설정
OK, 프로세스가 종료될 때까지 무기한으로 대기 중
^C
실시간 프로그램 실행 방지
CPU Accounting이 활성화되면 systemd
에 의해 관리되는 모든 cgroup에 대해 cpu.rt_runtime_us
cgroup 속성이 0으로 설정되어 실시간 프로그램 실행이 방지됩니다.
결론
이러한 단계를 따르면 Red Hat Enterprise Linux에서 사용자 프로세스에 대한 실시간 스케줄링을 구성할 수 있습니다. 이를 통해 일반 사용자도 사용자 세션에서 실시간 요구를 충족시키는 프로세스를 실행할 수 있습니다.