필자는 절대 저자와 아무런 관련이 없음을 밝힙니다.
필자는 사실 공부하는 것(?)을 좋아합니다. 그냥 지식을 습득하는 것을 좋아하는 것 같습니다. 그러다보니 이러저러한 책들을, 특히나 IT 서적들을 많이 둘러보는데 이번에 위의 책을 알게 되었습니다. 리눅스의 커널단부터 시스템적인 요소를 하나하나씩 짚어보게끔 되어있습니다.
그래서 기왕 책 읽는거 정리하면서 보자는 마음으로 포스팅을 진행하게 되었습니다.
1. 시스템의 상태 살피기
top 명령은 시스템의 상태를 전반적으로 가장 빠르게 파악 할 수 있는 명령어 중 하나이다. 옵션없이 top 명령을 입력하면 3초의 간격으로 refresh 하면서 정보를 보여줍니다. 순간의 top 정보를 확인하기 위해서는 -b 옵션을 사용합니다. 필자가 처음 TA(Technical Architecture) 업무를 배우게 되면서 알게된 명령어 입니다. top명령어를 치면 다음과 같은 내용들이 보이는데, 처음에는 무슨 내용을 봐야하는지 몰랐습니다 .
- up 200 days
- load average : 1.81, 1.44, 1.26
- 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
- R: running
- S: sleeping
- Z: zombie
5. 프로세스 우선 순위
top을 통해 볼 수 있는 항목 중 PR과 NI 값을 살펴 봅니다. PR과 NI는 커널이 프로세스를 스케쥴링할 떄 사용하는 우선순위를 나타내는 값입니다. 프로세스 스케쥴링이 진행되는 구조는 다음과 같습니다.
스케줄러는 유휴 상태에 있던 프로세스가 깨어나거나 특정 프로세스가 스케줄링을 양보하는 등의 경우에 현재 Run Queu 에 있는 프로세스들 중 가장 우선순위가 높은 프로세스를 꺼내서 디스패처에 넘겨줍니다.
디스패처는 현재 실행중인 프로세스의 정보를 다른 곳에 저장한 후 넘겨 받은 프로세스의 정보를 가지고 다시 연산을 하도록 요청합니다.
함께 보면 좋은 글
- [Linux] Load Average와 시스템 부하
- [Node.JS] 프로세스 관리도구 PM2 사용법
- [Linux] Apache HTTP 서버와 Tomcat 서버의 연동
- [Linux] 아파치 Tomcat Server.xml 설정
새 글이 올라오면 Threads @wonizz.ai 에도 올립니다. 팔로우해 두면 피드에서 바로 볼 수 있습니다.