1.kernel的"stack"(栈)
可通过"meminfo"中的"KernelStack"查询
是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的
由编译器自动分配释放 ,存放函数的参数值,局部变量的值等
linux下每个进程都有一个kernel stack。对于一个应用程序而言,可以运行在用户空间,也可以通过系统调用进入内核空间。在用户空间,使用的是用户栈,也就是我们软件工程师编写用户空间程序的时候,保存局部变量的stack。进入内核后,就不能用用户栈了,这时候就需要使用到内核栈。所谓内核栈其实就是处于SVC mode时候使用的栈。
内核栈
在linux最开始启动的时候,系统只有一个进程(更准确的说是kernel thread),就是PID等于0的那个进程,叫做swapper进程(或者叫做idle进程)
x86架构。Linux内核栈大小是固定的,默认为8k,曾经有选项可以设置为4k栈。由于大小固定,申请过大的栈内存,或者函数调用层次过深,都可能导致栈溢出。
[root@mogdb-kernel-0005 ~]# grep -i stack /proc/meminfo
KernelStack: 6528 kB
2.kernel的"heap" (堆)
是由malloc之类函数分配的空间所在地。地址是由低向高增长的
一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收
根据获取路径的不同,包括以下几种情况:
• 通过kmalloc()申请的较小的内存。此时,kmalloc将基于slab分配器获取内存,因此可通过"meminfo"中的"Slab"查询。
• 直接调用alloc_page()或__get_free_page()分配的内存,包括通过kmalloc()申请较大内存时,以及使用vmalloc()时。对应vmalloc,可经" /proc/vmallocinfo"查看其分配和映射情况,并计算总和。
[root@mogdb-kernel-0005 ~]# grep -i Slab /proc/meminfo
Slab: 3042032 kB
[root@mogdb-kernel-0005 ~]# grep vmalloc /proc/vmallocinfo | awk '{total+=$2};END {print total}'
167231488
3.所有进程使用的页表占据的总内存
进程的Page Tables是由内核统一管理的,可通过"meminfo"中的"PageTable"得到所有进程使用的页表占据的总内存
[root@mogdb-kernel-0005 ~]# grep PageTables /proc/meminfo
PageTables: 20028 kB
4.每个进程各自的页表所消耗的内存
如果要查看每个进程各自的页表所消耗的内存,则可根据进程号PID,由"/proc/[PID]/status"中的"VmPTE"获取(对于64位系统还有"VmPMD")。所有的"VmPTE"加上"VmPMD",大致就等于"PageTable"的总大小
[root@mogdb-kernel-0005 ~]# grep VmPTE /proc/[1-9]*/status | awk '{total+=$2};END {print total}'
20696
[root@mogdb-kernel-0005 ~]# grep VmPMD /proc/[1-9]*/status | awk '{total+=$2};END {print total}'
[root@mogdb-kernel-0005 ~]# ps -ef | grep mogdb
ptk1 1526787 1 1 Jul20 ? 02:00:15 /opt/ptk1/mogdb/app/bin/mogdb -D /opt/ptk1/mogdb/data
root 1734578 1734116 0 01:17 pts/0 00:00:00 grep --color=auto mogdb
[root@mogdb-kernel-0005 ~]# grep VmPTE /proc/[1-9]*/status | awk '{total+=$2};END {print total}'
20696
[root@mogdb-kernel-0005 ~]# grep VmPTE /proc/1526787/status | awk '{total+=$2};END {print total}'
8968
5.一个进程所使用的内存
一个进程所使用的内存可通过PSS和RSS来衡量,这两者的信息都记录在" /proc/[PID]/smaps"中
[root@mogdb-kernel-0005 ~]# grep Pss /proc/[1-9]*/smaps | awk '{total+=$2};END {print total}'
2713420
[root@mogdb-kernel-0005 ~]# grep Rss /proc/[1-9]*/smaps | awk '{total+=$2};END {print total}'
3264012
[root@mogdb-kernel-0005 ~]# ps -ef | grep mogdb
ptk1 1526787 1 1 Jul20 ? 02:00:18 /opt/ptk1/mogdb/app/bin/mogdb -D /opt/ptk1/mogdb/data
root 1734681 1734116 0 01:22 pts/0 00:00:00 grep --color=auto mogdb
[root@mogdb-kernel-0005 ~]# grep Pss /proc/1526787/smaps | awk '{total+=$2};END {print total}'
2054095

6.进程PSS的总大小基本等于"meminfo"中"Mapped"加上"AnonPages"的大小
[root@mogdb-kernel-0005 ~]# grep Pss /proc/1526787/smaps | awk '{total+=$2};END {print total}'
2054095
[root@mogdb-kernel-0005 ~]# grep -wE 'Mapped|AonoPages' /proc/meminfo
Mapped: 2090492 kB
"Mapped"是page cache中正在被进程使用的内存部分,而"AnonPages"与进程解除关联后,在内存中就没有存在的必要了,因此它所包含的都是当前正在被使用的,两者之和就是进程使用的总内存。




