感谢支持
我们一直在努力

Linux内存管理-free命令

一 free内存管理

作为一名linux系统管理员,监控内存的使用状态是非常重要的,通过监控有助于了解内存的使用状态,比如内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令有free、top等,下面是某个系统free的输出:
[]#free
total used free shared buffers cached
Mem: 16402432 16360492 41940 0 465404 12714880
-/+ buffers/cache: 3180208 13222224
Swap: 8193108 264 8192844
第一行:
total:物理内存总大小
used已经使用的物理内存多小。
free空闲的物理内存值。
shared多个进程共享内存值。
buffers/cached磁盘缓存的大小。
第二行:代表物理内存使用情况。
第三行(-/+ buffers/cached):代表磁盘缓存使用状态。
第四行:Swap表示交换空间内存使用状态。
free命令输出的内存状态,可以通过两个角度来查看:一个是从内核的角度来看,一个是从应用层的角度来看的。

推荐阅读:
Linux内存管理之高端内存 http://www.linuxidc.com/Linux/2013-06/85693.htm
Linux内存管理之分段机制  http://www.linuxidc.com/Linux/2012-11/74480.htm
Linux内存管理伙伴算法 http://www.linuxidc.com/Linux/2012-09/70711.htm 

1.从内核的角度来查看内存的状态

就是内核目前可以直接分配到,不需要额外的操作,即为上面free命令输出中第二行Mem项的值,可以看出,此系统物理内存有16G,空闲的内存只有41940K,也就是40M多一点,我们来做一个这样的计算:

16402432-16360492=41940

其实就是总的物理内存减去已经使用的物理内存得到的就是空闲的物理内存大小。
[注意:
这里的可用内存值41940并不包含处于buffers和cached状态的内存大小
]

[注意:
 

如果你认为这个系统空闲内存太小,那你就错了!
实际上,内核完全控制着内存的使用情况,linux会在需要内存的时候,或在系统运行逐步推进时,将buffers和cached状态的内存变为free状态的内存,以供系统使用。
]

2.从应用层的角度来看系统内存的使用状态

也就是linux上运行的应用程序可以使用的内存大小,即free命令第三行“(-/+ buffers/cached)”的输出,可以看到,此系统已经使用的内存才3180208K,而空闲的内存达到13222224K,继续做这样一个计算:

41940(Men:free)+(465404(Men:buffers)+12714880(Men:cached))=13222224(-/+ buffers/cached:free)

通过这个等式可知,应用程序可用的物理内存值是Mem项的free值加上buffers和cached值之和,也就是说,这个free值是包括buffers和cached项大小的,

对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高文件读取的性能,当应用程序需要用到内存的时候buffers/cached会很快地被回收,以供应用程序使用

3.bufferscached异同

在 Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种情况下,linux引入了buffers和cached机制。

buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操作系统的性能。但buffers与cached缓冲的内容却是不同的。

buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲
[
更通俗一点说:
buffers主要用来存放目录里面有什么内容\文件的属性\权限等等
cached直接用来记忆我们打开过的文件和程序
]

测试:

为了验证我们的结论是否正确,可以通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同,是不是第二次打开的速度明显快于第一次呢?

接着执行下面的命令:

find /* -name *.conf

看看buffers的值是否变化,然后重复执行find命令,看看两次显示速度有何不同。 

Linux操作系统的内存运行原理,很大程度上是根据服务器的需求来设计的,例如系统的缓冲机制会把经常使用到的文件和数据缓存在cached中,linux总是在力求缓存更多的数据和信息,这样再次需要这些数据时可以直接从内存中取,而不需要有一个漫长的磁盘操作,这种设计思路提高了系统的整体性能。

接下来请看第2页: http://www.linuxidc.com/Linux/2013-08/88289p2.htm

二 交换空间swap的使用

虽然现在的内存已经变得非常廉价,但是swap仍然有很大的使用价值,合理的规划和使用swap分区,对系统稳定运行至关重要。Linux下可以使用文件系统中的一个常规文件或者一个独立分区作为交换空间使用。同时linux允许使用多个交换分区或者交换文件。
1.创建swap交换空间

创建交换空间所需的交换文件是一个普通的文件,但是,创建交换文件与创建普通文件不同,必须通过dd命令来完成,同时这个文件必须位于本地硬盘上,不能在网络文件系统(NFS)上创建swap交换文件。例如:

[root@localhost ~]#dd if=/dev/zero of=/data/swapfile bs=1024 count=65536

65536+0 records in

65536+0 records out

这样就创建一个有连续空间的交换文件,大小为60M左右,关于dd命令做简单的讲述:

if=输入文件,或者设备名称。

of=输出文件或者设备名称。

ibs=bytes 表示一次读入bytes 个字节(即一个块大小为 bytes 个字节)。

obs=bytes 表示一次写bytes 个字节(即一个块大小为 bytes 个字节)。

bs=bytes,同时设置读写块的大小,以bytes为单位,此参数可代替 ibs 和 obs。

count=blocks 仅拷贝blocks个块。

skip=blocks 表示从输入文件开头跳过 blocks 个块后再开始复制。

seek=blocks表示从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)

这里的输入设备/dev/zero代表一个输出永远为0的设备文件,使用它作输入可以得到全为空的文件。

 
2.激活和使用swap

首先通过mkswap命令指定作为交换空间的设备或者文件:

[root@localhost ~]#mkswap /data/swapfile

Setting up swapspace version 1, size = 67104 kB

[root@localhost backup]#free

total used free shared buffers cached

Mem: 2066632 1998188 68444 0 26160 1588044

-/+ buffers/cache: 383984 1682648

Swap: 4088500 101036 3987464

从上面输出可知,我们指定了一个67104 kB的交换空间,而此时新建的交换空间还未被激活。

下面简单介绍下mkswap命令,mkswap的一般使用格式为:

mkswap [参数] [设备名称或文件][交换区大小]

参数:

-c:建立交换区前,先检查是否有损坏的区块。

-v0:建立旧式交换区,此为预设值。

-v1:建立新式交换区。

交换区大小:指定交换区的大小,单位为1024字节。

设置交换分区后,接着通过swapon命令激活swap:

[root@localhost ~]#/usr/sbin/swapon /data/swapfile

[root@localhost backup]#free

total used free shared buffers cached

Mem: 2066632 1997668 68964 0 27404 1588880

-/+ buffers/cache: 381384 1685248

Swap: 4154028 100976 4053052

通过free命令可以看出,swap大小已经由4088500k变为4154028k,相差的值是60M左右,刚好等于我们增加的一个交换文件大小,这说明新增的交换分区已经可以使用了。

但是如果linux重启,那么新增的swap空间将变得不可用,因此需要在/etc/fstab中添加自动加载设置:

/data/swapfile none swap sw 0 0

如此以来,linux在重启后就可以实现自动加载swap分区了。其实linux在启动过程中会执行“swapon -a”命令,此命令会加载列在/etc/fstab中的所有交换空间。

3.移除swap

通过swapoff即可移除一个交换空间

[root@localhost ~]#/usr/sbin/swapoff /data/swapfile

其实也可以通过“swapoff -a”移除在/etc/fstab中定义的所有交换空间,这里的“swapoff -a”与上面提到的“swapon -a”对应。执行“swapoff -a”后,free命令输出如下:

[root@localhost backup]# free

total used free shared buffers cached

Mem: 2066632 2048724 17908 0 30352 1642748

-/+ buffers/cache: 375624 1691008

Swap: 0 0 0

赞(0) 打赏
转载请注明出处:服务器评测 » Linux内存管理-free命令
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏