티스토리 뷰

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 사용합을 차감한 메모리 점유분 값을 확인 할 수 있다.

 

반응형
댓글
  • 프로필사진 BlogIcon Shared mem value가 제로인디요 ㅜㅜ 2015.10.22 02:44
  • 프로필사진 Favicon of https://blog.helperchoi.com BlogIcon 불량펭귄 helperchoi 안녕하세요 방문 감사드립니다.

    우선 아래 예시와 같이 Shared Memory 는 가변적입니다.

    Shared Memory는 사용 주체 Aplication의 설정에 따라 가변적으로 늘거나 줄어 들 수 있으며,

    Kernel 에서는 최대 사용할 수 있는 임계값등만을 정해주게 끔 되어있습니다.

    따라서 시스템 상황에 따라 추이변화를 지켜 보시는 것도 좋을 것 같습니다.

    [root@s-node01 ~]#
    [root@s-node01 ~]# cat /etc/sysctl.conf | grep -i huge
    vm.nr_hugepages = 10
    [root@s-node01 ~]#
    [root@s-node01 ~]# cat /proc/meminfo | grep -i hugepagesize
    Hugepagesize: 2048 kB
    [root@s-node01 ~]#
    [root@s-node01 ~]# cat /etc/security/limits.conf | grep memlock
    # - memlock - max locked-in-memory address space (KB)
    helperchoi soft memlock 204800
    helperchoi hard memlock 204800
    [root@s-node01 ~]#
    [root@s-node01 ~]#
    [root@s-node01 ~]# ipcs -m

    ------ Shared Memory Segments --------
    key shmid owner perms bytes nattch status
    0x740089f7 1966080 root 600 4 0
    0x740089cd 2654209 root 600 4 0
    0x740089cc 2621443 root 600 4 0

    [root@s-node01 ~]#
    2015.10.22 18:04 신고
  • 프로필사진 포꾼 자료가 너무 좋아서 퍼가겠습니다. 2016.01.16 13:05
  • 프로필사진 Favicon of https://blog.helperchoi.com BlogIcon 불량펭귄 helperchoi 네 출처만 명시해 주시면 됩니다 ^^ 2016.01.16 20:25 신고
  • 프로필사진 불량건달 하나 궁금한게 저기서 결과가 shard mem 제외 하고 mem을 구할수 있나요?
    실 프로세스 및 실 사용 메모리를 구하려고하는데
    6.7의 오라클 사용중인데 실제 메모리 사용률을 구하고싶은데 shard mem 떄문에 안나오네요
    free 에서 일반적으로 구하는 메모리가 실제로 사용 하는 메모리라고 하는데 그럼 공유메모리도 포함을 해야되는거같은데 이거 계산 을 어찌하는지 확인을 못하겠습니다.

    ex)
    total used free shared buffers cached
    Mem: 132024908 107259616 24765292 50605020 38280 57507268
    -/+ buffers/cache: 49714068 82310840
    Swap: 33554428 8050572 25503856
    이 경우
    NOMINAL=81% ACTUAL=37%
    이러게 나오는데 실제가 37% 가 맞는지 확인이 안갑니다. shard mem을 더해야지되는지 그냥 저게 맞는지 저게 마지면
    지금 오라클이 60공유를 잡고 있는데 저것도 말이 안되서요 ;; 이거 실제 사용 mem을 구할수 있나요 ...
    2017.12.11 17:46
댓글쓰기 폼