Linux 内存:物理内存和虚拟内存

前言: 内存是linux中很重要的一块,内存不足、内存泄漏、内存溢出也是在测试项目中经常会遇到的问题。

1. 物理内存和虚拟内存

内存的读写性能要比硬盘快的多,因此,在设计上会充分利用内存进行数据的读取和写入,提高性能,但是内存是有限的,这就引入了物理内存和虚拟内存的概念。

物理内存指通过物理内存条而获得的内存空间,称为RAM。而虚拟内存则是指将硬盘的一块区域划分来作为内存。

Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存。当物理内存不足时,可以用虚拟内存代替。虚拟内存的概念,是为了满足物理内存不足的情况下,利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(swap space)。vm.swappiness是Linux内核的一个参数,范围是0~100。它表示实际内存和虚拟内存区域进行数据交换的倾向性大小,数值越大表示倾向性越大,即交换的页面文件越多,反之亦然。一般默认值为60。可用'cat /proc/sys/vm/swappiness’查看。

Linux会在物理内存不足的时,使用交换分区的虚拟内存,也就是说,内核会将暂时不用的内存块信息写到交换空间,以释放物理内存。Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。swap si/so 交换区的换进换出。

所有的进程都需要内存,但是不是每个进程都需要一直将对象加载到内存中。基于这点,kernel通过将进程的部分或全部内存换出到磁盘上,来释放物理内存,直到需要再次使用,然后再次读到内存中。kernel采用分页和交换进行内存管理。其中:

si:将分页被重新读取到物理内存。也称作page-in

so:将内存的要交换的分页写到磁盘上。也称作page-out

有时我们会看到这么一个现象,Linux 物理内存还有很多,但是交换空间也使用了很多,其实这并不奇怪。例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动交换进物理内存(除非有这个必要),那么此时系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。

最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够的空间来存储这些交换页面,最终会导致 Linux 出现假死机、服务异常等问题。Linux 虽然可以在一段时间内自行恢复,但是恢复后的系统己经基本不可用了。

因此,合理规划和设计 Linux 内存的使用是非常重要的,关于物理内存和交换空间的大小设置问题,取决于实际所用的硬盘大小,但大致遵循这样一个基本原则:

  1. 如果内存较小(根据经验,物理内存小于 4GB),一般设置 swap 分区大小为内存的 2 倍;
  2. 如果物理内存大于 4GB,而小于 16GB,可以设置 swap 分区大小等于物理内存;
  3. 如果内存大小在 16GB 以上,可以设置 swap 为 0,但并不建议这么做,因为设置一定大小的 swap 分区是有一定作用的。

2. Buffer与Cache

buffer 和 cache都是通过使用物理内存的一部分,其中A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.

但是我们平常对系统资源进行监控时看到的buffer cache,其实都是cache,其中,buffer是buffer cache,cache是page cache,例如free命令中展示的结果:

Mem是物理内存统计,如上面显示的,total表示物理内存总量是8006M,used表示总计分配给缓存(包括buffers和cached的)使用的数量,但其中可能部分缓存并未实际使用。used使用的内存有7253M,free未被分配的内存为752M,共享内存shared 一般系统不会用到,总是0。Buffer是系统分配但未被使用的buffer数量有183M,cache是系统分配但未被使用的cache数量有5153M,关系:total(8006M) = used(7253M) + free(752M),除去buffer和cache,真正使用的内存即-/+ buffers/cache中显示的used的值,也就是1934M。即下面的关系:

(-buffers/cache) used内存数:1934M (指的第一部Mem行中的used–buffers– cached) (+buffers/cache) free内存数: 6071M (指的第一部分Mem行中的free + buffers + cached) 所以-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

3. Linux下的内存的监控方法

1)free命令查看内存

在linux下用free –help查看使用规则,详见1.2节

参数:

-b  以Byte为单位显示内存使用情况。

-k  以KB为单位显示内存使用情况。

-m  以MB为单位显示内存使用情况。

-o  不显示缓冲区调节列。

-s<间隔秒数>  持续观察内存使用状况。

-t  显示内存总和列。

-V  显示版本信息。

2) vmstat命令查看内存

vmstat 1 【Virtual Meomory Statistics(虚拟内存统计)】命令查看内存使用情况:

3) sar命令

sar –R和sar –r可以用来监控内存问题

参考:

Linux虚拟内存和物理内存

Linux 是怎样使用内存的? - 知乎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值