본문 바로가기
Development/Free Topic

Ubuntu Process의 Priority와 Niceness 설정하기

by IMCOMKING 2020. 7. 18.

PR(Priority) : 값의 범위 = [-100, 39]

PR값은 실제로 process가 OS에 의해 동작하게 될 priority를 의미한다. 이 값은 사용자가 바로 지정 할수는 없다.

PR값의 범위는 [-100, -2]까지는 realtime process를 의미하고, [0, 39]는 상대적으로 우선순위가 낮은 normal process를 의미한다.

 

PR이 -100에 가까울수록 우선순위가 높아지고, 39에 가까울수록 우선순위가 낮아진다.

 

 

NI(Nicevalue or Niceness) : 값의 범위 = [-20, 19]

NI값은 유저가 지정하는 값으로, normal process의  PR을 지정하는 데 사용된다. 이때 아래와 같은 공식으로 PR값이 결정된다.

 

PR = NI + 20   (Normal Process에서만)

 
결론적으로 위 공식에따라 유저는 [0, 39]의 범위로 normal process의 PR값을 지정할 수 있다.
 
 

 

 

 

NI 값 설정하기 : Normal Process의 우선순위 설정

기본적으로 사용자가 실행한 프로그램은 NI가 0으로 설정된다. 그러나 아래와 같은 방식으로 NI값을 조정하여 실행할 수 있다.

 

nice -n <nice_value> ./myProgram 

 

또한 실행 뒤에도, 다음과 같은 두가지 방법으로 NI값을 재설정할 수 있다.

 

Renice

renice -n <nice_value> -p <process_id>

 

Top

top
r -> pid 입력
NI 값 입력
 
 
 
 

PR 값 설정하기: Realtime Process의 우선순위 설정

그러나 위와 같은 NI만으로는 진짜 중요한 realtime process의 priority 설정을 할 수 없다. 그래서 이 글을 따라 더 깊게 들어가보자.
 
이를 위해서는 우선 normal process를 real time process로 바꿔주어야 한다.
 

Ubuntu의 5가지 scheduling policies

chrt -m 
 
을 입력하면 아래와 같이 6가지 스케줄링 정책이 출력과 각 정책의 prioiry 범위가 표시된다.
 
1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy
6. SHCED_DEADLINE a real-time policy
 
이 중에서 1~3까지는 normal process들이 속하는 그룹이고, 4~6는 realtime process들이 속하는 그룹이다.
 
Reatime process에서는 priority가 높은 process가 언제나 항상 자원을 선점한다. 만약 동일한 우선순위를 가진 task가 있다면, 위의 정책에 의해서 실행이 결정된다.
FIFO로 설정 된 경우 동일한 우선순위 내에서 실행한 process가 끝날때까지 다른 process는 뒤로 밀린다. 반면 RR로 실행한 경우, 동일한 우선순위를 가진 task에 대해서 시간을 공평하게 나눠서 실행하게 된다. 좀 더 안전한 사용을 위해서는 FIFO보다는 RR이 나을 것이다.(어차피 priority가 있으므로)
 

Realtime process로 설정하기

우선 realtime_priority 는 [1, 99]의 범위를 갖고, 다음의 공식에 따라 PR값이 결정된다.
PR = -1 - realtime_priority
즉 PR은 [-100, -2]의 값을 가지며, PR이 -100일 때 가장 우선순위가 높으며 이는 realtime_priority이 99일 때를 의미한다.
 
다음의 명령어를 통해서 real time process를 실행할 수 있다.
 
chrt -p <pid> : 해당 pid의 real time priority를 보여준다.
chrt -p <realtime_priority> <pid 또는 실행경로>
chrt -f -p <realtime_priority> <pid 또는 실행경로>   : SCHED_FIFO 폴리시 적용
chrt -r -p <realtime_priority> <pid 또는 실행경로>   : SCHED_RR 폴리시 적용
 
 
ex) 1388 pid를 RR 폴리시로, 최고 우선순위(99)로 실행한다. 그러면 top에서 확인해보면 숫자 99대신 rt라고 출력되며, 이는 최고 우선순위를 의미한다.
sudo chrt -r -p 99 1388
 
 
 
 

PR과 NI값 확인하기

top 입력 후 PR과 NI값 확인.
 
 

Python에서 자기 자신의 pid확인하기

import os
print(os.getpid())
 
 
 

CPU 각 core별 utilization 확인하기

top 실행 후 숫자 1 입력
 
-------또는 
 
sudo apt install htop
htop
 
* htop이 아주 깔끔한듯
 
 
-------또는
 
sudo apt install sysstat
mpstat -P ALL

 

 

 

Real time process monitoring 및 kill하기

htop
F6(SortBy) -> PRIORITY
F9(Kill) -> process선택후 enter
 
* 이때 sudo htop으로 하면, sudo kill과 동일하게 process를 강제 종료시킬 수 있다.
 
 

SCHED_DEADLINE

Ubuntu kernel에서 기본 제공되는 RT scheduler. Earliest Deadline First(EDF)방식으로 task를 처리한다. Normal process 및 FIFO/RR보다 우선순위가 높다.
 

 

상세 알고리즘설명: https://www.kernel.org/doc/Documentation/scheduler/sched-deadline.txt

 

PPT: https://elinux.org/images/f/fe/Using_SCHED_DEADLINE.pdf

 

 

sudo chrt -d -T <runtime nano sec> -D <deadline nano sec> -P <period nano sec> 0 <command>

 

10 ms = 10000000

 

sudo chrt -d -T 10000000 -D 10000000 -P 10000000 0 ./run_python.sh

sudo chrt -d -T 10000000 -D 20000000 -P 30000000 0 /opt/conda/bin/python dnc/training_process.py

sudo chrt -d -T 10000000 -D 15000000 -P 20000000 -p 0 <pid>

sudo chrt -d -T 100000000 -D 100000000 -P 100000000  -p 0 6557

 

* RUNTIME <= DEADLINE <= PERIOD

 

Omitting runtime will cause runtime to be set to the deadline value

Omitting deadline will cause deadline to be set to the period value

 

Omitting period will cause period to be set to the deadline value

 

* 전반적 실행방법https://access.redhat.com/solutions/3742421

* chrt: https://man7.org/linux/man-pages/man1/chrt.1.html

* shced: https://man7.org/linux/man-pages/man7/sched.7.html

 

 

vim run_python.sh

/opt/conda/bin/python dnc/training_process.py

 

chmod 777 run_python.sh

 

sudo chrt --rr 1 ./run_python.sh

 

sched 명령어

 
 
 

chrt 명령어 USER가 실행하기

 
 

 

댓글