[Memory] 커널 메모리 관리
- 메모리증가시 active anon이 매우 증가하여 active anon을 확인하기 위해서
- 로그> OOM Killer 동작시 메모리 로그
Mem-info:
DMA per-cpu:
CPU 0: hi: 186, btch: 31 usd: 162
CPU 1: hi: 186, btch: 31 usd: 181
active_anon:59862 inactive_anon:19 isolated_anon:0
active_file:0 inactive_file:0 isolated_file:0
unevictable:53189 dirty:0 writeback:0 unstable:0
free:2021 slab_reclaimable:686 slab_unreclaimable:4562
mapped:7264 shmem:51864 pagetables:331 bounce:0
DMA free:8084kB min:8192kB low:10240kB high:12288kB active_anon:239448kB inactive_anon:76kB active_file:0kB inactive_file:0kB unevictable:212756kB isolated(anon):0kB isolated(file):0kB present:520192kB mlocked:0kB dirty:0kB writeback:0kB mapped:29056kB shmem:207456kB slab_reclaimable:2744kB slab_unreclaimable:18248kB kernel_stack:1256kB pagetables:1324kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? yes
lowmem_reserve[]: 0 0 0 0
DMA: 39*4kB 1*8kB 3*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 1*1024kB 1*2048kB 1*4096kB = 8084kB
105053 total pagecache pages
0 pages in swap cache
Swap cache stats: add 0, delete 0, find 0/0
Free swap = 0kB
Total swap = 0kB
131072 pages of RAM
2755 free pages
4304 reserved pages
5248 slab pages
20334 pages shared
0 pages swap cached
[ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name
[ 356] 0 356 757 336 1 0 0 hotplug
[ 357] 0 357 757 336 0 0 0 hotplug
[ 405] 0 405 757 336 0 0 0 hotplug
[ 406] 0 406 757 336 0 0 0 hotplug
[ 661] 0 661 766 124 0 0 0 syslog-ng
[ 662] 0 662 3102 343 0 0 0 syslog-ng
[ 773] 0 773 1092 759 1 0 0 dhcrelay_monito
[ 781] 0 781 787 302 1 0 0 cron
[ 974] 0 974 707 225 0 0 0 elemBaseLoader
[ 1032] 0 1032 715 316 1 0 0 elemLoader
[ 1033] 0 1033 472 139 0 0 0 linxdisc
[ 1034] 0 1034 1066 355 1 0 0 psm_linux
[ 1049] 0 1049 978 261 1 0 0 nameServer
[ 1050] 0 1050 964 192 0 0 0 fmErrHandler
[ 1051] 0 1051 967 272 0 0 0 bcsServer
[ 1052] 0 1052 967 249 1 0 0 eventMgr
[ 1053] 0 1053 742 303 1 0 0 logProxy
[ 1054] 0 1054 3036 335 0 0 0 fmSlave
[ 1108] 0 1108 1016 360 1 0 0 fmMaster
[ 1113] 0 1113 1000 313 1 0 0 fmMgmt
[ 1119] 0 1119 1277 315 1 0 0 logServer
[ 1131] 0 1131 713 301 1 0 0 cfgMgr
[ 1141] 0 1141 711 248 1 0 0 logFilter
[ 1146] 0 1146 700 262 1 0 0 releaseSlave
[ 1151] 0 1151 1002 329 0 0 0 releaseMgr
[ 1166] 0 1166 702 236 1 0 0 moiProxy
[ 1171] 0 1171 702 239 1 0 0 moiServer
[ 1180] 0 1180 1115 399 0 0 0 cmdProxy
[ 1185] 0 1185 1153 423 1 0 0 cmdDaemon
[ 1191] 0 1191 710 244 0 0 0 samServer
[ 1197] 0 1197 710 245 1 0 0 samServer
[ 1214] 0 1214 702 242 1 0 0 cmdHistory
[ 1219] 0 1219 707 255 1 0 0 modInfo
[ 1229] 0 1229 711 246 0 0 0 dpsServer
[ 1240] 0 1240 710 234 0 0 0 systemCmds
[ 1245] 0 1245 742 300 1 0 0 chassisMgr
[ 1250] 0 1250 701 232 1 0 0 restartMgr
[ 1255] 0 1255 709 295 0 0 0 HAMonServer
[ 1266] 0 1266 5057 1435 1 0 0 nsm
[ 1349] 0 1349 3979 2455 0 0 0 imi
[ 1354] 0 1354 2167 606 0 0 0 zsysmd
[ 1359] 0 1359 2134 809 0 0 0 zasd
[ 1372] 0 1372 3706 2170 1 0 0 zifmd
[ 1397] 0 1397 1948 729 1 0 0 mstpd
[ 1402] 0 1402 1835 635 1 0 0 lacpd
[ 1417] 0 1417 1164 259 1 0 0 aaad
[ 1422] 0 1422 1969 814 1 0 0 snmpd
[ 1427] 0 1427 2160 602 1 0 0 zsysstatd
[ 1432] 0 1432 1830 582 1 0 0 authd
[ 1437] 0 1437 1781 547 1 0 0 rmond
[ 1444] 0 1444 2219 646 1 0 0 ulsd
[ 1459] 0 1459 2072 679 1 0 0 onmd
[ 1468] 0 1468 2112 536 0 0 0 nflowd
[ 1483] 0 1483 796 349 1 0 0 chkptServer
[ 1652] 0 1652 3517 505 1 0 0 ntpd
[ 1715] 0 1715 1427 337 0 -17 -1000 sshd
[ 1737] 0 1737 692 215 0 0 0 inetd
[31982] 0 31982 629 212 0 0 0 sulogin
[27630] 0 27630 471 124 0 0 0 sleep
[27631] 0 27631 788 239 1 0 0 cron
[27632] 0 27632 468 144 1 0 0 run-parts
[27638] 0 27638 658 268 1 0 0 inetd_cron
[27639] 0 27639 478 147 1 0 0 pidof
[27644] 0 27644 471 124 0 0 0 sleep
[27645] 0 27645 757 120 0 0 0 hotplug
[27646] 0 27646 757 120 0 0 0 hotplug
[27647] 0 27647 442 76 0 0 0 cat
[27648] 0 27648 477 81 1 0 0 grep
[27649] 0 27649 695 85 1 0 0 awk
[27650] 0 27650 757 131 0 0 0 hotplug
[27651] 0 27651 757 50 1 0 0 hotplug
[27652] 0 27652 757 128 0 0 0 hotplug
[검색] 한국어
- Keyword -
[active anon] [shmem sreclaimable]
[참고 : 전반적으로 잘 정리해 둔 곳]
145주차 /proc/meminfo 로 알아 본 리눅스의 메모리에 대하여
[show 명령] : 출처 : Bloodguy ]
cat /proc/meminfo
free -m
# 물리 메모리 / 가상 메모리 사용량
ps -eo pid,rsz,vsz,cmd | grep -v grep
cat /proc/<pid>/status
/proc/meminfo 설명 [참고 : 마약같은 성취감 / Bloodguy ]
[참고 : vm.overcommit에 대한 짧은 이야기] <= memory commit관련 설명 잘되어 있음
bash-4.3# sysctl -a | grep commitvm.overcommit_memory = 0
vm.overcommit_ratio = 50
[출처 : 메모리 overcommit] <== memory commit관련 주의 잘 설명되어 있음
*. vm.overcommit_memory
- 0 : heuristic에 따라 overcommit 할 수 있고, 하지 않을 수도 있다.(디폴트) 메모리 요구가 있을 때 여유 공간이 없는 경우 실행중인 프로세스를 강제 종료 메모리를 억지로 확보함.
- 1 : 항상 overcommit 함. 메모리를 다 사용했는데도 충분한 메모리가있는 것처럼 처리 됨. 그 외에는 0과 같음.
- 2 : overcommit하지 않음. 메모리가 부족할 경우 메모리 확보시 에러 발생시킴. [Swap size] + ([RAM size] * vm.overcommit_ratio/100).
- 사용 가능한 메모리의 백분율로 정의. overcommit_ratio의 디폴트는 50.
[출처 : LRU Lists & pagevecs]
Memory Reclaiming
메모리가 부족하면 주기적으로 페이지를 해지하는 프로세스가 돌며 페이지를 회수하여 재사용 하는데 여러 가지 메모리 교체 정책이 있다. 그 중 리눅스는 LRU 알고리즘을 사용한다.
LRU (Least Recently Used)
- 최소 빈도로 사용되는 페이지를 회수하는 방식이다.
- 커널 2.6.28-rc1 부터는 기존에 zone별로 2개의 LRU(active_list 와 inactive_list) 리스트로 관리하였었는데 이를 5개로 확대하여 사용한다.
- 기존
- zone->active_list
- zone->inactive_list
- 신규: 5개로 확장된 LRU 리스트
- zone->lruvec.lists[LRU_INACTIVE_ANON]
- zone->lruvec.lists[LRU_ACTIVE_ANON]
- zone->lruvec.lists[LRU_INACTIVE_FILE]
- zone->lruvec.lists[LRU_ACTIVE_FILE]
- zone->lruvec.lists[LRU_UNEVICTABLE]
- 참고:
- 기존
- 속성
- ANON
- annoonymous user page(메모리 할당 API를 사용하여 할당 받은 페이지)
- 메모리 부족 시 swap file(영역)에 옮긴다.
- 현재 리눅스 커널은 성능상의 이유로 swap 크기가 default 0으로 설정되어 있다.
- 최근 tovalds는 ssd 타입의 디스크를 사용하여 다시 swap을 사용하는 것에 관심을 갖고 있다.
- 참고: Reconsidering swapping | LWN.net
- FILE
- mapped user mode page로 정규 파일에서 읽어 들인 페이지의 한 종류
- 메모리 부족 시 clean 페이지들은 그냥 회수하고, dirty된 페이지들은 file(backing store)에 기록 후에 회수한다.
- ACTIVE
- 처음 할당된 페이지들은 active 리스트의 선두(hot)에 추가된다.
- 주기적으로 active와 inactive의 ratio를 비교하여 참조되지 않는 페이지는 inactive 리스트로 옮기고 참조된 페이지는 다시 active list의 선두로 옮긴다(rotate).
- INACTIVE
- 회수 매커니즘이 동작할 때 inactive 리스트의 후미(cold)에서 회수를 시도한다.
- ANON: swap file에 옮긴다.
- 옮길 swap 공간이 부족하면… ^^;
- FILE: clean 페이지를 회수하고 dirty 페이지인 경우 writeback을 동작(async)시켜 원래의 화일에 기록하게 해놓고 페이지를 inactive list의 선두로 옮긴다(rotate)
- inactive 리스트의 선두로 rotate된 경우 roatate되어 후미로 밀려나면 그 때 다시 페이지 회수 판단하게 된다.
- ANON: swap file에 옮긴다.
- 회수 매커니즘이 동작할 때 inactive 리스트의 후미(cold)에서 회수를 시도한다.
- UNEVICTABLE
- 메모리 회수 메커니즘에서 사용할 수 없도록 한 페이지로 다음의 경우 사용된다.
- ramfs
- SHM_LOCK(공유 메모리 락)’d shared memory regions
- VM_LOCKED VMAs
- 다음 3가지 case에서는 isolation을 통한 migration을 허용한다.
- 메모리 파편화 관리
- 워크로드 관리
- 메모리 hotplug
- LRU pagevec 매커니즘을 사용하지 않는다.
- 메모리 회수 메커니즘에서 사용할 수 없도록 한 페이지로 다음의 경우 사용된다.
- lru 리스트는 양방향 리스트로 선두는 hot, 페이지 후미는 cold 페이지 성격을 갖는다.
- ANON
pagevecs
- 빠른 성능을 갖기위해 멀티페이지 컨테이너 cpu 캐시가 있고, 아래와 같이 4개의 pagevecs가 있으며 각각은 14개의 페이지를 갖을 수 있다.
- lru_add_pvec
- lru_rotate_pvecs
- lru_deactivate_pvecs
- activate_page_pvecs
'프로그램... > 프로....Kernel' 카테고리의 다른 글
[kallsyms] Kernel All Symbols (0) | 2018.04.16 |
---|---|
[메모리] Check List (0) | 2017.09.22 |
[Timer] hrtimer (0) | 2015.04.13 |
[Netlink] kernel-space sample (Using Generic Netlink sockets) (0) | 2014.11.14 |
[Kernel-Document] (0) | 2014.10.31 |