타 프로젝트에서 지원 요청 온 것 들 중 하나가 리눅스 시스템에서의 메모리 관리입니다.
아시다시피 리눅스 시스템에서는 BSD계열이나 아니냐 등의 이유로 메모리 확인 방법은 조금씩 차이가 납니다.
일단 리눅스에서 메모리 확인 방법들에 대해 정리해봅니다.
1.top
개인적으로 많은 용도로 가장 빈번하게 활용하고 있습니다.^^;
총 메모리 사용량을 모니터링하는데 주로 사용하는데, 프로세스 당 메모리와 CPU사용량도 보여줍니다. 아래 설명할 free 명령어처럼 buffer와 cache 정보도 확인할 수 있습니다.
여기서 짚고 넘어가야 할 것은, 기본적으로 리눅스는 가장 빠른 성능을 위해 실행 중인 프로세스들이 요청하는 메모리를 제외한 메모리들 중 거의 대부분을 Disk cache로 사용한다는 점이다.
top 명령어를 실행해 보면 이를 알 수 있는데, Mem영역의 free 메모리 사이즈보다 Swap영역의 cached Mem 사이즈가 훨씬 큰 것을 볼 수 있다.
명령어를 실행하면 실시간 모니터링이 되는데, 옵션 키들을 사용할 수 있다.
shift + m - 메모리 사용량 우선순위 정렬
shift + p - CPU 사용량 우선순위 정렬
shift + t - 실행 시간 우선순위 정렬
shift + b - 상단 정보를 블럭 형태로 표시(htop과 유사)
1 - CPU 개수별 사용량
space bar - Refresh
u - 해당 유저의 프로스세만 표시
k - 해당 프로세스 kill
예)
top - 12:36:47 up 7 days, 5:55, 4 users, load average: 1.40, 1.16, 1.03
Tasks: 222 total, 2 running, 219 sleeping, 0 stopped, 1 zombie
%Cpu(s): 7.5 us, 15.7 sy, 0.2 ni, 76.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 12286940 total, 12027384 used, 259556 free, 415392 buffers
KiB Swap: 10239996 total, 240 used, 10239756 free. 1674928 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2111 mingyu.+ 20 0 1482888 112584 59068 S 19.2 0.9 1534:59 compiz
...
전체 물리 메모리 : 12286940 total (:=실 가용 메모리 + 실 사용 메모리)
실 가용 메모리 = free + buffers + cached Mem
: 259556 free + 415392 buffers + 1674928 cached Mem
실 사용 메모리 = used - (buffers + cached Mem)
: 12027384 used - (415392 buffers + 1674928 cached Mem)
2. htop
top 명령어의 또 다른 버전(???)!
개인적으로 잘 쓰지 않는데, 그 이유는 따로 설치를 해야하는 Util 명령어이다.
하지만 취향에 따라 자주 이용하는 사람들도 있으니 한번 테스트해보시고 판단해보시길^^;
조금 더 다양한 옵션이 있으니 활용해 보시길^^;
3. free
메모리 사용량을 확인할 때 사용하는 가장 단순하고 쉬운 명령어.
커널에서 사용하는 공유메모리/버퍼 양 표시
-/+ buffers/cache: 현재 cache 메모리에서 버퍼링된 사용량
-m : MB단위로 데이터 표시
-b : byte단위로 데이터 표시
-k : kilo byte 단위로 데이터 표시
-t : 맨 마지막에 total 량 표시
-o : buffer/cache 표시 안함
-s : 지정한 초단위(Regular interval)로 refresh
-l : low & High 메모리 크기 통계
-V : free명령의 버전 표시
예) free -m
total used free shared buffers cached
Mem: 11998 11646 352 73 369 1581
-/+ buffers/cache: 9695 2303
Swap: 9999 0 9999
전체 물리 메모리 : 11998 MB (:=실 가용 메모리 + 실 사용 메모리)
실 가용 메모리 2303 MB(free) = free + buffers + cached Mem
: 352 MB(free) + 369 MB(buffers) + 1581 MB(cached Mem)
실 사용 메모리 9695 MB(used) = used - (buffers + cached Mem)
: 11646 MB(used) - (369 MB:buffers + 1581 MB cached Mem)
참고) from zetawiki
MEM_TOTAL=`free | grep ^Mem | awk '{print $2}'`
MEM_FREE1=`free | grep ^Mem | awk '{print $4}'`
MEM_FREE2=`free | grep ^-/+ | awk '{print $4}'`
MEM_NOMINAL=`echo "100-(100*$MEM_FREE1/$MEM_TOTAL)" | bc -l`
MEM_ACTUAL=`echo "100-(100*$MEM_FREE2/$MEM_TOTAL)" | bc -l`
echo NOMINAL=${MEM_NOMINAL:0:5}% ACTUAL=${MEM_ACTUAL:0:5}%
4. vmstat -s
아래에서 다룰 proc 명령어와 같이 메모리 사용량 통계를 나타낸다.
예)
12286940 K total memory
11925908 K used memory
3084736 K active memory
1780388 K inactive memory
361032 K free memory
378504 K buffer memory
1619516 K swap cache
10239996 K total swap
240 K used swap
10239756 K free swap
18765788 non-nice user cpu ticks
222821 nice user cpu ticks
34041747 system cpu ticks
196753601 idle cpu ticks
137429 IO-wait cpu ticks
817 IRQ cpu ticks
27674 softirq cpu ticks
0 stolen cpu ticks
29867564 pages paged in
71060804 pages paged out
0 pages swapped in
61 pages swapped out
1121367295 interrupts
2630490277 CPU context switches
1456695684 boot time
34179 forks
5. /proc/meminfo
/proc/meminfo 파일을 읽으면 아래와 같이 vmstat -s, free 명령어와 유사한 메모리 사용량을 확인할 수 있다. 단, /proc 파일 시스템은 실제 파일이 아니라 커널과 시스템에 대한 동적인 정보를 담고 있는 가상 파일이다.
예) cat /proc/meminfo
MemTotal: 12286940 kB
MemFree: 354672 kB
Buffers: 378504 kB
Cached: 1619800 kB
SwapCached: 0 kB
Active: 3092044 kB
Inactive: 1779796 kB
Active(anon): 2097608 kB
Inactive(anon): 851532 kB
Active(file): 994436 kB
Inactive(file): 928264 kB
Unevictable: 32 kB
Mlocked: 32 kB
SwapTotal: 10239996 kB
SwapFree: 10239756 kB
Dirty: 1164 kB
Writeback: 0 kB
AnonPages: 2873720 kB
Mapped: 6757036 kB
Shmem: 75504 kB
Slab: 488308 kB
SReclaimable: 393892 kB
SUnreclaim: 94416 kB
KernelStack: 5968 kB
PageTables: 51824 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 16383464 kB
Committed_AS: 13987488 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 160940 kB
VmallocChunk: 34359492360 kB
HardwareCorrupted: 0 kB
AnonHugePages: 1406976 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 92416 kB
DirectMap2M: 12472320 kB
(참고)
프로세스의 PID를 알고 있다면
> cat /proc/"PID"/status 입력 시
VmSize : 전체 할당된 가상 메모리 크기
VmRSS : 실제 물리 메모리가 할당된 크기
VmLck : Swapout될 수 없는 메모리 크기
VmData : Heap 영역
VmStk : Stack 영역
VmExe : 실행코드 영역 (전역변수/실행코드)
VmLib : 동적 연결된 라이브러리 영역
C Code )
char cmd[1024];
sprintf(cmd, "/proc/%d/status", getpid();
FILE* fp = fopen(cmd, "r");
if(fp == NULL) return;
int nVmSize =0;
int nVmRss =0;
while(fgets(cmd, 1024, fp) != NULL) {
if(strstr(cmd, "VmSize")) {
char t[32];
char size[32];
sscanf(cmd, "%s%s", t, size);
nVmSize = atoi(size);
} else if(strstr(cmd, "VmRSS")) {
char t[32];
char size[32];
sscanf(cmd, "%s%s", t, size);
nVmRss = atoi(size);
break;
}
fclose(fp);
6. ps
> ps -ef --sort -rss
rss(Resident Set Size) : 물리 메모리를 실제 점유하고 있는 크기
가장 위에 있는 프로세스가 물리 메모리를 가장 많이 점유하고 있음!
> ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,comm --sort -rss | head -n 11
예)
USER PID PPID RSS SIZE VSZ %MEM %CPU TIME COMMAND
mingyu.+ 4885 4860 6622604 1662480 8779996 53.8 54.1 3-23:01:30 VirtualBox
mingyu.+ 10870 1771 955232 2542152 3321996 7.7 10.0 12:45:13 firefox
mingyu.+ 5824 5821 895860 4640832 5418932 7.2 1.6 02:54:53 java
mingyu.+ 2235 1771 235232 592760 1280776 1.9 0.0 00:08:27 thunderbird
mingyu.+ 31928 1771 215452 1913348 2753128 1.7 0.0 00:00:19 software-center
...
7. dmidecode
설치된 RAM 하드웨어 정보 표시.
type 17이 RAM. (그 외 L1/L2 cache 등)
예) dmidecode -t 17
# dmidecode 2.12
SMBIOS 2.7 present.
Handle 0x001A, DMI type 17, 34 bytes
Memory Device
Array Handle: 0x0019
Error Information Handle: 0x001C
Total Width: 64 bits
Data Width: 64 bits
Size: 8192 MB
Form Factor: SODIMM
Set: None
Locator: ChannelA-DIMM0
Bank Locator: BANK 0
Type: DDR3
Type Detail: Synchronous
Speed: 1333 MHz
Manufacturer: Samsung
Serial Number: 2343574B
Asset Tag: 0123456789
Part Number: M471B1G73BH0-CH9
Rank: Unknown
Configured Clock Speed: 1333 MHz
8. GUI Tools
gnome - gnome-system-monitor
KDE - ksysguard
'OS (Operating System) > Linux' 카테고리의 다른 글
Ubuntu에 PostgreSQL 설치하고 기본 명령 살펴보기 (0) | 2021.02.09 |
---|---|
scp, sshpass 사용법, 설치(리눅스 보안) (0) | 2020.12.07 |
셸 스크립트 문법 (0) | 2020.09.25 |
리눅스 셸(Shell), 환경 변수 (1) | 2020.09.25 |
telnet, ftp 사용법 (0) | 2020.09.25 |