리눅스 Real-Time Scheduling for user processes, Red Hat Enterprise Linux 7 및 8에서 cgroups v1, systemd 및 SCHED_RR을 사용하여 사용자 프로세스에 대한 실시간 스케줄링을 허용하도록 사용자 슬라이스를 구성하는 방법에 대한 단계별 가이드입니다
리눅스 사용자 슬라이스에 대한 실시간 스케줄링 구성
리눅스 사용자 슬라이스에 대한 실시간 스케줄링은 사용자 슬라이스에 있는 프로세스에 대해 실시간 스케줄링을 적용하는 것입니다. 실시간 스케줄링은 특정 프로세스에게 CPU 사용 우선권을 부여하는 방식으로, 실시간 애플리케이션의 제한된 시간 내 처리를 보장하기 위해 사용됩니다.
리눅스에서 사용자 슬라이스는 사용자의 프로세스 집합을 그룹화하는 데 사용되는 개념입니다. 사용자 슬라이스는 각각 고유한 CPU 할당량을 가지고 있으며, 실시간 스케줄링을 구성하면 사용자 슬라이스에 있는 프로세스가 전체 시스템 CPU의 특정 비율을 사용할 수 있습니다.
사전 조건
- 사용자가 실시간 프로그램을 실행할 수 있는 능력이 있도록 확인합니다. 이를 위해 주로 사용자에 대한
/etc/security/limits.conf
에rtprio
제한을 설정해야 합니다. 예를 들어:
# grep testuser /etc/security/limits.conf
testuser - rtprio 90
구성 절차
user.slice
유닛을 구성하기 위한 userslice-config.service
유닛을 생성합니다.
# 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
유닛의 드랍인을 생성합니다.
# 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를 다시 로드합니다.
# systemctl daemon-reload
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
Setting scheduling policy to SCHED_RR and priority 90
OK, sleeping indefinitely until the process is killed
^C
원인
- CPU Accounting이 활성화되면 systemd에서 관리하는 모든 cgroup에 대해
cpu.rt_runtime_us
cgroup 속성이 0으로 설정되어 실시간 프로그램 실행이 방지됩니다.
추가 정보
- 솔루션에는 실시간 스케줄링을 사용하는 프로세스에 대한 예제 소스 코드(
rt_minimal.c
)가 포함되어 있습니다.
이러한 지침을 환경 및 요구 사항에 맞게 조정하십시오.