...
CPU 정보 확인
현재 시스템의 cpu정보는 /proc/cpuinfo 파일 안에 상세히 적혀져 있다.
다만 core 당 정보를 한페이지씩 출력하기 때문에, 코어가 많아질수록 페이지가 길어죠 more 옵션을 통해 확인하는 것이 좋다.
cat /proc/cpuinfo 명령어
$ cat /proc/cpuinfo
위의 결과에서 중요한 것들 일부 processor, model name, siblings, cpu cores 정도만 알아 두면 좋다.
# CPU 코어 전체 개수
$ grep -c processor /proc/cpuinfo
> 4 # 현재 PC의 가상 CPU 코어 수는 4개
# 물리 CPU 개수
$ grep ^processor /proc/cpuinfo | wc -l
> 4 # 현재 PC의 물리 CPU 수는 4개.
# CPU 당 물리 코어 개수
$ grep 'cpu cores' /proc/cpuinfo | tail -1
> 4 # 현재 PC의 CPU 당 물리 코어 개수는 4개
# Hyper Threading 여부
$ cat /proc/cpuinfo | egrep 'siblings|cpu cores' | head -2
> siblings : 4
> cpu cores : 4
# siblings의 값이 cpu cores 값의 2배 라면 Hyper Threading이 활성화 된 것이다.
Hyper Threading이 활성화 되면, 물리코어 1개를 논리적으로 코어 2개처럼 작동되도록 한다.
흔히 cpu에서 말하는 4코어 8쓰레드가 이를 말하는 것이다.
lscpu 명령어
위의 /proc/cpu의 정보를 좀 간단히 볼 수 있는 명령어이다.
$ lscpu
CPU 사용량 확인
top 명령을 실행하면 아래와 같이 시스템의 전체 정보와 현재 실행 중인 프로세스의 정보를 확인할 수 있다.
$ top
옵션 | 의미 |
-n | 지정한 숫자만큼 화면 출력을 갱신한후 수행 |
-u | 지정한 사용자의 프로세스를 모니터링 |
-b | 출력결과를 파일이나 다른 프로그램으로 전달 |
-d | 화면갱신주기를 초 단위로 설정 |
-p | 지정한 PID 프로세스를 모니터링 |
사진에서 보듯이 현재 CPU의 사용률, 메모리 사용률을 종합적으로 확인할 수 있다.
1행 - 프로세스 시간 간략 요약
- top - 19:20:12 : 현재 시스템의 시간
- up 21:03 : 현재 시스템이 운영중인 총 시간. 21시간째 리눅스를 운영중
- 2 users : 현재 시스템에 접속중인 사용자는 2명
- load average: 0.06, 0.06, 0.07 : 1분, 5분, 15분 간의 시스템 평균 사용률
2행 - 프로세스의 상태
- Tasks: 299 total, 1 running, 290 sleeping, 8 stopped, 0 zombie
- 현재 실행중인 전체 프로세스는 299개,
- 실행중 1개,
- 대기 138개,
- 정지 0개,
- 좀비상태 0개
3행 - CPU 상태
- Cpu(s): 0.1%us, 0.0%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
- us: 사용자가 사용한 CPU 시간
- sy: 커널이 사용한 CPU 시간
- ni: niced 사용자 프로세스를 실행하는 데 소요 된 시간
- id: 대기시간
- wa: IO 대기 시간
- hi: 하드웨어 인터럽트 사용 시간
- si: 소프트웨어 인터럽트 사용 시간
- st: 하이퍼 바이저가 다른 프로세서를 처리하는 동안 가상 CPU가 대기하는 시간 - 숫자 1키를 누르면 각 cpu 상세 코어마다 목록을 볼수 있음
4행 - 메모리 상태
- Mem: 3925.5 total, 429.5 free, 1261.4 used, 2234.5 buff/cache
- 메모리 총 4G,
- 1.2G를 사용 중,
- 0.4G를 추가 사용 가능.
- 2G가 버퍼용/캐쉬 으로 사용중
5행 - 스왑 메모리 상태
- Swap: 1634.2 total, 1632.2 free, 2.0 used, 2373.9 avail Mem- 스왑 공간의 메모리
- (swap은 바로 밑 메모리 사용량 부분 확인에서 추가 설명 한다)
- PR - 우선순위
- NI - Nice value(-20~19 사이의 숫자이며 값이 작을수록 우선순위가 높음)
- VIRT - 작업에 사용된 가상 메모리 총사용량
- RES - 프로세스가 사용하는 실제 메모리양
- SHR - 프로세스가 사용하는 공유 메모리양
- S - 현재 프로세스의 상태를 나타냄
- TIME+ - 프로세스가 시작하여 사용한 CPU시간
엔터를 누르면 바로 지금 상태 사용량으로 갱신된다.
1초마다 자동 갱신을 하고 싶다면$ top -d 1옵션을 사용하면 된다.
mpstat 명령어
- CPU time을 CPU별로 측정
- CPU별로 불균형한 상태 확인
$ apt install sysstat # 명령어 설치
$ mpstat
pidstat 명령어
- TOP이랑 비슷하지만 지속적으로 변화하는 상황
MEMORY 사용량 확인
free 명령어
전체 메모리(사용하고 있는 메모리, 남은 메모리, 버퍼메모리) 에 대한 상태를 확인한다.
시스템의 실제메모리와 스왑메모리에 대한 사용현황 확인가능하다. 출력 정보의 기본 설정은 KB 단위이다.
$ free
옵션 | 의미 |
-b | 바이트 단위로 표현 |
-m | 메가바이트 단위로 표현 |
-g | 기가바이트 단위로 표현 |
-k | 킬로바이트 단위로 표현 |
-l | 최고/최저 메모리 상황 구분해서 표현 |
-s N | N초마다 출력 |
1행 - Mem
- 시스템의 메모리 총합은 3925M(4G)
- 사용중(used)인 메모리는 1.2G
- 사용 가능한(free) 메모리는 430MB
- 공유 중인(shared) 메모리 16MB
- 버퍼/캐쉬 메모리 2G
2행 - 스왑
- 스왑 공간 메모리 1634MB
- 스왑 사용중인 메모리 2MB
- 스왑 사용 가능한 메모리 1632MB
free 항목 도표 | 설명 |
Mem | 시스템의 물리적인 메모리에 대한 사용량 |
Swap | 스왑이라는 특정 메모리영역에 대한 사용량 |
Total | 전체메모리 용량(kbyte 단위) |
Used | 현재 시스템에서 사용중인 메모리 용량 |
Free | 현재 시스템에서 사용하지 않은 메모리 용량 |
Shared | 현재 시스템에서 공유한 메모리 용량 |
Buff/cache | 현재 캐시메모리에서 버퍼링된 사용량 표시 |
Available | 쓸수 있는 가용메모리 용량 |
Cache 와 Buffer 란?
리눅스는 항상 여유 메모리 공간을 Buffer와 Cache로 사용하려고 시도하는 특징을 가지고 있다.
이 원리는 메모리에 데이터를 저장해서 느린 디스크로의 접근을 최대한 줄여 성능을 향상 시키는 것이다.
Buffer는 버퍼 캐시로 디바이스 블록에 대한 메타데이터들을 메모리에 캐싱한 크기다.
- 주기억 장치와 주변장치 사이에서 데이터를 주고 받을 때 정보를 임시로 기억해두고, 사용할 수 있는 공간 빠른쪽에서 느린쪽으로 데이터를 보낼 때 손실이 일어나는 것을 막기 위해서도 쓰인다.
- 버퍼가 사용되면 CPU는 입출력 자료를 기다릴 필요 없이 입력이나 출력 명령을 내릴 수 있다.
- 블록 디바이스로부터 데이터를 읽어오기 위해 필요한 정보들을 메모리에 저장해 둔다.
Cache는 페이지 캐시와 slab으로 사용중인 메모리 크기다.
- 페이지 캐시는 한 번 디스크로 읽어온 데이터를 메모리에 저장하여 같은 데이터를 다시 읽을 때 디스크로 요청하지 않고 메모리에서 바로 읽어올 수 있게 한다. (기본 캐시 원리)
- slab은 커널에서 관리하는 커널 오브젝트를 저장하는 단위 이다.
커널은 애플리케이션 할당 단위인 페이지 보다 작은 단위인 slab 단위로 메모리를 사용한다.
하나의 메모리 페이지에 여러 slab들이 존재할 수 있다.
slab에 파일의 inode나 dentry 정보들을 캐싱할 수 있다.
위 free 명령어 결과 메모리 사용량 출력 도표에서, total 대비 free memory는 얼마 되지 않고 cached와 buffers의 크기가 큰 것을 알 수 있다.
이유는 리눅스 커널에서는 프로세스가 반납한 메모리를 곧장 free로 돌리지 않기 때문이다. 즉, 버퍼/캐쉬는 실행 중인 프로그램이 메모리가 필요하다면 곧바로 대체될 수 있는 free memory인 셈이다.
커널 이란?
커널은 OS계층이며 HW와 컴퓨터에서 돌아가는 프로그램들을 연결해주는 역할을 한다.
커널은 OS의 핵심이며 컴퓨터를 부팅시키면 가장먼저 메모리에 올라오고 그리고는 컴퓨터가 꺼질때 까지 내내 메모리에 상주하게 된다.
커널은 모든 어플리케이션에게 인터페이스를 제공하며 HW를 컨트롤하고 프로세스들이 서로 정보를 주고 받는것을 허락해준다.
SWAP 이란?
스왑은 디스크의 일정 부분을 메모리 공간 부족시 메모리처럼 사용하기 위해 설정해둔 공간 이다. 예를 들어, RAM이 부족할때 하드디스크를 swap memory로 만들어 RAM처럼 사용한다.
커널은 메모리가 부족한 상황에서는 Buffer와 Cache로 할당된 것 중에 자주 사용 되지 않는 것들을 비우고 메모리에 할당을 하려고 시도한다. 또한 메모리에 있는 데이터 중 최근 자주 사용되지 않은 데이터를 SWAP 공간으로 이동시킨다. (SWAP-OUT)
그리고 SWAP으로 옮겨진 데이터를 프로세스가 읽기 위해 메모리로 데이터를 다시 가져오는 원리이다. (SWAP-IN)
하지만 이는 디스크로부터 옮겨 졌던 데이터를 다시 메모리로 가져오기 때문에 레이턴시(latency)가 길어져 결국 성능 저하로 이어진다.
레이턴시(latency)는 자극과 반응 사이의 시간이며, 더 일반적인 관점에서는 관찰되는 시스템에서의 어떠한 물리적 변화에 대한 원인과 결과 간의 지연 시간이다. 레이턴시는 물리적 상호작용이 추진할 수 있는, 물리적으로 제한된 속도의 결과라고 할 수 있다.
📣 즉, 일시적인 메모리 사용 증가로 일정 SWAP을 사용하는 상황과, 지속적인 메모리 부족으로 인해 SWAP이 커지는 경우를 지속적으로 모니터링 하여 메모리 증설 시점을 고려해야 한다.
리눅스는 윈도우와 다르게 메모리를 최대한 활용한다. 현재 시스템의 메모리 사용량을 확인할 때는 1행의 used와 2행의 used를 모두 확인하여 버퍼와 캐쉬로 활용되는 메모리를 잘 확인해야 한다.
cat /proc/meminfo 명령어
/proc 아래에는 현재 실행중인 프로세스의 정보와 시스템의 정보가 저장되어 있다.
그중 /meminfo에는 현재 메모리 사용 정보가 저장된다. 현재 시스템의 전체 메모리(MemTotal), 가용 메모리(MemAvailable)를 이용해 현재 시스템의 메모리 정보를 확인할 수 있다.
다만, 실제로 free에서 나온 메모리 저보랑 약간 다르다는 점은 유의하자. (free에선 버퍼크기가 있는데 meminfo에선 없다)
free -k 명령에 대응되는 /proc/meminfo 표
free명령어에서 결과값이랑 meminfo에서 확인한 결과값이랑 매칭되는 비교 표 이다.
free output | /proc/meminfo |
Mem: total | MemTotal |
Mem: used | MemTotal - MemFree |
em: free | MemFree |
Mem: shared (요즘은 무시할 수 있습니다. 의미가 없습니다.) | N / A |
Mem: buffers | Buffers |
Mem: cached | Cached |
-/+ buffers/cache: used | MemTotal - (MemFree + Buffers + Cached) |
-/+ buffers/cache: free | MemFree + Buffers + Cached |
Swap: total | SwapTotal |
Swap: used | SwapTotal - SwapFree |
Swap: free | SwapFree |
DISK 사용량 확인
mount가 되어있는 디스크 정보를 나열한다.
$ df -h # 디스크 남은 용량(여유 용량) 확인
$ du -h # : 현재 디렉토리에서 서브 디렉토리까지 사용량 확인
+ 디스크 명령어에 대한 상세한 카리큘럼은 따로 포스팅했다.
NETWORK 정보 확인
hostname -I (대문자 i) 명령어
$ hostname -I
ifconfig 명령어
현재 IP 및 Mac address 확인이 가능하며, Rx & Tx packets 및 errors, drop 등의 많은 정보를 보여준다.
# active 상태인 network port만 정렬
$ ifconfig
# 모든 network 장치를 확인
$ ifconfig -a
# enp0라는 이더넷에 아이피 192.168.0.9를 설정
$ ifconfig enp0 192.168.0.9
# enp0라는 이더넷에 서브넷 마스크만 255.255.255.224로 설정한다.
$ ifconfig enp0 netmask 255.255.255.224
# enp0라는 이더넷에 브로드캐스트주소만 192.168.0.255로 설정한다.
$ ifconfig enp0 broadcast 192.168.0.255
# enp0라는 이더넷에 아이피 192.168.0.9를 설정하고, 서브넷마스크를 255.255.255.224로 설정한다.
$ ifconfig enp0 192.168.0.9 netmask 255.255.255.224
# enp0라는 이더넷을 올린다(활성화한다).
$ ifconfig enp0 up
# enp0라는 이더넷을 내린다(비활성화한다).
$ ifconfig enp0 down
ifconfig 항목 정보
- [enp0s3] : 네트워크 인터페이스
- [flags] : 네트워크 카드의 상태 표시
- [mtu] : 네트워크 인터페이스의 최대 전송 단위(Maximum Transfer Unit)
- [inet] : 네트워크 인터페이스에 할당된 IP 주소
- [netmask] : 네트워크 인터페이스에 할당된 넷마스크 주소
- [broadcast] : 네트워크 인터페이스에 할당된 브로드캐스트 주소
- [inet6] : 네트워크 인터페이스에 할당된 IPv6 주소
- [prefixlen] : IP 주소에서 서브 넷 마스크로 사용될 비트 수
- [scopeid] : IPv6의 범위. LOOPBACK / LINKLOCAL / SITELOCAL / COMPATv4 / GLOBAL
- [ether] : 네트워크 인터페이스의 하드웨어 주소
- [RX packets] : 받은 패킷 정보
- [TX packets] : 보낸 패킷 정보
- [collision] : 충돌된 패킷 수
- [Interrupt] : 네트워크 인터페이스가 사용하는 인터럽트 번호
ip a 명령어
ifconfig와 거의 흡사하지만 rx, tx에 관한 정보는 따로 없으며 UP & DOWN 정보와 ip 및 mac 정보를 확인이 가능하다.
$ ip a
$ ip addr show # 같은 명령어
# 참고자료
https://www.binarytides.com/linux-cpu-information/
https://allthatlinux.com/dokuwiki/doku.php?id=rhel_proc_meminfo_%EC%84%A4%EB%AA%85
https://taehoons.tistory.com/3
https://www.whatap.io/ko/blog/11/
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.