Linux 시스템 이하에 할당된 메모리 사용율을 확인하기 위해서는 아래와 같이 free, vmstat, top 등의 명령들을 통해서 확인 가능하다.
[root@TestDB ~]# [root@TestDB ~]# free total used free shared buffers cached Mem: 263205528 180578384 82627144 0 1219604 20582248 -/+ buffers/cache: 158776532 104428996 Swap: 104856244 2288948 102567296 [root@TestDB ~]# [root@TestDB ~]# [root@TestDB ~]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 7 8 2288948 82598264 1219612 20582256 0 0 2100 201 0 0 3 1 95 1 0 [root@TestDB ~]# [root@TestDB ~]# [root@TestDB ~]# [root@TestDB ~]# top top - 17:05:25 up 59 days, 22:10, 18 users, load average: 8.43, 10.74, 17.59 Tasks: 2053 total, 4 running, 2047 sleeping, 0 stopped, 2 zombie Cpu(s): 2.6%us, 1.1%sy, 0.0%ni, 94.8%id, 1.4%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 263205528k total, 180612584k used, 82592944k free, 1219620k buffers Swap: 104856244k total, 2288948k used, 102567296k free, 20583012k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 25418 root 3 -20 39864 11m 1376 R 52.0 0.0 5925:11 scopeux 22680 oracle 15 0 124g 1.8g 60m S 29.5 0.7 15:46.00 oracle 29287 oracle 15 0 122g 25m 20m S 29.5 0.0 0:00.89 oracle 22672 oracle 15 0 124g 1.8g 72m S 24.3 0.7 15:44.69 oracle 22674 oracle 15 0 124g 1.8g 59m S 24.3 0.7 15:30.99 oracle 22678 oracle 15 0 124g 1.8g 75m S 19.1 0.7 15:35.11 oracle 22684 oracle 15 0 124g 1.8g 66m R 17.3 0.7 15:25.87 oracle 24628 root 3 -20 35164 11m 1084 S 17.3 0.0 32356:38 perfd 22682 oracle 15 0 124g 1.8g 65m S 13.9 0.7 18:25.16 oracle 32329 root 24 0 170m 22m 1004 R 12.1 0.0 1770:40 OSWatcher.sh 22676 oracle 15 0 124g 1.8g 66m S 10.4 0.7 15:48.69 oracle 22686 oracle 15 0 124g 1.8g 65m S 10.4 0.7 15:33.69 oracle
. . .
생략
|
위와 같이 상기 명령들을 통해 Memory의 전체적인 사용 추이를 확인하는 것은 문제가 없지만 실제 Memory를 할당받아 사용하는 프로세스 주체를 일관적으로 확인하는 것에는 한계가 있다.
때문에 만약 실제 Used Memory 정확한 사용 주체들의 확인이 필요하다면 아래와 같이 ps 명령 및 이하 -eo 옵션을 통해 확인이 가능하며, 3번째 필드에 표기되는 값이 해당 프로세스(PID)에 할당된 실제 Real Memory 값이다.
※ man ps - resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).
[root@TestDB ~]# [root@TestDB ~]# ps -eo user,pid,rss,comm --sort -rss | awk '$3 > 0 {print $0}' USER PID RSS COMMAND oracle 12374 1595492 oracle oracle 12356 1544144 oracle oracle 12242 1481856 oracle oracle 12413 1480760 oracle oracle 12432 1415176 oracle oracle 12291 1397780 oracle oracle 12402 1349768 oracle oracle 12345 1331152 oracle oracle 12366 1314768 oracle oracle 12383 1314764 oracle oracle 12335 1285240 oracle oracle 12270 1266672 oracle oracle 12324 1135604 oracle oracle 12313 857024 oracle oracle 12282 643944 oracle oracle 29534 336776 oracle grid 20002 289768 ocssd.bin oracle 29538 274048 oracle root 14393 261780 iAgent oracle 3021 200152 oracle oracle 3029 163804 oracle root 23495 144540 ologgerd . . . 생략
|
조금더 들여다보면, ps 명령의 -o 옵션으로 출력 할 수 있는 rss 값은 Linux 시스템 이하 /proc/PID번호/status 파일에 생성 및 갱신되는 VmRSS 값을 호출하여 보여주게 된다.
[root@TestDB ~]# [root@TestDB ~]# cat /proc/12374/status | grep -i vmrss VmRSS: 1595508 kB [root@TestDB ~]# [root@TestDB ~]# |
따라서 만약 특정 User 이하에 생성된 전체 프로세스 수와 해당 User이하에 생성된 프로세스들이 점유중인 메모리 사용량의 합계 확인이 필요하다면 아래와 같은 Shell Script 를 통해 간단히 확인이 가능하다.
[root@TestDB ~]# [root@TestDB ~]# ./use_realmem.sh [USER = avahi] [Process = 2] [Real Memory = 1120 KByte] [USER = coktcdc] [Process = 2] [Real Memory = 3272 KByte] [USER = dbus] [Process = 1] [Real Memory = 432 KByte] [USER = epiadmin] [Process = 6] [Real Memory = 157456 KByte] [USER = grid] [Process = 48] [Real Memory = 911104 KByte] [USER = gsm] [Process = 2] [Real Memory = 11096 KByte] [USER = ntp] [Process = 1] [Real Memory = 4888 KByte] [USER = oracle] [Process = 411] [Real Memory = 83658752 KByte] [USER = root] [Process = 84] [Real Memory = 1042552 KByte] [USER = rpc] [Process = 1] [Real Memory = 584 KByte] [USER = sas] [Process = 102] [Real Memory = 146780 KByte] [USER = sycros] [Process = 1] [Real Memory = 13028 KByte] [USER = uuidd] [Process = 1] [Real Memory = 60 KByte] [USER = xfs] [Process = 1] [Real Memory = 560 KByte]
Total use Real Memory - 85951684 KByte
[root@TestDB ~]# [root@TestDB ~]# [root@TestDB ~]# cat ./use_realmem.sh #!/bin/bash
LIST_FILE=`ps -eo user,pid,rss,comm --sort -rss | awk '$3 > 0 {print $1}' | sort -u | grep -v "USER"` TOTAL_SUM=0
for LIST in ${LIST_FILE}; do PROC_COUNT=`ps -eo user,pid,rss,comm --sort -rss | awk '$3 > 0 && $1 ~ /^'"${LIST}"'$/ {print $0}' | wc -l` MEM_LIST=`ps -eo user,pid,rss,comm --sort -rss | awk '$3 > 0 && $1 ~ /^'"${LIST}"'$/ {print $3}'` MEMSUM=0 for M_LIST in ${MEM_LIST}; do MEMSUM=`expr ${MEMSUM} + ${M_LIST}` done TOTAL_SUM=`expr ${TOTAL_SUM} + ${MEMSUM}`
echo -e "[USER = ${LIST}] \t[Process = ${PROC_COUNT}] \t[Real Memory = ${MEMSUM} KByte]" done
echo echo "Total use Real Memory - ${TOTAL_SUM} KByte" echo [root@TestDB ~]# |
다음은 Linux 시스템 이하에 생성 및 할당되는 메모리 유형중 하나인 Kernel 이 점유하는 시스템 메모리를 확인는 과정이며 아래와 같이 slab cache 정보를 확인하게 된다.
slab cache란 kernel cache 라고도 불리며, Linux Kernel에서 디바이스 드라이버와 파일시스템간 일시적인 데이터들을 처리를(inode, task, device info)하기 위해 임시 할당하여 사용하는 영역을 slab cache 라 칭한다.
[root@TestDB ~]# [root@TestDB ~]# cat /proc/meminfo | grep -i slab Slab: 1866712 kB [root@TestDB ~]#
[root@TestDB ~]# [root@TestDB ~]# slabtop
Active / Total Objects (% used) : 9534996 / 11330889 (84.2%) Active / Total Slabs (% used) : 447598 / 447695 (100.0%) Active / Total Caches (% used) : 115 / 173 (66.5%) Active / Total Size (% used) : 1517504.15K / 1767066.88K (85.9%) Minimum / Average / Maximum Object : 0.02K / 0.16K / 128.00K
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 4937160 4727996 95% 0.09K 123429 40 493716K buffer_head 856242 756950 88% 0.21K 47569 18 190276K cfq_pool 1390650 1387869 99% 0.12K 46355 30 185420K size-128 277123 192370 69% 0.52K 39589 7 158356K radix_tree_node 690734 450605 65% 0.17K 31397 22 125588K vm_area_struct 53756 49740 92% 2.00K 26878 2 107512K size-2048 5788 5783 99% 16.00K 5788 1 92608K size-16384 595800 505953 84% 0.12K 19860 30 79440K cfq_ioc_pool 291870 136503 46% 0.21K 16215 18 64860K dentry_cache 82736 82401 99% 0.50K 10342 8 41368K size-512 45935 31831 69% 0.74K 9187 5 36748K ext3_inode_cache . . . 생략
|
위 과정들에서 확인된 메모리 값을 합친다면 Linux 시스템에서 사용하는 실제 Used Real Memory의 값을 구할 수 있을 것이며, free 명령을 통해 출력된 buffers memory 값과 비교해 보도록 하자.
[root@TestDB ~]# [root@TestDB ~]# free -k total used free shared buffers cached Mem: 263205528 213536156 49669372 0 1283264 16980456 -/+ buffers/cache: 195272436 67933092 Swap: 104856244 2289528 102566716 [root@TestDB ~]# [root@TestDB ~]# [root@TestDB ~]# |
User process 점유 메모리 총합 - 85951684 KB
Kernel 점유 Slab Cache - 1866712 KB
85951684 + 1866712 = 87818396 KB
응?!
free 명령이하 buffers memory 값과 User process + Kernel slab cache 이 값이 서로 상이하다.
195272436 KB - 87818396 KB = 107454040 KB의 차이가 생겨난다.
왜 이런 결과가 나오는 것일까?
Linux 시스템은 커널 기반 데이터 처리를 회피하고 프로세스 또는 스레드간 데이터 복제를 회피하여 내부 프로세스간 통신 및 I/O 작업의 효율성을 높이기 위한 일환으로 Shared Pool Memory 를 제공한다.
Shared Memory는 세마포어 알고리즘에 의해 프로세스 또는 프로세스 이하 쓰레드간 데이터의 교환을 위한 작업 공간에 사용되며, Oracle DB와 같은 Application 들이 Shared Memory 를 사용하는 대표적인 Application 이다.
Shared Memory는 위에서 설명한 것 처럼 특정 프로세스가 계속 상주 및 점유하는 메모리가 아닌 프로세스간 데이터 교환에 사용되는 공유 영역이기 때문에 특정 프로세스에 종속된 것이 아니며, ps 등의 명령을 통해 확인 할 수 있는 프로세스와 그 메모리 정보에 표시 되지 않는다.
따라서 Linux System 이하에 할당된 Shared Memory를 확인하기 위해서는 아래와 같이 ipcs 명령을 통해 확인 할 수 있다.
[root@TestDB ~]# [root@TestDB ~]# [root@TestDB ~]# ipcs -m
------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x740181a7 263454720 root 600 4 0 0x7401817d 264142849 root 600 4 0 0x0000cace 264503298 root 666 2 0 0x7401817c 264110083 root 600 4 0 0x00000000 264536068 root 644 80 2 0x00000000 264568837 root 644 16384 2 0x00000000 264601606 root 644 280 2 0x0c6629c9 264634375 root 640 1166952 3 0x06347849 264667144 root 666 65544 2 0x31010095 264699913 root 666 131176 3 0x1878fe88 264962058 grid 660 4096 0 0x00000000 379125771 sas 600 15996 32 0x71966378 374439948 oracle 660 111267035136 384
[root@TestDB ~]# [root@TestDB ~]# [root@TestDB ~]# |
ipcs 명령을 통해 확인된 Shared Memory 점유 총합은 아래와 같은 명령을 통해 확인 가능하다.
[root@TestDB ~]# [root@TestDB ~]# SHR_MEM=0 && for LIST in `ipcs -m | egrep -v '^-|^key' | awk '{print $5}'`; do SHR_MEM=`expr ${SHR_MEM} + ${LIST}`; done && echo "${SHR_MEM}"
111268435658 [root@TestDB ~]# [root@TestDB ~]# echo "111268435658 / 1024" | bc
108660581
[root@TestDB ~]#
[root@TestDB ~]# |
이것으로 상기와 같이 위 free 명령이하 buffers 값에서 user process 및 slab cache 사용합을 차감한 메모리 점유분 값을 확인 할 수 있다.