Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1219502
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: LINUX

2014-03-12 10:39:27

1、oom案例

点击(此处)折叠或打开

  1. Nov 21 14:07:54 linux kernel: Mem-info:
  2. Nov 21 14:07:54 linux kernel: DMA per-cpu:
  3. Nov 21 14:07:54 linux kernel: cpu 0 hot: low 2, high 6, batch 1
  4. Nov 21 14:07:54 linux kernel: cpu 0 cold: low 0, high 2, batch 1
  5. Nov 21 14:07:54 linux kernel: cpu 1 hot: low 2, high 6, batch 1
  6. Nov 21 14:07:54 linux kernel: cpu 1 cold: low 0, high 2, batch 1
  7. Nov 21 14:07:54 linux kernel: cpu 2 hot: low 2, high 6, batch 1
  8. Nov 21 14:07:54 linux kernel: cpu 2 cold: low 0, high 2, batch 1
  9. Nov 21 14:07:54 linux kernel: cpu 3 hot: low 2, high 6, batch 1
  10. Nov 21 14:07:54 linux kernel: cpu 3 cold: low 0, high 2, batch 1
  11. Nov 21 14:07:54 linux kernel: Normal per-cpu:
  12. Nov 21 14:07:54 linux kernel: cpu 0 hot: low 62, high 186, batch 31
  13. Nov 21 14:07:54 linux kernel: cpu 0 cold: low 0, high 62, batch 31
  14. Nov 21 14:07:54 linux kernel: cpu 1 hot: low 62, high 186, batch 31
  15. Nov 21 14:07:54 linux kernel: cpu 1 cold: low 0, high 62, batch 31
  16. Nov 21 14:07:54 linux kernel: cpu 2 hot: low 62, high 186, batch 31
  17. Nov 21 14:07:54 linux kernel: cpu 2 cold: low 0, high 62, batch 31
  18. Nov 21 14:07:54 linux kernel: cpu 3 hot: low 62, high 186, batch 31
  19. Nov 21 14:07:54 linux kernel: cpu 3 cold: low 0, high 62, batch 31
  20. Nov 21 14:07:54 linux kernel: HighMem per-cpu:
  21. Nov 21 14:07:55 linux kernel: cpu 0 hot: low 62, high 186, batch 31
  22. Nov 21 14:07:55 linux kernel: cpu 0 cold: low 0, high 62, batch 31
  23. Nov 21 14:07:55 linux kernel: cpu 1 hot: low 62, high 186, batch 31
  24. Nov 21 14:07:55 linux kernel: cpu 1 cold: low 0, high 62, batch 31
  25. Nov 21 14:07:55 linux kernel: cpu 2 hot: low 62, high 186, batch 31
  26. Nov 21 14:07:55 linux kernel: cpu 2 cold: low 0, high 62, batch 31
  27. Nov 21 14:07:55 linux kernel: cpu 3 hot: low 62, high 186, batch 31
  28. Nov 21 14:07:55 linux kernel: cpu 3 cold: low 0, high 62, batch 31
  29. Nov 21 14:07:55 linux kernel: Free pages: 163076kB (372kB HighMem)
  30. Nov 21 14:07:55 linux kernel: Active:829155 inactive:97781 dirty:0 writeback:0 unstable:0 free:40769 slab:36198 mapped:703803 pagetables:2169
  31. Nov 21 14:07:55 linux kernel: DMA free:11948kB min:292kB low:584kB high:876kB active:0kB inactive:0kB present:16384kB pages_scanned:0 all_unreclaimable? no
  32. Nov 21 14:07:55 linux kernel: lowmem_reserve[]: 0 880 5104
  33. Nov 21 14:07:55 linux kernel: Normal free:150756kB min:16088kB low:32176kB high:48264kB active:447476kB inactive:0kB present:901120kB pages_scanned:1 all_unreclaimable? no
  34. Nov 21 14:07:55 linux kernel: lowmem_reserve[]: 0 0 33792
  35. Nov 21 14:07:55 linux kernel: HighMem free:372kB min:512kB low:1024kB high:1536kB active:2869592kB inactive:391124kB present:4325376kB pages_scanned:4431073 all_unreclaimable? yes
  36. Nov 21 14:07:55 linux kernel: lowmem_reserve[]: 0 0 0
  37. Nov 21 14:07:55 linux kernel: DMA: 3*4kB 6*8kB 3*16kB 2*32kB 4*64kB 2*128kB 2*256kB 1*512kB 0*1024kB 1*2048kB 2*4096kB = 11948kB
  38. Nov 21 14:07:55 linux kernel: Normal: 297*4kB 52*8kB 10*16kB 6*32kB 13*64kB 4*128kB 6*256kB 7*512kB 3*1024kB 2*2048kB 33*4096kB = 150756kB
  39. Nov 21 14:07:55 linux kernel: HighMem: 1*4kB 0*8kB 1*16kB 1*32kB 1*64kB 0*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 372kB
  40. Nov 21 14:07:55 linux kernel: Swap cache: add 0, delete 0, find 0/0, race 0+0
  41. Nov 21 14:07:55 linux kernel: Free swap: 0kB
  42. Nov 21 14:07:55 linux kernel: 1310720 pages of RAM
  43. Nov 21 14:07:55 linux kernel: 819152 pages of HIGHMEM
  44. Nov 21 14:07:55 linux kernel: 274839 reserved pages
  45. Nov 21 14:07:55 linux kernel: 144884 pages shared
  46. Nov 21 14:07:55 linux kernel: 0 pages swap cached

从日志看,此时系统应该是需要从高端内存中分配内存(指定了GFP_HIGHMEM标记),但高端内存不足(只剩372k),内核会尝试从低端内存分配,
但低端内存也只剩150756kB了,这种情况下(默认从高端内存分配失败,再从低端内存分配),需要从低端内存中扣除lowmem_reserve的量(33792*4k),然后还要
扣除内存水线(min:16088kB),此时内存已经不足了:33792*4k+16088kB>150756kB


而同时,高端内存通过多次扫描(理论上当pages_scanned大于等于active和inactive页面总和的6倍时就认为所有的页面都是不可回收了),发现所有页面都不能回收了,
最终导致oom。

 2、OOM异常打印中各字段说明
per-cpu:每个管理区的每CPU页缓存(__alloc_pages分配单个页面时都从每CPU页框缓存中分配)

    Hot:热缓存。申请和释放单个页面通常都是同热缓存中进行。

    Cold:只有指定了__GFP_COLD标志才会从冷缓存中分配页面。

    Hi:当缓存中的页面数大于hi值时则释放部分页面到伙伴系统
    Btch:从伙伴系统中申请或释放页面时,以btch为单位
Active:最近经常访问页面大小,包括Cached、Buffers、Dirty、Writeback、AnonPages、Mapped这些子项的部分页面;
inactive:最近很少访问页面大小,包括Cached、Buffers、Dirty、Writeback、AnonPages、Mapped这些子项的部分页面
dirty:脏页数
writeback:文件系统正在回写的页数
free:空闲页面数
slab:slab子系统所分配内存总大小
mapped:映射文件缓存页面数
pagetables:页表占用的页面数
各管理区的字段:
    Free:当前管理区剩余内存;             
    Min:管理区的保留页框数,当free值低于此时就不能再分配页面;             
    Low:管理区水线低值,当free值低于此时就应该启动页回收机制;             
    High:管理区水线高值,当free值大于此时页回收就应该停止;
    Present:该管理区的总大小;
    pages_scanned:管理区在页回收时扫描的页面数。如果扫描过程中一直没有页面释放则该值大于0,只要有页面被释放则该值就会赋为0;由于扫描是重复进行的,很容易出现该值大于active+inactive的情况。
    all_unreclaimable:当pages_scanned大于等于active和inactive页面总和的6倍时就认为所有的页面都是不可回收了。但只要有页面被释放则该值就会赋为0;
    lowmem_reserve:从高端管理区分配失败以后,可以从低端管理区中分配页面;但在分配时要给低端留出lowmem_reserve大小的内存。因为低端内存更多用于内核的分配。如下是各管理区伙伴系统中,不同order大小的空闲内存块的分布情况:
Nov 21 14:07:55 linux kernel: DMA: 3*4kB 6*8kB 3*16kB 2*32kB 4*64kB 2*128kB 2*256kB 1*512kB 0*1024kB 1*2048kB 2*4096kB = 11948kB
Nov 21 14:07:55 linux kernel: Normal: 297*4kB 52*8kB 10*16kB 6*32kB 13*64kB 4*128kB 6*256kB 7*512kB 3*1024kB 2*2048kB 33*4096kB = 150756kB
Nov 21 14:07:55 linux kernel: HighMem: 1*4kB 0*8kB 1*16kB 1*32kB 1*64kB 0*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 372kB

reserved pages:设置了PG_reserved标志的页面
pages shared:共享的页面。共享的页面是指有多个进程映射的页面。

3、/proc/meminfo内存占用说明
示例:
 

点击(此处)折叠或打开

  1. [root@localhost ~]# cat /proc/meminfo
  2. MemTotal: 3920724 kB
  3. MemFree: 1495736 kB
  4. Buffers: 194448 kB
  5. Cached: 1871844 kB
  6. SwapCached: 0 kB
  7. Active: 1695516 kB
  8. Inactive: 440124 kB
  9. Active(anon): 69544 kB
  10. Inactive(anon): 1184 kB
  11. Active(file): 1625972 kB
  12. Inactive(file): 438940 kB
  13. Unevictable: 0 kB
  14. Mlocked: 0 kB
  15. SwapTotal: 1998840 kB
  16. SwapFree: 1998840 kB
  17. Dirty: 56 kB
  18. Writeback: 0 kB
  19. AnonPages: 69392 kB
  20. Mapped: 35512 kB
  21. Shmem: 1384 kB
  22. Slab: 200264 kB
  23. SReclaimable: 165004 kB
  24. SUnreclaim: 35260 kB
  25. KernelStack: 2704 kB
  26. PageTables: 12732 kB
  27. NFS_Unstable: 0 kB
  28. Bounce: 0 kB
  29. WritebackTmp: 0 kB
  30. CommitLimit: 3959200 kB
  31. Committed_AS: 280516 kB
  32. VmallocTotal: 34359738367 kB
  33. VmallocUsed: 285796 kB
  34. VmallocChunk: 34359446140 kB
  35. HardwareCorrupted: 0 kB
  36. AnonHugePages: 6144 kB
  37. HugePages_Total: 0
  38. HugePages_Free: 0
  39. HugePages_Rsvd: 0
  40. HugePages_Surp: 0
  41. Hugepagesize: 2048 kB
  42. DirectMap4k: 8568 kB
  43. DirectMap2M: 4184064 kB

MemTotal:内核可分配内存总数;
MemFree:内核当前剩余内存总数;
Buffers:块设备缓存大小;
Cached:文件缓存大小,包括了后面的Dirty、Writeback、Mapped三部分。
Active:最近经常访问页面大小,包括Cached、Buffers、Dirty、Writeback、AnonPages、Mapped这些子项的部分页面;
Inactive:最近很少访问页面大小,包括Cached、Buffers、Dirty、Writeback、AnonPages、Mapped这些子项的部分页面;
Dirty:脏页;
Writeback:正在写回的页;
AnonPages:匿名映射内存;
Mapped:映射到用户空间的文件缓存页面;
Slab:slab子系统所分配内存总大小;
            SReclaimable:slab子系统中可回收页面;
            SUnreclaim:slab子系统中不可回收页面;
PageTables:页表所占内存;
VmallocTotal:内核中vmalloc可分配内存的总大小;
VmallocUsed:内核中vmalloc当前实际分配内存大小;
VmallocChunk:内核中vmalloc可连续分配内存的大小;
HugePages_Total:巨页。这部分只针对特殊的设备使用。
CommitLimit:用户进程所能使用的最大内存。在/proc/sys/vm/ overcommit_memory设为2的条件下,如果Committed_AS大于CommitLimit则用户进程就不能再分配内存。
Committed_AS:统计系统中所有用户进程申请内存的大小。只统计了可写页面,只读页面不统计在内。

4、内存占用总结
 内存占用可做如下分类:

1)内核空间占用
a、页表占用
b、Slab占用
c、cache(页缓存)占用,包括:
    
(1)映射到进程的页
  (
2)脏页
  (
3)正在回写的页
d、buffer(块设备缓冲)占用
e、内核中直接使用__alloc_pages分配的页,这部分在/proc的内存信息中看不到
f、Vmalloc区占用
2) 
用户空间占用
a、 匿名映射内存。这部分是进程动态申请的私有内存,包括进程的堆和栈。
b、文件映射内存。这部分页面与某个文件关联,可以通过进程的虚拟地址进行访问;但同时这部分页面又是算作内核文件缓存的一部分。

阅读(3562) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~