内存泄漏问题调查XXX版本内存泄漏XXX版本内存泄漏长期挂机结果•Mem-info:•DMAper-cpu:•CPU0:Hot:hi:0,btch:1usd:0Cold:hi:0,btch:1usd:0•Active:3802inactive:0dirty:0writeback:0unstable:0•free:127slab:1684mapped:1pagetables:124bounce:0•DMAfree:508kBmin:720kBlow:900kBhigh:1080kBactive:15208kBinactive:0kBpresent:32512kBpages_scanned:3286541all_unreclaimable?yes•lowmem_reserve[]:00•DMA:1*4kB1*8kB1*16kB1*32kB1*64kB1*128kB1*256kB0*512kB0*1024kB0*2048kB0*4096kB=508kB•Freeswap:0kB•8192pagesofRAM•0pagesofHIGHMEM•1094reservedpages•30pagesshared•0pagesswapcached•printk:12189messagessuppressed.•phone_voiceinvokedoom-killer:gfp_mask=0x201d2,order=0,oomkilladj=0•CallTrace:•[8000f10c]dump_stack+0x8/0x34•[8005ac40]out_of_memory+0x1f4/0x214•[8005c3f0]__alloc_pages+0x32c/0x334•[8005ed58]__do_page_cache_readahead+0x1f4/0x294•[80057938]filemap_nopage+0x2a4/0x4d4•[8006888c]__handle_mm_fault+0x3c8/0x924•[80014304]do_page_fault+0x104/0x3d0•[80009aa0]ret_from_exception+0x0/0x18表现现象:系统crash,不会自动重启大量进程被killWeb和telnet无响应可以ping通看门狗进程还保持运行用户态进程内存•32位操作系统中,每个进程拥有4G的虚拟内存空间,其中0~3GB是每个进程的私有用户空间,这个空间对系统中其他进程是不可见的。3~4GB是linux内核空间,由系统所有的进程以及内核所共享的。进程占用内存主要有如下几个区域:•1、当前执行文件的代码段,该代码段称为text段。•2、执行文件的数据段,主要存储执行文件用到的全局变量,静态变量。•3、存储全局变量和动态产生的数据的堆。•4、用于保存局部变量和实现函数调用的栈。•5、采用mmap方式映射到虚拟地址空间中的内存段查看内存的几个基本方法•Top命令•/proc/meminfo•/proc/{pid}/maps•/proc/{pid}/statusTOP命令介绍•PID:进程ID•PPID:父进程ID,1表示init进程,•USER:当前用户•STAT:进程当前运行状态•VSZ:此进程一共占用了多大物理内存。•%MEM:此进程占总内存消耗的百分比•%CPU:此进程占总CPU消耗的百分比•COMMAND:进程启动时的命令行格式/PROC/MEMINFO•$cat/proc/meminfoMemTotal:2052440kB//总内存MemFree:50004kB//空闲内存Buffers:19976kB//给文件的缓冲大小Cached:436412kB//高速缓冲存储器使用的大小SwapCached:19864kB//被高速缓冲存储用的交换空间大小Active:1144512kB//活跃使用中的高速缓冲存储器页面文件大小Inactive:732788kB//不经常使用的高速缓冲存储器页面文件大小•可用的物理内存=memfree+buffers+cached,•当memfree不够时,内核会通过回写机制(pdflush线程)把cached和buffered内存回写到后备存储器,从而释放相关内存供进程使用,或者通过手动方式显式释放cache内存/PROC/{PID}/MAPS•#catmaps•00400000-00414000r-xp000000001f:05193/bin/wanManager代码段•00453000-00454000rw-p000130001f:05193/bin/wanManager数据段•00454000-0045d000rwxp0045400000:000[heap]堆•2aaa8000-2aaae000r-xp000000001f:05366/lib/ld-uClibc-0.9.28.so程序连接的共享库的内存地址•2aaae000-2aaaf000rw-p2aaae00000:000•2aaed000-2aaee000r--p000050001f:05366/lib/ld-uClibc-0.9.28.so•2aaee000-2aaef000rw-p000060001f:05366/lib/ld-uClibc-0.9.28.so•2aaef000-2ab4d000r-xp000000001f:05319/lib/libuClibc-0.9.28.so•2ab4d000-2ab8c000---p2ab4d00000:000•2ab8c000-2ab8d000r--p0005d0001f:05319/lib/libuClibc-0.9.28.so•2ab8d000-2ab8e000rw-p0005e0001f:05319/lib/libuClibc-0.9.28.so•2ab8e000-2ab93000rw-p2ab8e00000:000•2ab93000-2ab96000r-xp000000001f:05313/lib/libnvram-0.9.28.so•2ab96000-2abd6000---p2ab9600000:000•2abd6000-2abe4000rw-p000030001f:05313/lib/libnvram-0.9.28.so•2abe4000-2abe8000r-xp000000001f:05365/lib/libcfg.so•2abe8000-2ac28000---p2abe800000:000•2ac28000-2ac29000rw-p000040001f:05365/lib/libcfg.so•2ac29000-2ac38000r-xp000000001f:05310/lib/libpthread-0.9.28.so•2ac38000-2ac77000---p2ac3800000:000•2ac77000-2ac7c000rw-p0000e0001f:05310/lib/libpthread-0.9.28.so•2ac7c000-2ac7e000rw-p2ac7c00000:000线程栈•7ff41000-7ff56000rwxp7ff4100000:000[stack]进程栈1)代表内存段的虚拟地址2)代表执行权限,r,w,x,p=私有s=共享3)代表在进程地址里的偏移量4)映射文件的主设备号和次设备号5)映像文件的节点号,即inode6)映像文件的路径进程内存布局/PROC/{PID}/STATUS•#catstatus•Name:wanManager•State:S(sleeping)•SleepAVG:97%•Tgid:2625•Pid:2625•PPid:1•TracerPid:0•Uid:0000•Gid:0000•FDSize:32•Groups:•VmPeak:1836kB•VmSize:1836kB•VmLck:0kB•VmHWM:492kB•VmRSS:492kB•VmData:1084kB•VmStk:84kB•VmExe:80kB•VmLib:488kB•VmPTE:16kB•Threads:1•SigQ:1/256•SigPnd:00000000000000000000000000000000•ShdPnd:00000000000000000000000000000000•SigBlk:00000000000000000000000080000000•SigIgn:00000000000000000000000000001006•SigCgt:0000000000000000000000038001a000•CapInh:0000000000000000•CapPrm:00000000fffffeff•CapEff:00000000fffffeff•VmSize:整个进程使用虚拟内存大小,是VmLib,VmExe,VmData,和VmStk的总和。••VmLck:虚拟内存锁。进程当前使用的并且加锁的虚拟内存总数•VmHWM:表示进程所占用物理内存的峰值•VmRSS:虚拟内存驻留集合大小。这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。••VmData:虚拟内存数据。堆使用的虚拟内存。•VmStk:虚拟内存栈栈使用的虚拟内存••VmExe:可执行的虚拟内存,可执行的和静态链接库所使用的虚拟内存•VmLib:虚拟内存库动态链接库所使用的虚拟内存XX001版本内存监控实验内存观察:初始状态•#catstatus•Name:wanManager•State:S(sleeping)•SleepAVG:97%•Tgid:2625•Pid:2625•PPid:1•TracerPid:0•Uid:0000•Gid:0000•FDSize:32•Groups:•VmPeak:1836kB•VmSize:1836kB•VmLck:0kB•VmHWM:492kB•VmRSS:492kB•VmData:1084kB•VmStk:84kB•VmExe:80kB•VmLib:488kB•VmPTE:16kB•Threads:1•SigQ:1/256•SigPnd:00000000000000000000000000000000•ShdPnd:00000000000000000000000000000000•SigBlk:00000000000000000000000080000000•SigIgn:00000000000000000000000000001006•SigCgt:0000000000000000000000038001a000•CapInh:0000000000000000•CapPrm:00000000fffffeff•CapEff:00000000fffffeff•#catmaps•00400000-00414000r-xp000000001f:05193/bin/wanManager•00453000-00454000rw-p000130001f:05193/bin/wanManager•00454000-0045d000rwxp0045400000:000[heap]•2aaa8000-2aaae000r-xp000000001f:05366/lib/ld-uClibc-0.9.28.so•2aaae000-2aaaf000rw-p2aaae00000:000•2aaed000-2aaee000r--p000050001f:05366/lib/ld-uClibc-0.9.28.so•2aaee000-2aaef000rw-p000060001f:05366/lib/ld-uClibc-0.9.28.so•2aaef000-2ab4d000r-xp000000001f:05319/lib/libuClibc-0.9.28.so•2ab4d000-2ab8c000---p2ab4d