본문 바로가기
프로그램.../프로....Kernel

[Memory] 커널 메모리 관리

by 크크다스 2017. 9. 19.
반응형

[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 commit
vm.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).
*. vm.overcommit_ratio
  • 사용 가능한 메모리의 백분율로 정의. 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개로 확대하여  사용한다.
  • 속성
      •  ANON
        • annoonymous user page(메모리 할당 API를 사용하여 할당 받은 페이지)
        • 메모리 부족 시 swap file(영역)에 옮긴다.
          • 현재 리눅스 커널은 성능상의 이유로 swap 크기가 default 0으로 설정되어 있다.
          • 최근 tovalds는 ssd 타입의 디스크를 사용하여 다시 swap을 사용하는 것에 관심을 갖고 있다.
      • 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되어 후미로 밀려나면 그 때 다시 페이지 회수 판단하게 된다.
      • UNEVICTABLE
        • 메모리 회수 메커니즘에서 사용할 수 없도록 한 페이지로 다음의 경우 사용된다.
          • ramfs
          • SHM_LOCK(공유 메모리 락)’d shared memory regions
          • VM_LOCKED VMAs
        • 다음 3가지 case에서는 isolation을 통한 migration을 허용한다.
          • 메모리 파편화 관리
          • 워크로드 관리
          • 메모리 hotplug
        • LRU pagevec 매커니즘을 사용하지 않는다.
      • lru 리스트는 양방향 리스트로 선두는 hot, 페이지 후미는 cold 페이지 성격을 갖는다.

     

 

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