Linux内存简介
由于BIOS和Kernel启动过程消耗了部分内存,因此MemTotal值(free命令获取)小于RAM容量。 由于BIOS
和Kernel
启动过程消耗了部分物理内存,因此MemTotal
值( free
命令获取)小于RAM
容量。
Linux
内存查询方式:
dmesg | grep Memory
Memory: 131604168K/134217136K available (14346K kernel code, 9546K rwdata, 9084K rodata, 2660K init, 7556K bss, 2612708K reserved, 0K cma-reserved)
Linux内存查询命令:
命令通过查询到的内存数据可以得到Linux内存计算公式如下: 通过查询到的内存数据可以得到Linux
内存计算公式如下:
Code Block |
---|
|
total = used + free + buff/cache |
// 总内存 = 已使用内存 + 空闲内存 + 缓存 |
其中,已使用内存数据包括Kernel消耗的内存和所有进程消耗的内存。
说明
kernel used=Slab + VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X
其中,已使用内存数据包括Kernel
消耗的内存和所有进程消耗的内存。
进程内存
进程消耗的内存包括:
- 虚拟地址空间映射的物理内存。读写磁盘生成PageCache消耗的内存。
- 读写磁盘生成
PageCache
消耗的内存。
虚拟地址映射的物理内存
Image Added
- 物理内存:硬件安装的内存(内存条)。
- 虚拟内存:操作系统为程序运行提供的内存。程序运行空间包括用户空间(用户态)和内核空间(内核态)。
- 物理内存:硬件安装的内存(内存条)。
- 虚拟内存:操作系统为程序运行提供的内存。程序运行空间包括用户空间(用户态)和内核空间(内核态)。Image Removed
虚拟地址映射的物理内存可以区分为共享物理内存和独占物理内存。如下图所示,物理内存1和3由进程A独占,物理内存2由进程B独占,物理内存4由进程A和进程B共享。Image Removed
Image Added
PageCache
除了通过MMap文件直接映射外,进程文件还可以通过系统调用Buffered I/O相关的Syscall将数据写入到PageCache,因此,PageCache也会占用一部分内存。Image Removed除了通过MMap
文件直接映射外,进程文件还可以通过系统调用Buffered I/O
相关的Syscall
将数据写入到PageCache
,因此,PageCache
也会占用一部分内存。
Image Added
进程内存统计指标
单进程内存统计指标
进程资源存储类型如下:
- Anonymous(匿名页):程序自行使用的堆栈空间,在磁盘上没有对应文件。
Anonymous
(匿名页):程序自行使用的堆栈空间,在磁盘上没有对应文件。 File-
backed(文件页):资源存放在磁盘文件中,文件内包含代码段、字体信息等内容。backed
(文件页):资源存放在磁盘文件中,文件内包含代码段、字体信息等内容。
说明 相关内存:相关指标:
anno_
rss(RSan):所有类型资源的独占内存。rss(RSan)
:所有类型资源的独占内存。file_
rss(RSfd):File-backed资源占用的所有内存。rss(RSfd)
:File-backed
资源占用的所有内存。shmem_
rss(RSsh):Anonymous资源的共享内存。rss(RSsh)
:Anonymous
资源的共享内存。
内存查询命令如下:指标查询命令如下:
查询指标内存 | 说明 | 计算公式 |
---|
top
| VIRT | 虚拟地址空间。 | 无 |
RES |
RSS映射的物理内存。RSS 映射的物理内存。 | anno_rss + file_rss + shmem_rss |
SHR | 共享内存。 | file_rss + shmem_rss |
MEM% | 内存使用率。 | RES / MemTotal |
ps
| VSZ | 虚拟地址空间。 | 无 |
RSS |
RSS映射的物理内存。RSS 映射的物理内存。 | anno_rss + file_rss + shmem_rss |
MEM% | 内存使用率。 | RSS / MemTotal |
smem
| USS | 独占内存。 | anno_rss |
PSS | 按比例分配内存。 | anno_rss + file_rss/m + shmem_rss/n |
RSS | RSS映射的物理内存。 | anno_rss + file_rss + shmem_rss |
Image RemovedImage Added说明
WSS(Memoy Size)指标:一种更为合理评估进程内存真实使用内存的计算方式。但是受限于Linux Page Reclaim机制,这个概念目前还只是概念,并没有哪一个工具可以正确统计出WSS,只能是趋近。Size) 指标:一种更为合理评估进程内存真实使用内存的计算方式。但是受限于Linux Page Reclaim 机制,这个概念目前还只是概念,并没有哪一个工具可以正确统计出WSS ,只能是趋近。
|
cgroup
内存统计指标
cgroup
用于对Linux
的一组进程资源进行限制、管理和隔离。更多信息,请参见
进程控制组内存统计指标
控制组(Cgroup)用于对Linux的一组进程资源进行限制、管理和隔离。更多信息,请参见官方文档。
Cgroup按层级管理,每个节点都包含一组文件,用于统计由这个节点包含的控制组的某些方面的指标。例如,Memory Control Group(memcg)统计内存相关指标。Image Removed
Memory Cgroup文件包含以下指标:cgroup
按层级管理,每个节点都包含一组文件,用于统计由这个节点包含的cgroup
的某些方面的指标。例如,Memory Control Group(memcg)
统计内存相关指标。
Image Added
memory cgroup
文件包含以下指标:
Code Block |
---|
|
cgroup.event_control |
# 用于eventfd的接口
memory.usage_in_bytes # |
显示当前已用的内存
memory.limit_in_bytes |
#设置# 设置/显示当前限制的内存额度
memory.failcnt |
# 显示内存使用量达到限制值的次数
memory.max_usage_in_bytes |
# 历史内存最大使用量
memory.soft_limit_in_bytes |
#设置# 设置/显示当前限制的内存软额度
memory.stat |
# 显示当前cgroup的内存使用情况
memory.use_hierarchy # |
#设置设置/显示是否将子cgroup的内存使用情况统计到当前cgroup里面
memory.force_empty |
# 触发系统立即尽可能的回收当前cgroup中可以回收的内存
memory.pressure_level # |
#设置内存压力的通知事件,配合cgroup设置内存压力的通知事件,配合cgroup.event_control一起使用
memory.swappiness |
# 设置和显示当前的swappiness
memory.move_charge_at_immigrate # |
设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去
memory.oom_control |
#设置# 设置/显示oom controls相关的配置
memory.numa_stat |
其中需要关注以下3
个指标:
其中需要关注以下3个指标:
总结
单进程和进程控制组指标区别:单进程和进程cgroup
指标区别:
cgroup
的RSS
指标只包含anno_rss
,对应单进程下的USS
指标,因此cgroup
的mapped_file+RSS
则对应单进程下的RSS
指标。- 单进程中
PageCache
需单独统计,cgroup
中memcg
文件统计的内存已包含PageCache
。
指标 | 单进程 | 进程控制组(memcg) |
---|
RSS | anon_rss + file_rss + shmem_rss | anon_rss |
mapped_file | 无 | file_rss + shmem_rss |
cache | 无 | PageCache |
控制组的RSS指标只包含anno_rss,对应单进程下的USS指标,因此控制组的mapped_file+RSS则对应单进程下的RSS指标。单进程中PageCache需单独统计,控制组中memcg文件统计的内存已包含PageCache。参考资料