[실습과 그림으로 배우는 리눅스 구조] - top

실습과 그림으로 배우는 리눅스 구조
최근 실습과 그림으로 배우는 리눅스 구조 라는 책을 읽었다.
리눅스에서 명령어를 치다보면 종종 CPU, 메모리 등에 대해 내가 치는 명령어의 결과값이 어떤 의미를 갖는지 좀 더 구체적으로 알고싶을 때가 있었다.
어디선가 추천글을 보고 서점에 가서 대충 훑어보고 바로 집었다.(적당한 그림, 글, 코드)

책은 총 8챕터인데, CPU 관련 -> 메모리 관련 -> 저장장치 관련 순서로 구성되어있다. 챕터의 순서도 OS의 흐름을 이해하는 데에 한 몫 한다.
사실 책에서는 좀 더 방대하고 이것까지 알아야하나? 하는 부분도 있는데, 한번 죽 읽으면 확실히 도움이 된다. 본능적으로 컴퓨터란 것에 대해 조금 더 알게 된 느낌이다.

책 내용 전체를 요약하기는 어렵고, 내가 자주 쓰는 top, free -m, df -h 명령어 결과에서 이 책을 통해 더 이해한 부분들을 정리해보겠다.

1. top

top 은 시스템이 느리거나 비정상적이라고할 때에 많이 쳐보는 명령어이다.
현재 시스템에서 실시간으로 실행중인 process들이 자원을 점유하는 상황을 볼 수 있다.
상단부분에는 시스템 전체의 현황이, 개행 밑에는 각 프로세스들의 현황을 볼 수 있어서 단시간에 이 리눅스에서 일어나고 있는 일을 직감하기에 좋은 커맨드이다.

Processes: 314 total, 2 running, 312 sleeping, 1352 threads                   22:04:56
Load Avg: 1.79, 2.32, 2.22  CPU usage: 5.2% user, 6.22% sys, 88.75% idle
SharedLibs: 136M resident, 44M data, 13M linkedit.
MemRegions: 83082 total, 1269M resident, 42M private, 369M shared.
PhysMem: 4080M used (1193M wired), 16M unused.
VM: 1391G vsize, 1317M framework vsize, 1626478(0) swapins, 1893513(0) swapouts.
Networks: packets: 4410939/5522M in, 2399371/2658M out.
Disks: 2222978/40G read, 1852633/30G written.

PID   COMMAND      %CPU TIME     #TH   #WQ  #PORT MEM    PURG   CMPRS  PGRP PPID
7505  top          4.4  00:01.47 1/1   0    25    3664K  0B     0B     7505 7452
7452  zsh          0.0  00:00.61 1     0    21    2984K  0B     0B     7452 7451
7451  login        0.0  00:01.01 2     1    31    988K   0B     0B     7451 7450
7450  iTerm2       0.0  00:00.10 2     1    32    2864K  0B     0B     7450 5330
7446  Google Chrom 0.0  00:00.17 11    1    103   13M    0B     8676K  1475 1475
7445  Google Chrom 0.1  00:04.28 14    3    170   64M    0B     12M    1475 1475
7426  Google Chrom 0.0  00:00.46 11    1    123   22M    0B     11M    1475 1475
7424  Google Chrom 0.0  00:00.62 11    1    156   26M    0B     8272K  1475 1475
7421  Google Chrom 0.1  00:05.12 12    1    172   65M    0B     16M    1475 1475
7419  mdworker_sha 0.0  00:00.42 4     1    59    6392K  0B     2488K  7419 1
7418  mdworker_sha 0.0  00:00.36 4     1    61    6420K  0B     1916K  7418 1
7417  mdworker_sha 0.0  00:00.98 4     1    61    7564K  0B     488K   7417 1
7416  mdworker_sha 0.0  00:00.67 4     1    61    8356K  0B     1136K  7416 1
7413  mdworker_sha 0.0  00:00.09 3     1    59    5576K  0B     4484K  7413 1
7412  mdworker_sha 0.0  00:00.08 3     1    56    5472K  0B     4260K  7412 1
7411  mdworker_sha 0.0  00:00.08 3     1    56    4132K  0B     2516K  7411 1
7410  mdworker_sha 0.0  00:00.09 3     1    56    4992K  0B     3532K  7410 1
7405  mdworker_sha 0.0  00:00.13 3     1    56    3004K  0B     2964K  7405 1
7401  AddressBookS 0.0  00:00.79 3     1    98    6808K  0B     6548K  7401 1
7399  Google Chrom 0.4  00:25.24 16    1    265   211M-  0B     52M    1475 1475

위 아웃풋은 현재 내 맥(맥도 Unix 계열에서 나왔기 때문에 웬만한 Unix 명령어는 사용가능하다)에서 top을 날린 결과이다.

CPU 관련

상단 두 번째 줄에 Load Avg: 1.79, 2.32, 2.22 CPU usage: 5.2% user, 6.22% sys, 88.75% idle 를 확인할 수 있다.
이것의 의미를 뜯어보면, 우선 Load Avg 는 순서대로 1분, 5분, 15분 동안 시스템의 부하평균 값이다. 이 부하평균 값은 running/waiting 상태의 프로세스의 평균이라고 한다.
이것으로는 갑자기 시스템에 부하가 생긴 것인지, 지속적으로 생긴 것인지 아니면 생겼다가 없어졌는지 등을 수치로 확인할 수 있다.
간단하고 직관적인 만큼 엄청 크리티컬한 것을 알 수는 없다.
Load Avg는 uptime 명령어를 통해서도 볼 수 있다.

Load Avg 옆에는 CPU usage: 5.2% user, 6.22% sys, 88.75% idle 라고 해서 CPU 사용률을 모니터링할 수 있다.
크게 CPU 사용률을 1) user, 1) sys, 3) idle 세 부분으로 나누어 확인이 가능하다. 그리고 각 부분이 의미하는 바가 다르다.

user, sys

우선 user 영역은 시스템에서 어플리케이션이 작동하면서 CPU를 쓰는 시간이다.
잠깐 유저영역에 대해서 짚고가면, OS는 하드웨어를 다루는 커널영역과 프로그램을 다루는 유저영역 으로 나뉠 수 있다.
프로그램은 종국에는 하드웨어를 조작해야 하는데(=커널영역에 접근), 프로그램(어플리케이션/소프트웨어)이 직접 하드웨어를 조작하지 않고(=커널영역에 직접 접근) system call 이라는 것을 통해 커널영역에 접근하게 된다.
쉽게 생각하면, ‘내가 하드웨어를 조작하는 걸 다 코딩하기 힘드니까 커널이 제공하는 system call interface를 사용하는구나’ 라고 이해할 수 있다.
시스템 콜을 이해하고나면 CPU usage의 두 가지 부분인 user, sys 영역이 무엇을 의미하는지 알 수 있다.
user는 어플리케이션이 동작하면서 CPU를 사용하는 양이고, sys는 어플리케이션이 시스템 콜을 해서 커널영역에서 CPU를 사용하고 있는 것이다.
그리고 sys 는 대게의 경우 I/O를 유발시키는 disk 작업인 경우가 많다.(하드웨어를 조작하는 것인데.. 특히 많은 어플리케이션에서 disk 작업에 많은 시간을 쓴다. 물론 아닌 경우도 있고)

idle

idle은 말 그대로 CPU가 놀고있는 시간이다. CPU가 노는것은 진짜 일이 없어서일 수도 있지만 때로는 무언가 다른걸 기다리고 있어서 일때도 있다.
idle이 높을 때에는 disk I/O wait 률이 높지는 않은지도 꼭 확인해보자. (mac의 top은 I/O wait 는 보여주지 않는데, 대부분의 Linux에서 top 명령어에 CPU wait률도 보여준다)

왜 CPU Time은 s가 아니라 %인가?

추가적으로 위 질문에 대해서도 정리해보겠다. 나는 예전부터 왜 CPU usage 를 CPU time 이라고 하면서 그 단위가 시간이 아니라 %인지 이해가 안갔었다.
CPU 사용률 이라고 생각해도 %라는 단위는 그다지 와닿지 않는 단위였다. 이 책을 통해 CPU 작동 방식을 이해하면서 왜 %인지 이해할 수 있게 되었다.
CPU가 하는 일은 기본적으로 프로세스를 실행하는 것이다. 코어에 따라 다르겠지만, 일단 1cpu 1core로 가정했을 때에 CPU 하나는 동시에 하나의 프로세스밖에 처리하지 못한다. OS가 여러 프로세스를 여러 CPU에, 그리고 하나의 CPU에 여러 프로세스를 병렬/직렬적으로 스케쥴링해서 CPU를 최대한 많이 활용할 수 있도록 한다.
CPU가 잘 활용되려면, 단위시간동안 여러 프로세스를 놀지않고 알차게 분배받아야 한다. 즉, CPU 사용의 단위는 단위시간 동안에 얼마나 프로세스 스케쥴링이 되어서 놀지 않고 잘 처리했는지 인것이다.
예를들어 CPU user time이 100%이면, 이 CPU는 계속 놀지않고 일을 했다는 것이다. 때로는 CPU 열일, 때로는 CPU 부하로 해석할 수 있다.(후자가 더 잦지 않을까)
또 만약 CPU idle time이 80%라면, 이 CPU는 대게의 경우 아무 일을 안했다는 것이다. 나머지 20%는 user나 sys 중에 썼을 것이다.
(이 부분에 대해 설명이 부족한 것 같은데, 이해가 직관적으로 되지 않는다면 CPU가 어떻게 동작하는지 또는 CPU sheduling에 대해서 찾아보면 도움이 될 것 같다.)

Memory 관련

top 명령어 출력에서 CPU 밑에는

SharedLibs: 136M resident, 44M data, 13M linkedit.
MemRegions: 83082 total, 1269M resident, 42M private, 369M shared.
PhysMem: 4080M used (1193M wired), 16M unused.
VM: 1391G vsize, 1317M framework vsize, 1626478(0) swapins, 1893513(0) swapouts.

위와 같이 메모리 관련 상태를 알 수 있다. 자세히 보면 공유메모리, 물리메모리, 가상메모리 사용 현황이 나오는데 사실 top 출력의 메모리부분은 가독성이 떨어져서 나는 메모리 모니터링은 free 명령어로 확인한다. 이 부분은 추후에 free 명령어편에서 다시 다루겠다.

Process 관련

top 명령어 출력의 핵심은 Process 일것이다. 실시간으로 어떤 프로세스가 리소스(CPU, Memory, Disk)를 많이 먹고있는지 확인이 가능하다.
기본적으로는 pid 기준 정렬이 되어있는데, CPU, Memory 등으로 정렬이 가능하다.
한 눈에 어떤 프로세스가 문제가 있는지(혹은 있어 보이는지) 바로 확인할 수 있다.
위 결과에서는, top 프로세스가 CPU를 다른 프로세스보다 많이 점유하는 것으로 보이고, Chrome 관련 프로세스가 메모리를 좀 먹고 있는 것으로 보인다.
top으로 빠르게 프로세스 아이디를 확인한 후에, 어떤 명령줄로 동작하고 있는 어떤 프로세스인지 ps -ef | grep [pid] 또는 ps aux | grep [pid] 이런 식으로 더 자세히 검색할 수도 있다.


이번 편에서는 우선 top 명령어 사용 및 해석 방법에 대해서 다루어 보았다. 해석 방법은 위에서 소개한 책을 통해 이해한 지식을 바탕으로 정리하였다. 다음 편에서는 free 등의 명령어에 대해서 정리해보겠다!