본문 바로가기

개발/Server Side

Process Priority 변경 - nice, renice

1. nice
커널은 "nice" 값으로 각 프로세스에게 얼만큼의 프로세서(CPU) 시간을 할당할지 결정한다. nice 값의 범위는 -20 ~ 20 이다. nice 값이 -20이면 우선순위가 가장 높은 것이다. (nice 하지 않고 이기적이라고 이해하면 될듯...) 반면 nice 값이 20이면 우선순위가 가장 낮은 것이다. (아주 nice해서 모두에게 양보한다고 이해하면 될듯...)

모든 프로세스의 nice 값을 출력하려면 "ps axl" 명령을 실행한다.
# ps axl 
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1 0 16 0 2172 552 - S ? 0:17 init [5]
1 0 3 1 34 19 0 0 ksofti SN ? 3:18 [ksoftirqd/0]
1 0 10 1 5 -10 0 0 worker S< ? 0:01 [events/0]
4 0 5145 1 25 10 32124 18592 - SNs ? 0:08 /usr/bin/python /usr/bin/rhn-applet-gui --sm-client-id default4
4 0 5147 5142 16 0 3528 604 - S ? 0:00 /sbin/pam_timestamp_check -d root
1 503 17552 4180 16 0 14208 3920 - S ? 0:01 /home/www/apache2/bin/httpd -f /home/www/apache2/conf/httpd.conf -k start

그렇다면 어떻게 프로세스에게 nice 값을 할당하는 것일까? 다음 예제를 보자.

아래 예에서 nice-test.sh를 백그라운드에서 실행하면 nice 값이 0임을 확인할 수 있다.

$ ./nice-test.sh &
[3] 13009
$ ps axl | grep nice-test
0 509 13009 12863 17 0 4652 972 wait S pts/1 0:00 /bin/bash ./nice-test.sh

같은 스크립트를 nice 값만 바꿔서 실행하는 예제이다.
$ nice -10 ./nice-test.sh &
[1] 13016
$ ps axl | grep nice-test
0 509 13016 12863 30 10 4236 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

"nice -10" 이라는 것인 nice 값을 10으로 설정하라고 하는 것이다. 그렇다면 nice 값을 -10으로 주려면??
$ nice --10 ./nice-test.sh &
[1] 13021
$ nice: cannot set niceness: Permission denied    ☞우선순위를 높이는 것이라 루트 권한 필요...
# nice --10 ./nice-test.sh &
[1] 13060 
# ps axl | grep nice-test
4 0 13060 13024 10 -10 5388 964 wait S< pts/1 0:00 /bin/bash ./nice-test.sh

2. renice
renice 명령어는 실행중인 프로세서의 스케쥴링 우선순위를 변경한다. 

- 우선순위 낮추기(nice 값 증가)
$ ps axl | grep nice-test
0 509 13245 13216 30 10 5244 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

현재 nice 값이 10임을 알 수 있다. nice 값을 증가시키기 위해(우선순위 낮추기) 다음과 같이 renice 명령을 수행하여 nice 값을 높여 준다.

$ renice 16 -p 13245
13245: old priority 10, new priority 16
$ ps axl | grep nice-test
0 509 13245 13216 36 16 5244 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

- 우선순위 높이기(nice 값 감소)
$ ps axl | grep nice-test
0 509 13254 13216 30 10 4412 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh

현재 nice 값이 10임을 알 수 있다. nice 값을 감소시키기 위해(우선순위 높이기) 다음과 같이 renice 명령을 수행하여 nice 값을 낮춰준다.
$ renice 5 -p 13254
renice: 13254: setpriority: Operation not permitted   ☞우선순위를 높이는 것이라 루트 권한 필요...

루트로 로그인하고 다시 수행한다.
# renice 5 -p 13254
13254: old priority 10, new priority 5
# ps axl | grep nice-test
0 509 13254 13216 25 5 4412 968 wait SN pts/1 0:00 /bin/bash ./nice-test.sh