top command
top command에 대해 “DevOps와 SE를 위한 리눅스 커널 이야기” 책에서 배운 내용, “리얼 리눅스 SW 기본반"에서 배운 내용을 정리하였습니다.
top 명령어 실행 결과
root@August-PC:~# top -b -n 1
top - 01:57:36 up 58 min, 0 users, load average: 0.52, 0.58, 0.59
Tasks: 8 total, 1 running, 7 sleeping, 0 stopped, 0 zombie
%Cpu(s): 9.0 us, 23.3 sy, 0.0 ni, 67.4 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
KiB Mem : 8240388 total, 2032052 free, 5978984 used, 229352 buff/cache
KiB Swap: 25165824 total, 24837212 free, 328612 used. 2127672 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
1 root 20 0 8916 328 284 S 0.0 0.0 0:00.07
880 root 20 0 8916 228 176 S 0.0 0.0 0:00.01
881 august 20 0 18356 3764 3448 S 0.0 0.0 0:00.38
1074 root 20 0 8916 232 180 S 0.0 0.0 0:00.00
1075 august 20 0 18224 3492 3364 S 0.0 0.0 0:00.09
1087 root 20 0 16260 2116 2088 S 0.0 0.0 0:00.01
1088 root 20 0 18088 3392 3304 S 0.0 0.0 0:00.06
1104 root 20 0 18780 1888 1420 R 0.0 0.0 0:00.01- line 1: 현재 시스템의 시간과 uptime, 그리고 load average가 나온다
top - 01:57:36 up 58 min, 0 users, load average: 0.52, 0.58, 0.59
Load average란?
시스템 부하 정도를 나타내는 지표이다. 보이는 숫자 3개는 각각 1분, 5분, 15분 간의 시스템 부하 평균값이다.
코어가 4개인 서버에서 맨 앞의 load가 4.0이라면 그 서버는 지난 1분 평균으로 CPU를 100% 쓰고있다는 뜻이다.
100%는 부하가 높긴 하지만 처리가 밀리지는 않은 상태이다.
또 다른 예로 코어가 4개일 때, 맨 앞의 load가 2.0이라면 그 서버는 지난 1분 평균으로 cpu를 50% 쓰고 있다는 뜻이다.
- line 2: 현재 실행중인 process들
Tasks: 8 total, 1 running, 7 sleeping, 0 stopped, 0 zombie
total : 전체 프로세스 수 이다.
running : 실행중인 프로세스의 수이다.
sleeping : I/O 나 event를 기다리는 프로세스의 수를 나타낸다
stopped : ctrl + z 와 같은 STOP 시그널을 받은 프로세스의 수이다. `top` 실행하고 ctrl+z 누른다음 다시 `top` 보면 늘어난 것 볼 수 있음.
zombie : 프로세스가 종료 되었지만 OS 내부 자원(자료구조)의 메모리 해제가 안된 프로세스
- line 3: 프로세스 타입? 별로 CPU를 차지했던 시간의 비율(%)
%Cpu(s): 9.0 us, 23.3 sy, 0.0 ni, 67.4 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
us : 실행 우선 순위가 높은 프로세스(user mode, 높은 우선순위 process)가 CPU를 차지한 시간의 비율
sy : 시스템 프로세스(kernel mode)가 CPU를 차지한 시간의 비율
ni : nice한 프로세스(user mode, 우선순위가 낮은)가 CPU를 차지한 시간의 비율
id : CPU가 idle했던 시간의 비율 (시스템이 얼마나 여유로운지 나타낸다)
wa : CPU가 I/O wait 상태였던(디스크 I/O를 기다렸던) 시간의 비율
hi : hardware interrupt 처리에 CPU가 사용된 시간의 비율
(hard irq. irq는 Interrupt ReQuest를 나타낸다. hard irq는 키보드 입력 같은, 전기 신호에 의해 발생하는 하드웨어 인터럽트를 뜻함)
si : software interrupt 처리에 CPU가 사용된 시간의 비율
(soft irq. soft irq는 소프트웨어 인터럽트를 뜻함)
st : CPU가 처리할 일이 있는데 VM한테 CPU를 뺐겨서 일을 못한 시간의 비율
(st는 steal을 뜻한다고 한다. VM이 CPU를 훔쳐가서 일을 못한 시간의 비율이라는 듯)
- PID: process id, PR : Priority, NI : Nice value
Nice value가 뭘까?
Process의 우선순위를 나타내는 값이다.
Nice 하다는 것은 이타적이라는, CPU 양보를 잘한다는 의미로 보면 될 것 같다.
어떤 Process의 Nice값이 높다는 것은 곧 그 process는 CPU 양보를 잘하는 프로세스라는, 실행 우선순위가 낮은 프로세스라는 뜻이다.
반대로 Nice값이 낮다는 것은 CPU 양보를 안할려고 하는, 실행 우선순위가 높은 프로세스 라는 뜻이다.
- VIRT : VIRTual memory, 해당 프로세스에게 할당된 가상메모리 전체의 크기
- RES: RESident memory, 해당 프로세스가 실제로 사용중인 물리메모리의 양
- S : Process Status
Memory Commit 의 개념
커널은 프로세스가 메모리를 요청할 때 그에 맞는 크기를 가상으로 할당해준다. 실제로 요청받은 크기 전체만큼 물리메모리에 assign해주지는 않음. 그렇게 있다가 실제로 사용이 필요할 때마다 물리메모리를 조금씩 더 할당을 해줌(늘려줌). 이를 memory commit 이라고 한다.
- vm.overcommit_memory는 커널의 Memory commit 동작 방식을 변경할 수 있게 해주는 커널 파라미터.
- 0=최댓값 바탕으로 Memory commit, 1=무조건 overcommit, 2=vm.overcommit_ratio에 설정된 비율을 바탕으로 제한적으로 memory commit
커널 파라미터 보는법? sysctl
root@August-PC:~# sysctl -a
fs.binfmt_misc.status = enabled
fs.binfmt_misc.WSLInterop = enabled
fs.binfmt_misc.WSLInterop = interpreter /init
...
...
vm.min_free_kbytes = 45056
vm.overcommit_memory = 0
vm.swappiness = 60sysctl -a | grep pid_max하면 현재 시스템의 생성 가능한 최대 pid 확인 가능
프로세스 상태
- Process Status 종류 : D, R, S, T, Z
- D = Uninterruptible sleep - 디스크, 네트워크 디바이스에 작업 요청 후 대기중인 상태(Run queue가 아닌 wait queue에 넣어놓음)
- R = Running - 현재 CPU에서 실행되고 있는 상태
- S = Sleep - 그냥 자고있는 애들. D와의 차이는 요청한 리소스를 즉시 사용할 수 있는지 여부이다.
- T = traced or stopped. strace 등으로 프로세스가 추적되고 있는 상태
- Z = zombie 상태. parent process가 죽은 child process를 의미
프로세스 우선 순위
기본 PR값은 20이다.
PR값에서 NI값을 뺀 값이 최종 우선순위가 된다. 숫자 0에 가까울수록 우선순위 높은것이다.
nice 값이 낮다는 것은 프로세스가 나이스하지 않다는 뜻이다(무슨소리세요..?)
위에 설명했듯, 프로세스가 nice하지 않은 녀석이라 다른 프로세스들에게 CPU 양보를 안하려고 함 -> 프로세스 우선순위가 높다.
반대로 nice 값이 높다는 것은 프로세스가 nice해서 CPU 양보를 잘해준다 -> 우선 순위가 낮다
nice -n N command명령으로 해당 프로세스 nice 값을 부여해줄 수 있음.(N은 원하는 숫자)RT는 RealTime의 약자로써, RT 스케줄러에 의해 실시간으로 커널에 의해 처리되는 프로세스들임. CFQ(Completely Fair Queueing) 스케줄러보다 먼저 실행된다.
출처