Simulation is ...

Virtual = Real

Flight Sim 자세히보기

ㆍ Linux

rtkit, RealtimeKit, rtkit-daemon, 실시간 정책 및 Watchdog 데몬

FlightSim 2023. 7. 20. 13:40
320x100

RealtimeKit은 요청시 사용자 프로세스/쓰레드의 스케쥴링 정책을 SCHED_RR (실시간 스케쥴링 모드)로 변경하는 D-Bus 시스템 서비스. 일반 사용자 프로세스가 실시간 스케쥴링을 사용할 수 있도록 하는 보안 메커니즘으로 사용하기 위한 것. rtkit-daemon이라는 서비스는 실시간 프로세스 강등 역할로 RHEL 6.5 이상의 서버에서 불필요한 작업이라면 masking 으로 비활성화 한다.

메세지 로그에 기록된 내용 예시 :
rtkit-daemon[3442] : The canary thread is apparently starving. Taking action.
rtkit-daemon[3442] : Demoting known real-time threads.
rtkit-daemon[3442] : Successfully demoted thread 3440 of process 3440 (/usr/bin/pulseaudio)
rtkit-daemon[3442] : demoted 1 threads.

rtkit-daemon 데몬으로 인한 부팅 fail 이슈 해결방법 :
RHEL 6.2 이전 서버의 재부팅 작업시 rtkit-daemon의 Call Trace 관련 부팅 fail 발생 가능성으로 해당 커널 버전에서 Intel CPU에 대한 버그 확인됨. RHEL 6.5 - kernel-2.6.32-431.el6 혹은 그 이상의 커널 업데이트를 통해 이슈 해결.

[관련 문서]
Servers with Intel® Xeon® Processor E5, Intel® Xeon® Processor E5 v2, or Intel® Xeon® Processor E7 v2 and certain versions of Red Hat Enterprise Linux 6 kernels become unresponsive/hung or incur a kernel panic
    https://access.redhat.com/solutions/433883

masking 방법 커맨드 : 
#> systemctl stop ktkit-daemon
#> systemctl disable ktkit-daemon
#> systemctl mask ktkit-daemon
#> systemctl --global disable pulseaudio.{service.socket}
#> systemctl --global mask pulseaudio.{service.socket}

https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/6/html/6.4_technical_notes/rtkit

 

REALTIMEKIT 실시간 정책 및 Watchdog 데몬

Git : https://github.com/heftig/rtkit

Notes:
        RealtimeKit은 D-Bus 시스템 서비스로
        SCHED_RR에 대한 사용자 프로세스/스레드의 스케줄링 정책
        (예: 실시간 스케줄링 모드) 요청 시. 하기위한 것입니다
        실시간 스케줄링을 허용하는 보안 메커니즘으로 사용
        일반 사용자 프로세스에서 사용할 수 있습니다.

        RealtimeKit은 나눠줄 때 엄격한 정책을 시행합니다.
        사용자 스레드에 대한 실시간 보안:

        * RLIMIT_RTTIME이 설정된 클라이언트만 RT 스케줄링을 받습니다.

        * RT 스케줄링은 다음이 있는 프로세스에만 전달됩니다.
          SCHED_RESET_ON_FORK는 스케줄링이
          설정이 하위 프로세스로 '누설'될 수 없으므로
          'RT 포크 폭탄'은 RLIMIT_RTTIME을 우회하는 데 사용할 수 없습니다.
          시스템을 종료합니다.

        * 사용자가 제어할 수 있는 모든 리소스에 제한이 적용됩니다.
          RT를 요청할 수 있는 사용자, 프로세스, 스레드의 최대 수
          동시에 일정을 잡습니다.

        * 제한된 수의 스레드만 RT로 만들 수 있습니다.
          특정 시간 프레임.

        * 클라이언트 인증은 PolicyKit으로 확인

        RealtimeKit을 사용하여 높은 우선 순위를 전달할 수도 있습니다.
        사용자 프로세스에 대한 스케줄링(즉, 음수 나이스 레벨).

        이 선험적 정책 시행 외에도 RealtimeKit
        또한 사후 정책 시행을 제공합니다.
        자동으로 강등시키는 카나리아 기반 워치독 포함
        SCHED_OTHER에 대한 모든 실시간 스레드는 시스템이
        위에서 지적한 논리에도 불구하고 과부하. 이상
        카나리아 기반 RT 워치독에 대한 정보는 다음을 참조하십시오.
        아래의 감사 섹션.

        실시간 일정을 *안전하게* 관리하는 임무에서
        RealtimeKit은 권한이 없는 사용자로 실행되며 기능을 사용합니다.
        보안 영향을 최소화하기 위한 자원 제한 및 chroot().

        RealtimeKit은 임베디드 또는 서버 사용에 거의 사용되지 않습니다.
        대신 RLIMIT_RTPRIO를 사용하십시오.

Why:
        실시간 예약 권한이 있는 프로세스가
        비지 루프는 전체 시스템을 정지시킬 수 있습니다. 확인하십시오
        그러한 폭주 프로세스는 이것을 할 수 없습니다. RLIMIT_RTTIME은
        도입. 그러나 프로세스 당 제한이기 때문에 쉽게
        포크 폭탄과 바쁜 루프를 결합하여 우회합니다.

        RealtimeKit은 특정 스레드에 RT 스케줄링을 전달합니다.
        그것을 요청하십시오 -- 그러나 SCHED_RESET_ON_FORK로 인해 그들에게만
        이것이 '누설'되지 않을 것이라고 확신할 수 있습니다.

        RLIMIT_RTPRIO와 달리 RealtimeKit 로직은 다음을 확인합니다.
        일정 수의 스레드만 실시간으로 만들 수 있고,
        사용자별, 프로세스별 및 시간 간격별.


클라이언트:
        실시간 스케줄링 클라이언트를 사용하려면
        에서 액세스할 수 있는 작은 D-Bus 인터페이스로 그렇게 요청하십시오.
        객체로서의 org.freedesktop.RealtimeKit1 인터페이스
        서비스의 /org/freedesktop/RealtimeKit1
        org.freedesktop.RealtimeKit1:

                void MakeThreadRealtime(u64 thread_id, u32 priority);

                void MakeThreadHighPriority(u64 thread_id, s32 priority);

        스레드 ID는 다음에 의해 반환되는 커널 tid로 전달되어야 합니다.
        pthread_t가 아닌 gettid()! (제발
        gettid()는 glibc에서 사용할 수 없습니다.
        syscall()을 사용하여 수동으로 구현하십시오. 참조를 참조하십시오
        자세한 내용은 클라이언트 구현을 참조하십시오.)
        
        진행 중인 쓰레드를 realtime/high 우선순위로 승격 가능
        DBUS 호출을 할 다른 프로세스의 우선 순위,
        사용:
        
                void MakeThreadRealtimeWithPID(u64 process, u64 thread_id, u32 priority);

                void MakeThreadHighPriorityWithPID(u64 process, u64 thread_id, s32 priority);

        여기서 process는 스레드 thread_id가 있는 프로세스의 PID입니다.
        
        클라이언트의 BSD 라이센스 참조 구현은 다음과 같습니다.
        패키지의 일부로 rtkit.[ch]에서 사용할 수 있습니다. 당신은 복사할 수 있습니다
        원하는 경우 소스에 넣습니다. 그러나 얼마나 간단한지
        D-Bus 인터페이스는 직접 구현하도록 선택할 수 있습니다.
        클라이언트 구현.

        다음을 사용하여 실시간 스케줄링을 획득하는 것이 좋습니다.
        sched_setsheduler() 먼저 RLIMIT_RTPRIO가 있는 시스템
        설정되어 지원될 수 있습니다.

        다음은 참조 구현을 사용하는 예입니다.  아래 내용을

<snip>
                struct sched_param p;
                memset(&p, 0, sizeof(p));
                p.sched_priority = 3;
                sched_setscheduler(0, SCHED_RR|SCHED_RESET_ON_FORK, &p);
        </snip>

        이것으로 바꾼다 :

        <snip>
                struct sched_param p;
                memset(&p, 0, sizeof(p));
                p.sched_priority = 3;
                if (sched_setscheduler(0, SCHED_RR|SCHED_RESET_ON_FORK, &p) < 0
                        && errno == EPERM)
                        rtkit_make_realtime(system_bus, 0, p.sched_priority);
        </snip>

        물론 더 적절한 오류 검사를 추가하십시오! 또한,
        SCHED_RESET_ON_FORK가 원인일 때 일반 SCHED_RR로 되돌아갑니다.
        EINVAL이 권장됩니다).

악마:

        데몬은 D-Bus를 통해 처음 사용할 때 자동으로 시작됩니다.
        시스템 버스 활성화.

        현재 데몬은 구성 파일을 읽지 않습니다.
        그러나 명령줄 매개변수로 구성할 수 있습니다. 아래를
        편집할 수 있습니다

        /usr/share/dbus-1/system-services/org.freedesktop.RealtimeKit1.service

        설정하기 위해 실행

        /usr/libexec/rtkit-daemon --help

        지원되는 매개변수 및 해당 매개변수에 대한 간략한 개요를 보려면
        기본값. 그들 중 다수는 그 의미가 명백해야 합니다. 을 위한
        나머지는 아래를 참조하십시오.

        --max-realtime-priority= 최대값을 지정하는 데 사용할 수 있습니다.
        클라이언트가 얻을 수 있는 실시간 우선 순위
        RealtimeKit. 이 값은 다음보다 작아야 합니다.
        --our-realtime-priority=에 전달된 값.

        --our-realtime-priority=는 실시간을 지정하는 데 사용할 수 있습니다.
        데몬 자체의 우선 순위. 이 우선 순위에 유의하십시오.
        클라이언트를 처리하는 동안 매우 짧은 시간 동안만 사용됩니다.
        요구. 일반적으로 데몬은
        실시간 스케줄링 정책. 실시간 우선순위 전달
        사용자에게 전달되는 값은 이 값보다 낮아야 합니다. (위 참조).

        --min-nice-level= 최소 nice를 지정하는 데 사용할 수 있습니다.
        클라이언트가 RealtimeKit을 통해 획득할 수 있는 수준입니다.

        --our-nice-level=은 nice 레벨을 지정하는 데 사용할 수 있습니다.
        데몬 자체가 대부분의 시간을 사용합니다.
        처리 요청, 위 참조). 아마 좋은 생각입니다
        이 값을 작은 양수 값으로 설정하여
        시스템이 이미 과부하되어 추가 RT 스케줄링을 전달하고 있습니다.
        조금 지연됩니다.

        --rttime-usec-max=는 RLIMIT_RTTIME을 제어하는 ​​데 사용할 수 있습니다.
        고객이 선택하기 전에 최소한의 가치를 선택해야 합니다.
        RealtimeKit을 통해 RT 스케줄링을 획득합니다.

        --users-max= RT를 획득할 수 있는 사용자 수를 지정합니다.
        그들 중 하나 또는 여러 개에 대해 동시에 스케줄링
        프로세스.

        --processes-per-user-max= 사용자당 프로세스 수를 지정합니다.
        사용자는 RT 스케줄링을 동시에 획득할 수 있습니다.

        --threads-per-user-max= 사용자당 스레드 수를 지정합니다.
        동시에 RT 스케줄링을 획득할 수 있습니다. 물론 이
        값은 --process-per-user-max=보다 높게 설정해야 합니다.

        --actions-burst-sec= 속도에 영향을 주기 위해 사용될 수 있습니다.
        RealtimeKit의 제한 논리. 데몬만 통과
        최대 스레드 수에 대한 실시간 스케줄링 권한
        이 기간 내에(아래 참조).

        --actions-per-burst-max=는 속도에 영향을 주기 위해 사용될 수 있습니다.
        RealtimeKit의 제한 논리. 데몬만 통과
        이 스레드 수에 대한 실시간 스케줄링 권한
        를 통해 구성된 시간 프레임 내
        --actions-burst-sec=. 이 한도에 도달하면 고객이 필요로 하는
        RT 일정을 요청하기 전에 해당 시간이 지날 때까지 대기
        다시.

        --canary-cheep-msec=는 얼마나 자주
        카나리아 스레드는 삑삑거릴 것입니다.

        --canary-watchdog-msec=는 얼마나 빨리
        워치독 스레드는 카나리아로부터 삑삑 소리를 받을 것으로 예상합니다.
        실. 이 값은 다음보다 크게 선택해야 합니다.
        --canary-cheep-msec=. 전자를 10초로 설정하고 후자를 설정하면
        그러면 카나리아 스레드가 다음을 트리거하고 전달할 수 있습니다.
        최대 대기 시간이 3초인 삑삑 소리

320x100
반응형