Linux下内存占用分析

Linux下内存占用分析

使用 free 命令进行分析

1
2
3
4
5
6
7
[root@k8s-control-plane-02 ~]# free -lwh
total used free shared buffers cache available
Mem: 7.5Gi 4.7Gi 1.4Gi 72Mi 0B 1.4Gi 2.4Gi
Low: 7.5Gi 6.1Gi 1.4Gi
High: 0B 0B 0B
Swap: 0B 0B 0B
[root@k8s-control-plane-02 ~]#
  • Total(7.5Gi) = Low used(6.1Gi) + free(1.4Gi)
  • Low used(6.1Gi) = Mem used(4.7Gi) + cache(1.4Gi)

1. cache 字段说明

  • cache: IO读缓存, 这个IO不只是文件IO,也可以是网络IO

cache 就是缓存的意思。当系统读文件的时候,都是把数据从硬盘读到内存里,因为硬盘比内存慢很多,所以这个过程会很耗时。

为了提高效率,linux 会把读进来的文件在内存中缓存下来(因为读取相近部分的内容是程序很常见的情况),即使程序结束,cache 也不会被自动释放。

所以呢,如果有程序进行大量的读文件操作,你会发现内存使用率就上去了。

如果其他程序使用要使用内存的时候,linux 也会把这些没人使用的 cache 释放掉,给其他运行的程序使用。

手动去释放掉这部分内存:

1
echo 1 > /proc/sys/vm/drop_caches

2. buffer 字段说明

  • buffer: IO写缓存, 这个IO不只是文件IO,也可以是网络IO

buffer 的意思和 cache 相近,不过稍有区别。

考虑内存写文件到硬盘的过程,因为硬盘太慢了,如果内存要等待数据写完之后才继续后面的操作,实在是效率很低的事情,也会影响程序的运行速度。

所以就有了 buffer,写到硬盘的数据会放到 buffer 里面,内存很快把数据写到 buffer,可以继续其他的工作,而硬盘可以在后台慢慢读出 buffer 中的数据,保存起来。这样就提高了读写的效率!

讲一个大家会经常遇到的例子,当我们把电脑里中的文件拷贝到 U 盘的时候,如果文件特别大,大家会遇到这种情况:明明看到文件已经拷贝完了,但系统还是会提示 U 盘正在使用中。这就是 buffer 的原因,拷贝程序把东西放到 buffer 之后,但是 U 盘还没有写完。

同样的,可以手动来 flush buffer 的内容,使用的命令是 sync。

3. free 字段说明

free 是真正尚未被使用的物理内存数量。

4. available 字段说明

available 是从应用程序的角度看到的可用内存数量。

Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。

当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。

所以从应用程序的角度来说,available = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。

5. shared 字段说明

shared 被共享使用的物理内存大小,是进程间通信的一种方式。

6. swap 字段说明

swap 是实现虚拟内存的重要概念。如果系统的负载太大,内存被用完,可能会出现严重的问题。

swap 就是把硬盘上一部分空间当做内存使用,正在运行程序会使用物理内存,把没有正在使用的内存放到硬盘,这叫做 swap out;而把硬盘 swap 部分的内存重新放到物理内存中,叫做 swap in。

swap 可以再逻辑上扩大内存空间,但是会造成系统变慢,因为硬盘读写速度很慢。linux 系统比较智能,会把那些不怎么频繁使用的内存放到 swap。

7. /proc/meminfo 文件

其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:

1
cat /proc/meminfo

查看内存占用较高的进程

使用 top 命令

执行 top 命令之后,

  • 输入 大写P 是按 cpu利用率排序
  • 输入 大写M 是按 内存占用率排序

Linux下内存占用分析
https://pygyme.com/开发环境配置/linux下内存占用分析/
作者
PYGYME
发布于
2024年1月24日
许可协议