内存
基本概念
内存是计算机的重要组成部件,用于暂时存放CPU中的运算数据,以及与硬件等外部存储器交换的数据。特别地,非统一内存访问架构(non-uniform memory access,简称NUMA)是一种为多处理器的电脑设计的内存架构,内存访问时间取决于内存相对于处理器的位置。在NUMA下,处理器访问本地内存的速度比非本地内存速度(内存位于另一个处理器,或者是处理器之间共享的内存)快。
常用内存分析工具/方式
-
free
free命令用于查看系统的内存使用情况,它可以显示系统当前的空闲内存、已使用内存、缓冲区占用的内存和交换分区的内存使用情况等。
free命令的用法非常简单,直接在终端输入free -h命令即可:
输出的信息中包含了以下几个部分:
- total:系统总共的物理内存大小;
- used:已使用的物理内存大小;
- free:空闲的物理内存大小;
- shared:被共享使用的内存大小;
- buffers:缓冲区占用的内存大小;
- cached:页面缓存占用的内存大小;
- buffers/cache:这一部分表示实际使用的内存情况,分别显示已使用的内存大小和空闲的内存大小;
- swap:交换分区的情况,包括总大小、已使用的大小和剩余的大小。
- 通过free命令可以方便地了解系统的内存使用情况,对于系统调优和问题排查都非常有帮助。
-
vmstat -a
vmstat命令可以用于显示系统的虚拟内存统计信息,包括内存使用情况、CPU使用情况、进程、I/O等信息。使用vmstat -a命令可以输出更加详细的虚拟内存统计信息。 具体来说,vmstat -a命令可以显示以下信息:- procs:正在运行、等待运行或者被阻塞的进程数;
- memory:内存使用情况,包括物理内存、虚拟内存和交换分区的使用情况;
- io:I/O操作的数量和延迟情况;
- system:系统调用和上下文切换的数量;
- cpu:CPU使用情况,包括用户、系统、等待和空闲时间的百分比;
- swap:交换分区使用情况。
执行命令vmstat -a后,将会输出类似下面的信息:

其中,r表示正在运行的进程数,b表示等待运行的进程数。swpd表示使用的虚拟内存大小,free表示空闲的物理内存大小,buff`表示系统缓冲区占用的内存大小,cache表示页缓存占用的内存大小。si和so分别表示从磁盘读取和写入虚拟内存的数据量。bi和bo分别表示从磁盘读取和写入的块数。in表示每秒钟中断的数量,cs表示每秒钟上下文切换的数量。us、sy、id、wa和st分别表示用户态CPU占用、内核态CPU占用、空闲CPU时间、等待IO的CPU时间和被虚拟化器占用的CPU时间百分比。
-
sar
使用sar命令可以统计和分析内存使用情况。常用的选项包括:- r:显示内存使用统计信息;
- B:显示内存分页统计信息。
以下是一些常用的sar命令示例:
Plain Text1# sar -r 2 3
每行输出的各字段的含义如下:
- kbmemfree:空闲内存量,单位为KB;
- kbavail:可用内存量,单位为KB;
- kbmemused:已使用的内存量,单位为KB--
%memused:内存使用率; - kbbuffers:缓冲区使用量,单位为KB;
- kbcached:缓存使用量,单位为KB;
- kbcommit:提交内存,,单位为KB;
- %commit:提交内存使用率;
- kbactive:活跃内存量,单位为KB;
- kbinact:非活跃内存量,单位为KB;
- kbdirty:脏页数量,单位为KB。
在上述示例中,每次输出的时间间隔为2秒,一共输出了3次。可以通过修改命令中的数字参数来调整输出的时间间隔和次数。
-
cat /proc/meminfo
/proc/meminfo文件包含了系统内存使用情况的详细信息,可以通过读取该文件来获取系统内存的相关信息。以下是一些常用的内存相关信息:- MemTotal:系统总内存大小,单位为KB;
- MemFree:系统空闲内存大小,单位为KB;
- MemAvailable:系统可用内存大小,单位为KB;
- Buffers:缓冲区使用大小,单位为KB;
- Cached:缓存使用大小,单位为KB;
- Active:活跃内存大小,单位为KB;
- Inactive:非活跃内存大小,单位为KB;
- SwapTotal:Swap区总大小,单位为KB;
- SwapFree:Swap区空闲大小,单位为KB。

-
cat /proc/slabinfo
/proc/slabinfo文件包含了系统中各种slab缓存的详细信息,可以通过读取该文件来获取系统中各种slab缓存的大小和使用情况。以下是/proc/slabinfo文件中一些常用的字段:- name:slab缓存的名称;
- active_objs:slab缓存中当前正在使用的对象数量;
- num_objs:slab缓存中总共分配的对象数量;
- objsize:slab缓存中每个对象的大小;
- objperslab:每个slab中可以分配的对象数量;
- pagesperslab:每个slab所占用的页数;
- slabs:slab缓存中当前已经分配的slab数量;
- active_slabs:slab缓存中当前正在使用的slab数量;
- limit_slabs:slab缓存中可以分配的最大slab数量;
- cache_order:slab缓存所占用的页数的次幂,即2的几次幂;
- color:slab缓存所使用的颜色计算方法。

- cat /proc/vmallocinfo
/proc/vmallocinfo展示了内核中已经分配的虚拟内存区域的信息,包括了分配的起始地址、大小、使用情况等等。可以通过以下命令查看/proc/vmallocinfo文件的内容:

- perf
使用工具可以对alloc_page函数的调用进行分析,以了解系统内存分配的性能和瓶颈。具体步骤如下:
- 启用内核符号:为了让perf工具能够正确分析alloc_page函数,需要启用内核符号。可以在
/etc/sysctl.conf文件中添加以下几行:
1# kernel.kptr_restrict = 0
2# kernel.perf_event_paranoid = -1
然后执行sudo sysctl -p命令使修改生效。
- 执行如下命令:
1# perf record -g -e 'kmem:*' -a -- sleep 10
2# perf report


评价此篇文章
