free引发的cache、buffer、swap讨论

free引发的cache、buffer、swap讨论

$ free
             total       used       free     shared    buffers     cached
Mem:       8062624    7910056     152568          0       5232     964468
-/+ buffers/cache:    6940356    1122268
Swap:      4194296    2592660    1601636

total :物理内存实际总量
used :物理内存使用量(包括buffers、cached)
free :物理内存空闲量(不包括buffers、cached)
shared :共享内存
buffers :系统分配的,未被使用的buffer剩余量。
cached :系统分配的,未被使用的cache剩余量。
Mem :内存整体使用情况

  • -buffers/cache :实际使用的内存空间used - buffers - cached (6940356 =7910056 - 5232 - 964468)
  • +buffers/cache :实际空闲的内存空间free + buffers + cached(1122268 =152568 + 5232 + 964468)
  • Swap :swap分区使用情况(作为虚拟内存使用部分的磁盘空间使用情况)

当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存。如果给所有应用分配足够内存后,物理内存还有剩余,linux会尽量再利用这些空闲内存,以提高整体I/O效率,其方法是把这部分剩余内存再划分为cache及buffer两部分加以利用。从磁盘读取到内存的数据在被相关应用程序读取后,如果有剩余内存,则这部分数据会存入cache,以备第2次读取时,避免重新读取磁盘。当一个应用程序在内存中修改过数据后,因为写入磁盘速度相对较低,在有空闲内存的情况下,这些数据先存入buffer,在以后某个时间再写入磁盘,从而应用程序可以继续后面的操作,而不必等待这些数据写入磁盘的操作完成。如果在某个时刻,系统需要更多的内存,则会把cache部分擦除,并把buffer中的内容写入磁盘,从而把这两部分内存释放给系统使用,这样再次读取cache中的内容时,就需要重新从磁盘读取了。如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当作虚拟内存来使用,也称为Swap。

cache
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。我们这里的cache是减少对磁盘的读操作而缓存的数据,需要同高速缓存cache做一下区分,高速缓存是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。

buffer
Buffer主要是针对内存和硬盘之间的写操作来设计的,目的是将写的操作集中起来进行,减少磁盘碎片和硬盘反复寻址过程,提高性能。当应用在内存中修改过数据后,因写入磁盘速度低,在有空闲内存的情况下,这些数据会存入buffer,在以后某个时间再写入磁盘,从而应用可以继续后面的操作,而不必等待这些数据写入磁盘的操作完成。在Linux系统内部有一个守护进程会定期清空Buffer中的内容,将其写入硬盘内,当手动执行sync命令时也会触发上述操作。

swap
Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

通过以上分析可以得知,空闲物理内存不多,不一定表示系统运行状态很差,因为内存的cache及buffer部分可以随时被重用,在某种意义上,这两部分内存也可以看作是额外的空闲内存。swap如果被频繁调用,bi、bo长时间不为0,说明内存资源可能紧张。

swap拓展

查看swap分区情况

$ free
             total       used       free     shared    buffers     cached
Mem:       8062624    7910224     152400          0       3720     771432
-/+ buffers/cache:    7135072     927552
Swap:      4194296    2963372    1230924

$ cat /proc/swaps
Filename				Type		Size	Used	Priority
/dev/sda3                               partition	4194296	2963372	-1

$ swapon -s
Filename				Type		Size	Used	Priority
/dev/sda3                               partition	4194296	2963372	-1

swapoff、swapon加-a选项,关闭或开启etc/fstab文件中所有设置为swap的设备。由于swap分区时将磁盘作为虚拟内存使用,在关闭swap分区前,会先将swap分区数据转移到内存中,然后再关闭swap分区。

$ cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Tue Aug 21 06:35:07 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel6.5-rhel_root /                       ext4    defaults        1 1
UUID=579f15d3-0cc5-4d59-bea8-a92f0d5f5ba1 /boot                   ext4    defaults        1 2
/dev/mapper/rhel6.5-rhel_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/var/swap     swap      swap    defaults 0 0

$ free
             total       used       free     shared    buffers     cached
Mem:       8193500    4971636    3221864          0      12352    2105788
-/+ buffers/cache:    2853496    5340004
Swap:      8388592    2660280    5728312

$ swapoff -a -v
swapoff on /dev/mapper/rhel6.5-rhel_swap
swapoff on /var/swap

$ free
             total       used       free     shared    buffers     cached
Mem:       8193500    7426224     767276          0      13840    3051452
-/+ buffers/cache:    4360932    3832568
Swap:            0          0          0

$ swapon -a -v
swapon on /dev/mapper/rhel6.5-rhel_swap
swapon: /dev/mapper/rhel6.5-rhel_swap: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/mapper/rhel6.5-rhel_swap: pagesize=4096, swapsize=4294967296, devsize=4294967296
swapon on /var/swap
swapon: /var/swap: insecure permissions 0644, 0600 suggested.
swapon: /var/swap: found swap signature: version 1, page-size 4, same byte order
swapon: /var/swap: pagesize=4096, swapsize=4294967296, devsize=4294967296

$ free
             total       used       free     shared    buffers     cached
Mem:       8193500    7433176     760324          0      13936    3051704
-/+ buffers/cache:    4367536    3825964
Swap:      8388592          0    8388592

swapoff关闭指定交换分区,swapon开启指定交换分区

$ free
             total       used       free     shared    buffers     cached
Mem:       8193500    7453156     740344          0      14552    3052848
-/+ buffers/cache:    4385756    3807744
Swap:      8388592          0    8388592

$ swapoff /var/swap
$ free
             total       used       free     shared    buffers     cached
Mem:       8193500    7449280     744220          0      14776    3052984
-/+ buffers/cache:    4381520    3811980
Swap:      4194296          0    4194296

$ swapon -s
Filename				Type		Size	Used	Priority
/dev/dm-0                               partition	4194296	0	-1

$ swapon /var/swap
$ swapon -s
Filename				Type		Size	Used	Priority
/dev/dm-0                               partition	4194296	0	-1
/var/swap                               file		4194296	0	-2

$ free
             total       used       free     shared    buffers     cached
Mem:       8193500    7458464     735036          0      15008    3053548
-/+ buffers/cache:    4389908    3803592
Swap:      8388592          0    8388592

两种临时修改swappiness参数的方法,系统重启后失效。如果想永久修改,在配置文件/etc/sysctl.conf里面修改vm.swappiness的值,然后重启系统。swap把磁盘的部分空间当作虚拟内存来使用。设计的目的就是当上面提到的+buffers/cache表示的可用内存都已使用完,新的读写请求过来后,会把内存中的部分数据写入磁盘,从而把磁盘的部分空间当做虚拟内存来使用。Linux系统的swap分区并不是等所有物理内存都消耗殆尽后才去使用swap分区的,而是由swappiness参数值控制。这个参数值可为 0-100,控制系统 swap 的使用程度。该值越大,内核会越积极使用交换空间。默认值为 60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。

$ sysctl -q vm.swappiness
vm.swappiness = 60

$ sysctl vm.swappiness=10
vm.swappiness = 10

$ sysctl -q vm.swappiness
vm.swappiness = 10

$ echo 60 > /proc/sys/vm/swappiness
$ cat /proc/sys/vm/swappiness
60
$ sysctl -q vm.swappiness
vm.swappiness = 60
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值