Linux下内存占用分析
Linux下内存占用分析
使用 free 命令进行分析
1 |
|
- 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 |
|
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 |
|
查看内存占用较高的进程
使用 top 命令
执行 top 命令之后,
- 输入 大写P 是按 cpu利用率排序
- 输入 大写M 是按 内存占用率排序