본문 바로가기
OS/Linux Server

[리눅스커널이야기] top 을 통해 살펴보는 프로세스 정보들(2)

by Haengsin 2022. 7. 26.
프로세스의 상태 보기

 

1. Process Status

  • D = uninterruptible sleep
  • R = running
  • S = sleeping
  • T = traced or stopped
  • Z = zombie

- D(uninterruptible sleep) : 디스크 혹은 네트워크 I/O 를 대기하고 있는 프로세스를 의미.

- R(running) : 실행 중인 프로세스. 실제로 CPU 자원을 소모.

- S(sleeping) : sleeping 상태의 프로세스로, D 상태와의 가장 큰 차이점은 요청한 리소스를 즉시 사용할 수 있는지 여부.

- T(traced or stopped) : 프로세스의 시스템 콜을 추적하고 있는 상태. (자주 볼 수 없는 상태)

- Z(zombie) : 부모 프로세스가 죽은 자식 프로세스를 의미. (자신을 만든 부모 프로세스가 완료된 상태인 경우)

 

사실 S 상태의 프로세스가 많은 것은 시스템에 큰 영향을 끼치지 않는다.

하지만, D 상태의 프로세스가 많으면 특정 요청이 끝나기를 기다리고 있는 프로세스가 많다는 것을 의미하고,

이 프로세스들은 요청이 끝나면 R 상태로 다시 돌아가야 하기 때문에 시스템의 부하를 계산하는 데 포함된다.

 

※ 좀비 프로세스가 문제가 될까?

좀비 프로세스는 시스템의 리소스를 차지하지 않기 때문에 그 존재 자체는 큰 문제가 되지 않는다. 스케줄러에 의해 선택되지 않기 때문에 당연히 CPU를 사용하지 않고, 좀비 프로세스 자체는 이미 사용이 중지된 프로세스이기 때문에 메모리를 사용하지도 않는다. 

그렇다면 왜 문제가 될까?

좀비 프로세스가 점유하고 있는 PID 때문이다. 좀비 프로세스가 사용한 PID 가 정리되지 않고 쌓이면 새로운 프로세스에 할당할 PID 가 무자라게 되고, 이는 결국 더 이상 PID 를 할당하지 못하는 PID 고갈을 일으킬 수 있다.

 

※ 생성 가능한 최대 PID 확인하기

sudo sysctl -a | grep -i pid_max

리눅스 상의 모든 프로세스들은 PID 를 가지며 이 PID 는 integer 형태의 숫자로 구성되어 있다.

그리고 리눅스 커널에는 kernel.pidx_max 라는 커널 파라미터를 통해서 PID 의 최댓값을 정의하고 있다.

이 시스템에서 생성되는 모든 프로세스는 1~32768 사이의 임의의 값을 PID 로 배정 받는다.

 

 

2. 프로세스의 우선 순위

(1) PR과 NI

PR 과 NI 는 커널이 프로세스를 스케줄링할 때 사용하는 우선순위를 나타내는 값이다.

 

CPU 마다 Run Queue 라는 것이 존재하며, Run Queue 에는 우선순위 별로 프로세스가 연결되어 있다.

 

Scheduler는 유휴 상태에 있던 프로세스가 깨어나거나 특정 프로세스가 스케줄링을 양보하는 등의 경우에 현재 Run Queue 에 있는 프로세스들 중 가장 우선순위가 높은 프로세스를 꺼내서 Dispatcher 에 넘겨준다. 

 

Dispatcher 는 현재 실행 중인 프로세스의 정보를 다른 곳에 저장한 후 넘겨받은 프로세스의 정보를 가지고 다시 연산을 하도록 요청한다.

 

  • PR(Priority) : 해당 프로세스의 실제 우선순위 값을 의미
  • NI(Nice Value) : 명령어를 통해서 우선순위를 낮출 때 사용된다. 우선순위는 값이 낮을수록 우선순위가 높은 것으로, nice 명령을 이용해서 PR 값을 낮출 수 있다. 그럼 더 높은 우선 순위를 가지므로 더 많은 스케줄링 될 수 있는 기회를 얻을 수 있다.

기본적으로 모든 프로세스들은 20의 우선순위 값을 갖는데 여기에 nice 값을 주면 우선순위가 바뀐다. kworker/0:0H 데몬처럼 nice 값이 -20 이 되면 20 에 -20 이 적용된 PR은 0이 되며 더 자주 실행된다. 

 

$ nice -n [N] [프로세스명]
# nice -n -10 httpd
# 기존 우선순위 값에 N만큼 더한 우선순위로 프로세스를 실행 (default=10)

※ nice 로 우선순위를 낮춘 프로세스가 먼저 끝날까? 

- 그럴 수도 있고 아닐 수도 있다.

예를 들어 nice 로 우선순위를 낮추었다고 하더라도 CPU Core 수(예,2개)와 동일한 수의 프로세스가 돌아가고 있다면 CPU 경합을 벌일 필요가 없기 때문에 nice 로 우선순위를 낮춰도 비슷한 시간에 끝나게 된다.

 

(2) RT (Real Time)

RT(RealTime) 스케줄러는 일반적인 사용자가 생성한 프로세스에 적용되는 스케줄러가 아니다. 반드시 특정 시간 안에 종료되어야 하는 중요한 프로세스들, 바로 커널에서 사용하는 데몬들이 대상이다.

 

RT 스케줄러의 적용을 받게되는 프로세스들은 CFS(Completely Fair Scheduling) 스케줄러보다 더 먼저 실행된다.

이는 안정적인 운영을 위한 것이다. 메모리가 부족한 상태에서 사용하지 않는 메모리들을 회수하고 관리하는 프로세스가 일반적인 사용자 프로세스보다 더 중요하기 때문이다.

 

 

Reference