[실습과 그림으로 배우는 리눅스 구조] - 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
등의 명령어에 대해서 정리해보겠다!