티스토리 뷰

 

최초작성 : 2014/02/03

개정 : 2014/02/18

작성자 : 최광민 (helperchoi@gmail.com)

 

가. Linux 시스템의 Cache 메모리와 Swap 생성 메커니즘

 

1. Linux System 은 기본적으로 효율적인 I/O 처리를 위하여 여유 메모리에 대하여 Kernel 에서 Cache memory를 확보하려 노력하며, Cache 메모리에는 다음과 같은 종류가 있음


1) Buffer Cache 와 Swap Cache


OS 이하 생성된 Process는 들어온 요청에 대한 처리를 위해 Page cache set을 생성함.
이를 Process Working Set 이라 부르며  Working set은 Physical Memory 영역에 상주할때 가장 빠른 처리 속도를 확보하게 된다.


Working set에는 Shared Page Cache 와 Buffer Cache 가 존재하며 Buffer Cache 는 read/write I/0를 효율적으로 처리하기 위해 Disk Device와 I/O 입출력 kernel thread 사이에 Cache Memory를 확보하여 장치간 속도차로 인한 I/O Sync 시간차를 최소화하여 I/O 처리에 대한 효율성을 높이는 역활을 한다.

Physical Memory 영역에 생성된 Buffer Cache 중 write I/O가 수행된 Page Cache를 Dirty Page Cache 라 부르며, Dirty Page 의 수가 아래 kernel 이하 vm.dirty_background_ratio 임계 설정값을 초과 했을 경우 Dirty Page Cache를 Swapping 처리하게 된다.


이와 함께 Disk SWAP 영역에 캐싱된 Dirty Cache의 주소정보를 물리 메모리에 맵핑하기 위해 Physical Cache 영역에 Swap Cache 를 생성하게 되며,


아래 vm.dirty_ratio 임계값에 의해 System SWAP 영역에 Dirty Page를 허용 비율을 정의 되고, Swapping 된 Dirty Page의 비율이 vm.dirty_ratio 임계치를 초과할 경우 이후로 인입되는 Writte I/O 에 대한 요청은 지연 처리됨과 동시에 Swapping된 Dirty Page Cache를 비우는 동작을 취하게 된다.


[root@TestDB01 sa]# sysctl -a | grep dirty
vm.dirty_expire_centisecs = 2999
vm.dirty_writeback_centisecs = 499
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
[root@TestDB01 sa]#


 

2) Physical Memory 부족시 할당된 Page Cache 에 대한 강제 Swapping 처리


Linux Kernel 2.6 이후 버전부터 커널 페이징 알고리즘에 의해 Cache 메모리 영역에 상주된 어플리케이션 Cache중 사용되지 않고 오래된 Paging 리스트에 대해서 일정 비율로 Swap 메모리에 할당하여 시스템의 Physical 메모리 가용 효율을 높이려 노력하게 되며 Cache 내 paging 전환 비율은 아래와 같이 vm.swappiness 설정에 의해 결정 된다.


0일 경우 Physical Memory에 상주중인 paging 영역을 swap에 할당하지 않게 되며, 단 상기 1)번에서 언급된 vm.dirty_background_ratio 는 개별로 동작한다.


# Linux swappiness 기본값은 60% 이며, 0에 가까울 수록 Swap에 Paging 할당을 하지 않음


[root@TestVM01 ~]# sysctl -a | grep "vm.swappiness"

vm.swappiness = 10

[root@TestVM01 ~]#


따라서 Paging 영역이든 어플리케이션의 고유 할당 메모리 영역이든 Linux System 입장에서 Swapping 동작이 일어나는것은 시스템에 유입되는 다량의 I/O를 효율적으로 처리하기위해 System Cache를 확보하기 위해서나 부족한 물리 메모리를 확보하기 위한 일련의 알고리즘과 연관되며, 이것들에 의해 Physical Memory에 상주되어있던 Cache 에 대한 Swapping 동작으로 연결이 되기 때문에 Swapping 현상이 나타나는 것만으로도 시스템의 물리 메모리가 충분히 확보되어 있지 않다 판단 할 수 있다.

 


3) Kernel Cache


Linux Kernel에서 디바이스 드라이버와 파일시스템간 일시적인 데이터들을 처리를(inode, task, device info)하기 위해 임시 할당하여 사용하는 slab cache 형태이다.


[root@TestDB01 14955]#
[root@TestDB01 14955]# cat /proc/meminfo | grep Slab
Slab:          1608260 kB
[root@TestDB01 14955]#
[root@TestDB01 14955]#
[root@TestDB01 ~]#
[root@TestDB01 ~]# slabtop
[root@TestDB01 ~]#

Active / Total Objects (% used)    : 4390978 / 5200668 (84.4%)
 Active / Total Slabs (% used)      : 330999 / 332388 (99.6%)
 Active / Total Caches (% used)     : 115 / 173 (66.5%)
 Active / Total Size (% used)       : 1136437.95K / 1338207.19K (84.9%)
 Minimum / Average / Maximum Object : 0.02K / 0.26K / 128.00K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                  
630238 482969  76%    0.52K  90034        7    360136K radix_tree_node
1419690 1417218  99%    0.12K  47323       30  189292K size-128
776376 636632  82%    0.21K  43132       18    172528K cfq_pool
 55416  52421  94%    2.00K  27708      2    110832K size-2048
  6291   6291 100%   16.00K   6291      1    100656K size-16384
472770 404347  85%    0.12K  15759     30     63036K cfq_ioc_pool
196740 101418  51%    0.21K  10930     18     43720K dentry_cache
 74504  73733  98%    0.50K   9313      8     37252K size-512
181412 174578  96%    0.17K   8246     22     32984K vm_area_struct
 44172  35697  80%    0.58K   7362      6     29448K proc_inode_cache
  7092   6022  84%    4.00K   7092      1     28368K size-4096
 23228  22054  94%    1.00K   5807      4     23228K size-1024
 37366  35698  95%    0.55K   5338        7     21352K inode_cache
219912 208767  94%    0.09K   4998     44     19992K sysfs_dir_cache
 21400  16078  75%    0.75K   4280      5     17120K shmem_inode_cache
 58485  41230  70%    0.25K   3899       15     15596K filp
 19410   8273  42%    0.74K   3882      5     15528K ext3_inode_cache
139240  66161  47%    0.09K   3481       40     13924K buffer_head
 47760  37352  78%    0.25K   3184     15     12736K skbuff_head_cache
 37800  36807  97%    0.25K   2520       15     10080K size-256



2. Linux Physical Cache Memory 반납

1) Linux kernel 이하에 여러 유형으로 생성된 Cache 메모리를 반납하기 위해서 vm.vfs_cache_pressure 정의 값에 의해 free 또는 Buffer 로 반환하여 활용 할 수 있으며, 기본 값인 100보다 큰 값으로 정의 할 수록 반환 비율이 올라가지만, 시스템 inode cache 등이 반납되기 때문에 오히려 프로세스 및 장치간 I/O Sync 시간차 발생으로 인한 시스템 성능 저하의 소지 있다.

[root@TestDB01 /]#
[root@TestDB01 /]# sysctl -a | grep pressure
vm.vfs_cache_pressure = 100
[root@TestDB01 /]#
[root@TestDB01 /]#

echo 1000 > /proc/sys/vm/vfs_cache_pressure



2) Linux 시스템 이하에 생성된 Physical Cache 메모리에 대하여 일시성 반환처리를 위한 Parameter 로는 아래와 같은 방법론이 있으나 Page cache 와 inode cache 정보등이 반납하는 동작이기 때문에 Dirty page cache에 대한 동기 처리를 위해 별도의 sync 작업이 필요하며 시스템 오류의 가능성이 존재한다.

echo 1 > /proc/sys/vm/drop_caches --> Page Cache 반납
echo 2 > /proc/sys/vm/drop_caches --> Inode, dentry cache 반납
echo 3 > /proc/sys/vm/drop_caches --> 모두 반납


※ This is a non-destructive operation and dirty objects are not freeable, the user should run sync(8) first.

 

 

나. Linux System 상 Swap 사용 프로세스의 조회


1. 단순 Process 단위 Swap 메모리 점유순 조회

 

[root@TEST01 ~]#
[root@TEST01 ~]# ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,comm --sort -vsize | head -n 10
USER       PID  PPID   RSS    SZ    VSZ %MEM %CPU     TIME COMMAND
mysql     3627  3577 22860 129784 188808  4.4 0.0 00:00:39 mysqld
root      1543     1 32792 31028  38936  6.4  0.0 00:00:00 iscsiuio
root      2424     1 17948 15372 261028  3.5  0.0 00:00:11 yum-updatesd
root      2146     1  8008 14568 158552  1.5  0.0 00:00:11 snmpd
root      1907     1 12460 10868  16556  2.4  0.0 00:00:04 mdmpd
root      1753     1   776 10548  27344  0.1  0.0 00:00:00 auditd
root      1755  1753   740 10528  16284  0.1  0.0 00:00:00 audispd
root      2160     1  2824  2464 143776  0.5  0.0 00:00:01 snmptrapd
68        2037     1  3968  2372  30912  0.7  0.0 00:00:27 hald
[root@TEST01 ~]#


※ vsize - total VM size in kB (man ps)

 


2. Process 이하 Thread 단위의 상세한 Swap 사용현황 조회를 위한 shell scipt

 

 [root@TestVM01 ~]#
[root@TestVM01 ~]# vi use_swap.sh
#!/bin/bash

 

export LANG=C
export LC_ALL=C

 

# /proc 이하 PID 별 swap 사용 Raw 데이터 생성
find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' | xargs -i{} grep -Hi Swap {}/smaps 2>&1 | grep -v "No such" | grep -v "0 kB" > swap.list
RAWDATA=swap.list

 

SWAP_TOTAL=0

# PID 유일값 추출 및 이하 SWAP 사용율 계산
for LIST in `cat ${RAWDATA} | cut -d "/" -f 3 | sort -u`
do
 #PID별 이하 thread 들의 SWAP 사용 총합 계산
 MEMSUM=0
 for SWAP_LIST in `cat ./${RAWDATA} | awk '$1 ~ /^\/proc\/'"${LIST}"'\// {print $2}'`
 do
  MEMSUM=`expr ${MEMSUM} + ${SWAP_LIST}`
 done
 
 PROC_USER=`ps -ef | awk '$2 ~ /^'"${LIST}"'$/ {print $1}'`
 PROC_PATH=`ps -ef | awk '$2 ~ /^'"${LIST}"'$/ {print $8}'`
 
 echo -e "PID ${LIST} / User : ${PROC_USER} / Swap use Total : ${MEMSUM} KByte / Path : ${PROC_PATH}" 

 SWAP_TOTAL=`echo "${SWAP_TOTAL} + ${MEMSUM}" | bc`
done

 

echo

echo "Total Swap Size - ${SWAP_TOTAL} KByte"
echo "RAW Data is - `pwd`/${RAWDATA}"

 

[root@TestVM01 ~]#
[root@TestVM01 ~]#
[root@TestVM01 ~]# sh ./use_swap.sh
PID 1 / User : root / Swap use Total : 88 KByte / Path : /sbin/init
PID 2085 / User : root / Swap use Total : 132 KByte / Path : auditd
PID 2110 / User : root / Swap use Total : 196 KByte / Path : /sbin/rsyslogd
PID 2175 / User : root / Swap use Total : 60 KByte / Path : irqbalance
PID 2272 / User : dbus / Swap use Total : 132 KByte / Path : dbus-daemon
PID 2288 / User : root / Swap use Total : 544 KByte / Path : cupsd
PID 2314 / User : root / Swap use Total : 104 KByte / Path : /usr/sbin/acpid
PID 2323 / User : 68 / Swap use Total : 220 KByte / Path : hald
PID 2324 / User : root / Swap use Total : 164 KByte / Path : hald-runner
PID 2353 / User : root / Swap use Total : 40 KByte / Path : hald-addon-input:
PID 2369 / User : 68 / Swap use Total : 76 KByte / Path : hald-addon-acpi:
PID 2386 / User : root / Swap use Total : 556 KByte / Path : /usr/sbin/sshd
PID 2394 / User : ntp / Swap use Total : 408 KByte / Path : ntpd
PID 2402 / User : ganglia / Swap use Total : 512 KByte / Path : /usr/sbin/gmond
PID 2481 / User : root / Swap use Total : 704 KByte / Path : /usr/libexec/postfix/master
PID 2490 / User : postfix / Swap use Total : 704 KByte / Path : qmgr
PID 2505 / User : root / Swap use Total : 108 KByte / Path : /usr/sbin/abrtd
PID 2513 / User : root / Swap use Total : 104 KByte / Path : abrt-dump-oops
PID 2546 / User : root / Swap use Total : 2224 KByte / Path : /opt/HP/Discovery/bin/discagnt
PID 2584 / User : root / Swap use Total : 27100 KByte / Path : /usr/lib64/R/bin/Rserve
PID 2599 / User : root / Swap use Total : 164 KByte / Path : /usr/sbin/atd
PID 2625 / User : root / Swap use Total : 64 KByte / Path : /sbin/mingetty
PID 2627 / User : root / Swap use Total : 68 KByte / Path : /sbin/mingetty
PID 2629 / User : root / Swap use Total : 64 KByte / Path : /sbin/mingetty
PID 2631 / User : root / Swap use Total : 68 KByte / Path : /sbin/mingetty
PID 2633 / User : root / Swap use Total : 64 KByte / Path : /sbin/mingetty
PID 2635 / User : root / Swap use Total : 68 KByte / Path : /sbin/mingetty
PID 33893 / User : sycros / Swap use Total : 4680 KByte / Path : /home/sycros/bin/scagent
PID 33901 / User : root / Swap use Total : 200 KByte / Path : /home/sycros/bin/scsystem
PID 33910 / User : root / Swap use Total : 32 KByte / Path : /home/sycros/bin/sdagent
PID 4292 / User : root / Swap use Total : 232 KByte / Path : /sbin/udevd
PID 4293 / User : root / Swap use Total : 236 KByte / Path : /sbin/udevd
PID 892 / User : root / Swap use Total : 116 KByte / Path : /sbin/udevd

 

Total Swap Size - 40232 KByte
RAW Data is - /root/shell/swap.list

[root@TestVM01 ~]#

 

 

※ 관련 파라메터 참조

 

http://www.westnet.com/~gsmith/content/linux-pdflush.htm

 

[root@s-node01 shell]#
[root@s-node01 shell]# cat /proc/sys/vm/dirty_expire_centisecs
3000
[root@s-node01 shell]#

[root@s-node01 shell]# cat /proc/sys/vm/dirty_writeback_centisecs
500
[root@s-node01 shell]#

[root@s-node01 shell]# cat /proc/sys/vm/nr_pdflush_threads
2
[root@s-node01 shell]#

[root@s-node01 shell]#
[root@s-node01 shell]# cat /proc/sys/vm/dirty_background_ratio
10
[root@s-node01 shell]#
[root@s-node01 shell]#

[root@s-node01 shell]#
[root@s-node01 shell]# cat /proc/sys/vm/dirty_ratio
40
[root@s-node01 shell]#

[root@s-node01 shell]#
[root@s-node01 shell]# cat /proc/sys/vm/swappiness
60
[root@s-node01 shell]#

[root@s-node01 shell]# cat /proc/sys/vm/vfs_cache_pressure
100
[root@s-node01 shell]#

 

반응형
댓글
댓글쓰기 폼