éããããã®è²´æ¹ã»ã»ã»ã»
/proc/meminfoã®ãã£ã¡ã®å¤ã¨ãã£ã¡ã®å¤ãè¶³ãããããªãã§ãã£ã¡ã®å¤ã¨åãã«ãªããªãã®ã»ã»ã»ã»
ã¨æ©ãã ãã¨ããã¾ãããï¼
/proc/meminfoã¯ãã«ã¼ãã«ãå é¨çã«ç®¡çãã¦ããæ çµã¿ã§ã®ã¡ã¢ãªæ å ±ããã®ã¾ã¾åºãã¦ããã®ã§ãæ®å¿µãªããã¦ã¼ã¶è¦ç¹ã§ç¥ãããã¡ã¢ãªæ å ±ã¨ã¯ä¸è´ãã¾ããã
ã¨ã¯ãããå¤ãªè§£éããã¦ç¡æå³ã«æ©ã¾ãªãããã«ãããããã®å¤ã®æå³åãã¨é ç®éã®é¢ä¿ãç¥ã£ã¦ããã®ã¯ææç¾©ã§ããç§ã®çè§£ã®ç¯å²ã§ããããã®é¢ä¿ãã¾ã¨ãã¦ããã¾ãã
ï¼ç§ã®çè§£ãå®ç§ã§ã¯ãªãã®ã§ãééãããã°ãããããææãé¡ããã¾ãã
åèè³æãhttp://mkosaki.blog46.fc2.com/blog-entry-1007.html
2011/09/07 追è¨ï¼ tmpfsãSwapCachedã«å«ã¾ããã®ã¯å¹»æ³ã§ãããtmpfs=Shmemã«ä¿®æ£ãã¾ããã
ã¾ãã¯ãå ¨ä½ãRHEL6.1ã®ç°å¢ã§ãã
# uname -a Linux kakinoha 2.6.32-131.12.1.el6.x86_64 #1 SMP Sun Jul 31 16:44:56 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux # cat /proc/meminfo MemTotal: 8069288 kB MemFree: 6269572 kB Buffers: 7740 kB Cached: 101324 kB SwapCached: 796 kB Active: 943536 kB Inactive: 235008 kB Active(anon): 892084 kB Inactive(anon): 201448 kB Active(file): 51452 kB Inactive(file): 33560 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 2097144 kB SwapFree: 2093596 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 1068776 kB Mapped: 50044 kB Shmem: 24052 kB Slab: 513180 kB SReclaimable: 242496 kB SUnreclaim: 270684 kB KernelStack: 3040 kB PageTables: 39048 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 6131788 kB Committed_AS: 3309080 kB VmallocTotal: 34359738367 kB VmallocUsed: 375884 kB VmallocChunk: 34359351896 kB HardwareCorrupted: 0 kB AnonHugePages: 819200 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 12288 kB DirectMap2M: 8261632 kB
ãã®é¨åã®è§£éã¯ãããã«ç°è«ã¯ãªãã§ãããã
MemTotal: 8069288 kBããã«ã¼ãã«ãèªèãã¦ããå ¨ç©çã¡ã¢ãª MemFree: 6269572 kBãããããªãç¨éã«ã使ããã¦ããªãã¡ã¢ãª
ã¡ã¢ãªã®ä½¿ããæ¹ã®åé¡ã¯ã大éæã«ã¯ããããªæãã«ãªãã¾ãã
MemTotal = MemFree + File-backedãªã¡ã¢ãª + Anonymousãªã¡ã¢ãª + ã«ã¼ãã«ç©ºéã使ãã¡ã¢ãª ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^--ã¦ã¼ã¶ç©ºéã使ãã¡ã¢ãª
File-backedã¨ããã®ã¯ããã£ã¹ã¯ããã¡ã¢ãªã«èªã¿è¾¼ãã ãã¡ã¤ã«ãªã©ãã¡ã¢ãªãéæ¾ããããªã£ããããã®å 容ããã£ã¹ã¯ã«æ¸ãæ»ãã°éæ¾ã§ããã¿ã¤ãã®ã¡ã¢ãªã§ããAnonymousã¨ããã®ã¯ãã以å¤ã®ã¡ã¢ãªã§ãã¡ã¢ãªãéæ¾ããããªã£ãããSwapé åã«æ¸ãåºããªãã¨éæ¾ã§ããªãã¿ã¤ãã®ã¡ã¢ãªã
ãã®å¤§éæãªåé¡ãã¨ã«è¦ã¦ããã¾ãã
File-backedãªã¡ã¢ãª
ã¾ãã¯èª°ããããã£ã¹ã¯ãã£ãã·ã¥ã¨ãã¦ä½¿ããã¦ãããã¨è§£éããããªãã¡ã¢ãªé åã
Buffers: 7740 kBãããã£ã¹ã¯ãã£ãã·ã¥ã½ãä½ãã Cached: 101324 kBãããã£ã¹ã¯ãã£ãã·ã¥ã½ãä½ãã
ã¨ããã¤ã¤ããããªãæªãã表ç¾ã§ãããããã£ã½ãã£ã¦ä½ã ï¼
å®ã¯ãä¸è¬ã«ã¦ã¼ã¶ãèããããã£ã¹ã¯ãã£ãã·ã¥ããããªãã¡ãç©çãã£ã¹ã¯ä¸ã®ãã¡ã¤ã«ã¢ã¯ã»ã¹ã«ä¼´ããã£ãã·ã¥ã¡ã¢ãªã®ä½¿ç¨éã¯ãã¡ãã®2ã¤ã®åè¨ãè¦ãæ¹ãããã§ãã
Active(file): 51452 kB Inactive(file): 33560 kB
"Buffers + Cached"ã«ã¯ããã以å¤ã®åä½ã«ä¼´ã£ã¦ç¢ºä¿ããããã£ãã·ã¥ã¡ã¢ãªãå«ã¾ããã®ã§ãä¸è¨ã®åè¨ããã大ãããªãã¾ããã©ããªãã®ããããã¨ããã¨ã
- tmpfsãªã©ã®ã¡ã¢ãªãå©ç¨ãããã¡ã¤ã«ã·ã¹ãã ã«ãã使ç¨ã¡ã¢ãª
- å é¨çã«tmpfsæ©è½ãå©ç¨ãã¦ããå ±æã¡ã¢ãªã®ä½¿ç¨ã¡ã¢ãª
ããï¼å ±æã¡ã¢ãªã®ä½¿ç¨éã£ã¦ããããããªãã®ï¼
Shmem: 24052 kB
ããã§ãããããShmemã¯å®ä½ã¨ãã¦ã¯ãtmpfsã®äºã ã¨æã£ã¦ä¸ãããtmpfsã®å®è£ ãããããmm/shmem.cã§ãããã
ããã¾ã§ãå³ç¤ºããã¨ãããªæãã
--------------------------------------------- | Buffers / Cached | --------------------------------------------- | Active(file) / Inactive(file) | Shmem | ---------------------------------------------
ãªãã¨ãªãå ¬å¼ãè¦ãã¦ãã¾ãããã
Buffers + Cached = Active(file) + Inactive(file) + Shmem
Anonymousãªã¡ã¢ãª
Anonymousãªã¡ã¢ãªã¯ããã°ãããï¼
Active(anon): 892084 kB Inactive(anon): 201448 kB
ã¯ããã§ãããä¾ã«ãã£ã¦ããããã人ãããã«ãã¾ãã
AnonPages: 1068776 kB
è¶³ãç®ããã¨åããããã«ãAnonPages < Active(anon) + Inactive(anon)ã§ããå·®åã¯ã©ãã«ï¼ï¼ï¼
ã«ã¼ãã«ã½ã¼ã¹ãè¦ãã¨ãAnonPagesã¯ãrmapã§ç®¡çããã¦ããAnonymousãã¼ã¸ã®åéã表示ãã¦ãã¾ããrmapã¨ããã®ã¯ããã®Anonymousãã¼ã¸ã¯ã©ã®ã¦ã¼ã¶ããã»ã¹ã®ã©ã®è«çã¢ãã¬ã¹ããåç §ããã¦ããããéå¼ãããæ©è½ã§ãã
ã¨ãããã¨ã¯ãç¹å®ã®ã¦ã¼ã¶ããã»ã¹ã«ç´ä»ãã¦ããªããã§ããfile-backedã§ã¯ãªãã¡ã¢ãªãããã¯ããããã
çãã¯ãã£ã¨Shmemï¼tmpfsï¼ãã¤ã¾ãããããªæãã§ã¯ãªããããã¨ã
--------------------------------------------- | Active(anon) + Inactive(anon) | --------------------------------------------- | Shmem | AnonPages | ---------------------------------------------
å ¬å¼çã«ã¯ããããªæãã
Active(anon) + Inactive(anon) = Shmem + AnonPages
ãã¼ããå®éã«è¨ç®ããããæ°ç¾kBã®èª¤å·®ãåºããããã
-------------------------------------------------- | Active(anon) + Inactive(anon) | -------------------------------------------------- | Shmem | AnonPages |??| --------------------------------------------------
ï¼èª¤å·®ã®æ£ä½ã¯å¾ã»ã©èå¯ã
ã¡ãªã«ã¿ãtmpfsãInactive(anon)ã«çªã£è¾¼ã¾ããã®ã¯ãã®ãããã
mm/filemap.c
int add_to_page_cache_lru(struct page *page, struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask) { ... ret = add_to_page_cache(page, mapping, offset, gfp_mask); if (ret == 0) { if (page_is_file_cache(page)) lru_cache_add_file(page); else lru_cache_add_anon(page); // ãã } return ret; }
ãã¡ã¤ã«ã·ã¹ãã ãªã®ã§ã¡ã¢ãªçã«ã¯ãã£ãã·ã¥ãªãã ãã©ãå®ä½ã®ãã¡ã¤ã«ãåå¨ããªãã®ã§ã¡ã¢ãªç®¡çä¸ã¯anonã«çªã£è¾¼ã¾ãã¦ãããããããã©ã£ã¡ã¤ããã®åãªããæãããã¦ããã¾ããï¼ã¡ãªã¿ã«ãããããã¨ããã¯ãKOSAKIããã®ãããã§ãããhttps://lkml.org/lkml/2010/5/19/74ï¼
ã¦ã¼ã¶ç©ºéã®ã¡ã¢ãªããã£ããã¾ã¨ãã
ããã¾ã§ã«ã§ããï¼ã¤ã®å³å¼ãçµ±åããã¨ãããªãã¾ããããã£ã½ãæãã«ãªãã¾ããã
----------------------------------------------------------------------------- | Buffers / Cached | AnonPages |??| ----------------------------------------------------------------------------- | Active(file) + Inactive(file) | Active(anon) + Inactive(anon) | ----------------------------------------------------------------------------- | | Shmem | | -----------------------------------------------------------------------------
ã«ã¼ãã«ç©ºéã使ãã¡ã¢ãª
ããã¾ã§ã®è°è«ãæ£ããã¨ããã¨ãæåã®é¢ä¿å¼ã«ãã©ã£ã¦ãããããå ¬å¼ã«ãªãã¾ãã
ã«ã¼ãã«ç©ºéã使ãã¡ã¢ãª = MemTotal - MemFree - Buffers - Cached - AnonPages - ?? = MemTotal - MemFree - Active - Inactive where Active = Active(anon) + Active(file) Inactive = Inactive(anon) + Inactive(file)
ã¨ã¯ãããã«ã¼ãã«ç©ºéã使ãã¡ã¢ãªã®ä¸èº«ãæ°ã«ãªãã¾ããæ®å¿µãªããããã®å ¨ã¦ã®é ç®ã/proc/meminfoã«ã¯ç¾ããªãæ°ããã¾ããã代表çãªé ç®ã¯ãã®ããããã¨ã
Slab: 513180 kBããã¹ã©ãã¢ãã±ã¼ã¿ã確ä¿ããã¡ã¢ãª KernelStack: 3040 kBããã«ã¼ãã«ç©ºéã§ä½¿ãã¹ã¿ãã¯é å PageTables: 39048 kBãããã¼ã¸ãã¼ãã« VmallocUsed: 375884 kB ï¼ããããioremapåãå¼ãããã®ï¼â»å¥é説æã
ã«ã¼ãã«ãå é¨çã«å¤æ°ãªã©ã«å²ãå½ã¦ã¦ä½¿ç¨ããã¡ã¢ãªé åã¯ãåºæ¬çã«ã¯ãã¹ã©ãã¢ãã±ã¼ã¿ã¨ããä»çµã¿ã§äºåã«ç¢ºä¿ãã¦ãããããå°åãããã¾ããã§ãã®ã§ãã¾ãã¯ãSlabãè¦ãã¨ã«ã¼ãã«ã使ã£ã¦ããã¡ã¢ãªéã®å½ãããã¤ãã¾ããKernelStackã¨PageTablesã¯ãã®åã®éãã
æ··ä¹±ããã¡ãªã®ããVmallocUsedãã¹ã©ãã¢ãã±ã¼ã¿ãéããã«ãã«ã¼ãã«ã®è«çã¢ãã¬ã¹ç©ºéã«ãã¤ã¬ã¯ãã«ã¡ã¢ãªããããã³ã°ãã¦ä½¿ãã®ããã®é åã§ãããã ããç©çã¡ã¢ãªä»¥å¤ã«ãå¤é¨ããã¤ã¹ã®IOã¡ã¢ãªããããã³ã°ï¼ioremapï¼ãããããã¦ããã®ã§ããã®å¤ã¯ãç©çã¡ã¢ãªã®ä½¿ç¨é以ä¸ã«ãªã£ã¦ãã¾ãã
幸ãã«ãVmallocã®ããè©³ç´°ãªæ å ±ã¯ã/proc/vmallocinfoããã¨ããã®ã§ã次ã®ãã¾ããªããå±ããã¨ãç©çã¡ã¢ãªããããã³ã°ããã¦ããvmallocé åã ãã®ã¡ã¢ãªéï¼kBï¼ãè¨ç®ã§ãã¾ãã
# echo "( $(cat /proc/vmallocinfo | grep vmalloc | awk '{print $2}' | paste -s -d "+") )/ 1024" | bc
ã¨ãè¨ã£ã¦ããã¦å¤§åãªæ³¨æã§ããå®ã¯ã/proc/vmallocinfoã«ã¢ã¯ã»ã¹ããã¨ãéãæªãã¨Kernel Panicãããããããªããã°ãå æè¦ã¤ãã£ã¦ãã¾ãã¾ãããhttp://t.co/CfHPrM6ãRHELã«ãããããããã«ã¯ãã¾ãã°ãæéããããã¨æãã®ã§ãä¸ã®ãã¾ããªããå±ããéã¯ããããæ°ãã¤ãã¦ãã ããã
ããã®æã®èª¤å·®ã®æ£ä½
-------------------------------------------------- | Active(anon) + Inactive(anon) | -------------------------------------------------- | Shmem | AnonPages |??| --------------------------------------------------
ï¼ãã®ï¼ï¼
æ°ããã§ããAnonymousãã¼ã¸ãActive(anon)/Inactive(anon)ã«è¿½å ãããé¨åã§ã¯ãå
ã®mm/filemap.cã®ä¾ã«ããããã«ãlru_cache_add_*()ãªã©ã®é¢æ°ãå©ç¨ããã¾ãããã®é¢æ°ã®ä¸èº«ã追ã£ã¦ããã¨ã
mm/swap.c
void __lru_cache_add(struct page *page, enum lru_list lru) { struct pagevec *pvec = &get_cpu_var(lru_add_pvecs)[lru]; page_cache_get(page); if (!pagevec_add(pvec, page)) // pagevecã«pageã追å ãã¦ãã£ã¦ããã£ã±ãã«ãªã£ããã ____pagevec_lru_add(pvec, lru); // pagevecããLRU(Active/Inactiveãªã¹ãï¼ã«è¿½å put_cpu_var(lru_add_pvecs); }
ã¨ããæãã§ã䏿¦ãpagevecã«ãã£ãã·ã¥ããã¦ããActive(anon)/Inactive(anon)ã«ã¾ã¨ãã¦è¿½å ãããæ§é ã«ãªã£ã¦ãã¾ããpagevecã§ãã£ãã·ã¥ããã¦ããéä¸ã®pageã¯ãActive(anon)/Inactive(anon)ã«ç¾ããªãã®ã§ãããã¯ãActive(anon)/Inactive(anon)ãå°ããè¦ããè¦å ã«ãªãã¾ããï¼ä»ã®å ´åã¯ã¨ã¯éã®ãºã¬ã§ãããï¼
ï¼ãã®ï¼ï¼
Swap-outãããã¡ã¢ãªãã¼ã¸ãSwap-inããå¦çã®ä¸ã§ãã¾ã ããã»ã¹ããã¢ã¯ã»ã¹ããã¦ããªããã¼ã¸ãå
ã«Swap-inãã¦ãã¾ãå
èªã¿å¦çãèµ°ãã¾ããå
èªã¿ããããã¼ã¸ã¯ãActive(anon)/Inactive(anon)ã«ç»é²ããã¾ãããå®éã«ããã»ã¹ããã¢ã¯ã»ã¹ãããã¾ã§ã¯ãrmapãããªãã®ã§ãAnonPagesã«ã¯åæ ããã¾ãããããã¯ãä»ã®ããã«AnonPagesãå°ããè¦ããè¦å ã«ãªãã¾ãã
// Swap-inã®éå§ // mm/memory.c static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pte_t *page_table, pmd_t *pmd, unsigned int flags, pte_t orig_pte) { ... page = lookup_swap_cache(entry); // ãã§ã«å èªã¿ããã¦ãããç¢ºèª if (!page) { grab_swap_token(mm); /* Contend for token _before_ read-in */ page = swapin_readahead(entry, GFP_HIGHUSER_MOVABLE, vma, address); // ã¾ã å èªã¿ããã¦ãªããã°ãããã§å èªã¿ãéå§ ... set_pte_at(mm, address, page_table, pte); do_page_add_anon_rmap(page, vma, address, exclusive); // ã¢ã¯ã»ã¹ããããã¼ã¸ã®PTEãã»ãããã¦rmapã«ç»é² // å èªã¿ã ãããã¦ã¢ã¯ã»ã¹ããã¦ããªããã¼ã¸ã¯rmapç»é²ãããªãç¹ã«æ³¨æ // å èªã¿ããæ // mm/swap_state.c struct page *swapin_readahead(swp_entry_t entry, gfp_t gfp_mask, struct vm_area_struct *vma, unsigned long addr) { ... page = read_swap_cache_async(swp_entry(swp_type(entry), offset), gfp_mask, vma, addr); struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, struct vm_area_struct *vma, unsigned long addr) { ... err = __add_to_swap_cache(new_page, entry); if (likely(!err)) { radix_tree_preload_end(); /* * Initiate read into locked page and return. */ lru_cache_add_anon(new_page);ã// ããã§Inactive(anon)ã«ã¶ãä¸ãã swap_readpage(new_page); return new_page; }
ã¡ãªã¿ã«ãå èªã¿ãããã¼ã¸ã¯ãã¹ã¯ãããã£ãã·ã¥ãã¨å¼ã°ãããã®ãµã¤ãºã¯meminfoã®SwapCachedã«è¡¨ç¤ºããã¾ãããã ããrmapããã¦AnonPagesã«ä»²éå ¥ãããå¾ãï¼å¯¾å¿ãããã¼ã¿ããã£ã¹ã¯ã®Swapé åã«æ®ã£ã¦ããéã¯ï¼ã¹ã¯ãããã£ãã·ã¥ã¨ãã¦èªèãããã®ã§ãä¸è¨ã®ãããªé¢ä¿ã«ãªãã¾ãã
------------------------------------------------- | Active(anon) + Inactive(anon) | ------------------------------------------------- | Shmem | AnonPages |??| ------------------------------------------------- ããã | SwapCached| ããã ------------- rmapæ¸ã¿|æªrmap
åé ã«ããã/proc/meminfoã®åºåä¾ã§ã¯ãSwapCachedãç´800kBã§ãä¸è¨ã®ãºã¬ãç´700kBãªã®ã§ç¢ºãã«ããã£ã½ãæ°ã«ãªãã¾ãã
ï¼ãã®ï¼ï¼
ã¦ã¼ã¶ç©ºéã®ã¡ã¢ãªãã¼ã¸ã¯ãåºæ¬çã«ã¯ä¸è¨ã®ã©ããã®LRUãªã¹ãã«ã¶ããããã¾ãã
Active(anon): 892084 kB Inactive(anon): 201448 kB Active(file): 51452 kB Inactive(file): 33560 kB
ãããããå®ã¯ããã²ã¨ã¤ãååä¸è½ãã¼ã¸ï¼è§£æ¾ã§ããªããã£ã¹ã¯ãã£ãã·ã¥ã¨ããSwap-outã§ããªãAnonymousãã¼ã¸ã¨ãï¼ã ããç¹å¥ã«ã¶ãä¸ããLRUãªã¹ããããã¾ãã
Unevictable: 0 kB
ï¼åèï¼
http://lwn.net/Articles/286485/
http://www.atmarkit.co.jp/flinux/rensai/watch2008/watchmemb.html
ä»åã¯0kBãªã®ã§èª¤å·®ã«ã¯å½±é¿ãã¦ãã¾ãããããããã¦ã¼ã¶ç©ºéã®ã¡ã¢ãªä½¿ç¨éã¨ãã¦å ããå¿ è¦ãããã¾ãããã¯ãè¤éããã¦å³ç¤ºã§ãã¾ããããç¡çããæãã¨ãããªæãã
--------------------------------------------------------------------------------- | Buffers / Cached | AnonPages |??| --------------------------------------------------------------------------------- | Active(file) + Inactive(file) | Unevictalbe | Active(anon) + Inactive(anon) | ---------------------------------------------------------------------------------