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}
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초인 삑삑 소리
'ㆍ Linux' 카테고리의 다른 글
udev, user device, systemd, failed to get udev event, udev rule (0) | 2023.08.14 |
---|---|
coredump, 세그먼트 폴트, segfault at 0 ip error 4 in libc-2.28.so (0) | 2023.08.09 |
sar, sysstat, 리눅스 지표 분석 도구, nice, renice, 리눅스 서버 60초안에 상황 파악 (0) | 2023.07.17 |
CentOS 7, Pacemaker, 클러스터 (0) | 2023.07.06 |
리눅스 시스템 모니터링 시스템 최적화 (0) | 2023.06.23 |