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