暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kernel内存及进程内存相关

原创 阎书利 2022-07-29
1117

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

image.png

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"与进程解除关联后,在内存中就没有存在的必要了,因此它所包含的都是当前正在被使用的,两者之和就是进程使用的总内存。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论