[Linux] top을 통해 살펴보는 프로세스 정보들

[Linux] top을 통해 살펴보는 프로세스 정보들

안녕하세요? 정리하는 개발자 워니즈 입니다. 이번시간부터 이어지는 포스팅들은 리눅스의 기본정리를 해보려고 합니다. 그동안 시스템 엔지니어 + DevOps 업무를 진행해 왔었습니다. 그런데 시스템적으로 확인해야될 부분에서는 아직은 기초가 부족하다고 생각이 많이 들었습니다.

그래서 DevOps와 SE를 위한 리눅스 커널이야기 라는 책을 읽고 해당 내용을 정리해보기로 했습니다. 이번포스팅부터는 개인적인 공부를 정리해둔 거라고 보시면 됩니다.

필자는 절대 저자와 아무런 관련이 없음을 밝힙니다.

필자는 사실 공부하는 것(?)을 좋아합니다. 그냥 지식을 습득하는 것을 좋아하는 것 같습니다. 그러다보니 이러저러한 책들을, 특히나 IT 서적들을 많이 둘러보는데 이번에 위의 책을 알게 되었습니다. 리눅스의 커널단부터 시스템적인 요소를 하나하나씩 짚어보게끔 되어있습니다.

그래서 기왕 책 읽는거 정리하면서 보자는 마음으로 포스팅을 진행하게 되었습니다.

1. 시스템의 상태 살피기

top 명령은 시스템의 상태를 전반적으로 가장 빠르게 파악 할 수 있는 명령어 중 하나이다.

옵션없이 top 명령을 입력하면 3초의 간격으로 refresh 하면서 정보를 보여줍니다. 순간의 top 정보를 확인하기 위해서는 -b 옵션을 사용합니다.

필자가 처음 TA(Technical Architecture) 업무를 배우게 되면서 알게된 명령어 입니다. top명령어를 치면 다음과 같은 내용들이 보이는데, 처음에는 무슨 내용을 봐야하는지 몰랐습니다 .

  • up 200 days

현재 서버의 시간과 서버가 얼마나 구동되었는지 구동 시간이 나와 있습니다.

  • load average : 1.81, 1.44, 1.26

Load Average는 현재 시스템이 얼마나 많은 일을 하고 있는지를 보여주는 데이터로, 높으면 서버가 많은 일을 하고 있다고 볼 수 있습니다.

  • 2 running, 353 sleeping

시스템에서 구동 중인 프로세스의 개를 나타냅니다.

  • VIRT, RES, SHR

프로세스가 사용하는 메모리의 양이 얼마인지를 확인할 수 있는 정보로, 이를 통해 프로세스에 메모리 누수가 있는지를 확인할 수 있어 중요한 정보중 하나입니다.

2. VIRT, RES, SHR은 무엇인가요?

VIRT는 간단하게 프로세스에 할당된 가상 메모리 전체의 크기라고 보면 됩니다. 이것이 높다고해서 문제가 될 소지는 없습니다. RES는 그중 실제로 메모리에 올려서 사용하고 있는 물리 메모리의 크기, 그리고 SHR은 다른 프로세스와 공유하고 있는 메모리의 크기를 말합니다.

실제 사용하고 있는 메모리는 RES 영역이기 때문에 점유율이 높은 프로세스를 찾기 위해서는 RES 영역이 높은 프로세스를 찾아야 한다.

3. Memory Commit의 개념

VIRT는 프로세스가 커널로부터 사용을 하려고 예약받은 메모리라고 할 수 있습니다. malloc() 과 같은 시스템콜로 자신이 필요로 하는 메모리의 영역을 할당해 줄 것을 요청합니다. 이에 커널은 가용한 공간이 있따면 성공 메시지와 함께 해당 프로세스가 사용할 수 있도록 가상의 메모리 주소를 전달해 줍니다.

그 후 프로세스가 할당받은 메모리 영역에 실제로 쓰기 작업을 하면 Page fault가 발생하며, 그제서야 커널은 실제 물리 메모리에 프로세스의 가상 메모리 공간을 매핑한다. 이것은 Page Table이라고 불리는 커널의 전역 변수로 관리된다. 그리고 이렇게 물리 메모리에 바인딩된 영역이 RES로 계산된다.

프로세스는 자신만의 작업 공간이 필요하고 그 공간은 메모리에 존재한다. 프로세스가 커널에 필요한 만큼의 메모리를 요청하면 커널은 프로세스에 사용 가능한 메모리 영역을 주고 실제로 할당은 하지 않지만 해당 영역을 프로세스에 주었따는 것을 저장합니다. 이 일련의 과정을 Memory Commit이라고 부릅니다.

4. 프로세스 상태 보기

프로세스의 상태는 SHR 옆에 있는 S 항목으로 볼 수 있다. 어떤 항목들이 있을지 man 페이지 설명은 아래와 같다.
  S  --  Process Status
                The status of the task which can be one of:
                    'D' = uninterruptible sleep
                    'R' = running
                    'S' = sleeping
                    'T' = traced or stopped
                    'Z' = zombie

  • D: uninterruptible sleep

디스크 혹은 네트워크 I/O를 대기하고 있는 프로세스를 의미한다. 이 상태의 프로세스들은 대기하는 동안 Run Queue에서 빠져나와 Wait Queue에 들어가게 된다.

D 상태의 프로세스가 많으면 특정 요청이 끝나기를 기다리고 있는 프로세스가 많다는 뜻이고, 이 프로세스들은 요청이 끝나면 R 상태로 다시 돌아가야 하기 떄문에 시스템의 부하를 계산하는데 포함됩니다.

  • R: running

실행 중인 프로세스를 의미합니다. 실제로 CPU 자원을 소모하고 있는 프로세스 입니다.

  • S: sleeping

D 상태와의 가장 큰 차이점은 요청한 리소스를 즉시 사용할 수 있는지 여부입니다. 시스템 콜이나, 콘솔 입력을 기다리는 프로세스들은 Interruptible sleep 상태가 됩니다. S 상태의 프로세스가 많은 것은 시스템에 큰 영향을 끼치지 않습니다.

  • Z: zombie

포 프로세스가 죽은 자식 프로세스를 의미합니다. 좀비 프로세스가 실제로 시스템에 지대한 영향을 끼치는 것은 아니지만, PID가 정리가 되지 않고 쌓이면 새로운 프로세스에 할당할 PID가 모자르게 되고, 이는 결국 더이상 PID를 할당하지 못하여 고갈을 일으 킬 수 있습니다.

5. 프로세스 우선 순위

top을 통해 볼 수 있는 항목 중 PR과 NI 값을 살펴 봅니다. PR과 NI는 커널이 프로세스를 스케쥴링할 떄 사용하는 우선순위를 나타내는 값입니다. 프로세스 스케쥴링이 진행되는 구조는 다음과 같습니다.

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

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다