Linux Swap交换分区介绍
Swap分区在系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。
Swap空间是分页的,每一页的大小和内存页的大小一样,方便Swap空间和内存之间的数据交换。旧版本的Linux实现Swap空间时,用Swap空间的第一页作为所有Swap空间页的一个"位映射"(Bit map)。这就是说第一页的每一位,都对应着一页Swap空间。如果这一位是1,表示此页Swap可用;如果是0,表示此页是坏块,不能使用。这么说来,第一个Swap映射位应该是0,因为,第一页Swap是映射页。另外,最后10个映射位也被占用,用来表示Swap的版本(原来的版本是Swap_space ,最新的版本是swapspace2)。那么,如果说一页的大小为s,这种Swap的实现方法共能管理"8 * ( s - 10 ) - 1"个Swap页。对于i386系统来说s=4096,则空间大小共为133890048,如果认为1 MB=2^20 Byte的话,大小正好为128M。
之所以这样来实现Swap空间的管理,是要防止Swap空间中有坏块。如果系统检查到Swap中有坏块,则在相应的位映射上标记上0,表示此页不可用。这样在使用Swap时,不至于用到坏块,而使系统产生错误。
系统设计者认为:
1.硬盘质量很好,坏块很少。
2.就算有,也不多,只需要将坏块罗列出来,而不需要为每一页建立映射。
3.如果有很多坏块,就不应该将此硬盘作为Swap空间使用。
于是,Linux取消了位映射的方法,也就取消了128M的限制。直接用地址访问,限制为2G。
折叠Swap配置对性能的影响
分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。
如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现"application is out of memory"的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。
通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,具体配置参见各服务器产品的说明。
另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。
默认情况下,阿里云云主机的swap功能是没有启用的,原因当然是通过取消swap功能可以降低磁盘IO的占用率来让用户购买更多的内存、提高磁盘寿命和性能。
阿里当前的做法是:
1.不创建swap分区,由镜像决定
2.将vm.swappiness设定为0,即永不使用swap分区
启用swap分区,确实可以降低内存的使用压力,但并不是长久之计,如果云主机上运行的应用确实需要较高的内存,建议还是购买更多的内存。
如何启用swap分区?
步骤如下:
1.查看当前系统中是否已经启用swap分区
1
2
|
cat /proc/swaps top |
2.如果没有启用swap分区功能,则新建一个专门的文件用于swap分区
1
|
dd if = /dev/zero of= /data/swap bs=512 count=8388616 |
注:此文件的大小是count的大小乘以bs大小,上面命令的大小是4294971392,即4GB
3.通过mkswap命令将上面新建出的文件做成swap分区
1
|
mkswap /data/swap |
4.查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成30或者60
1
2
3
|
cat /proc/sys/vm/swappiness sysctl -a | grep swappiness sysctl -w vm.swappiness=60 |
注:若想永久修改,则编辑/etc/sysctl.conf文件
5.启用此交换分区的交换功能
1
2
|
swapon /data/swap echo "/data/swap swap swap defaults 0 0" >> /etc/fstab |
如何关闭swap分区?
1
2
|
swapoff /data/swap swapoff -a > /dev/null |
关于多个交换分区在使用上的优先级
如果你有多于一个交换文件或交换分区,你可以给它们各自分配一个优先级值(0 到 32767)。系统会在使用较低优先级的交换区域前优先使用较高优先级的交换区域。例如,如果你有一个较快的磁盘 (/dev/sda) 和一个较慢的磁盘 (/dev/sdb),给较快的设备分配一个更高的优先级。优先级可以在 fstab 中通过 pri 参数指定:
1
2
|
/dev/sda1 none swap defaults,pri=100 0 0 /dev/sdb2 none swap defaults,pri=10 0 0 |
或者通过 swapon 的 ?p (或者 ??priority) 参数:
1
|
swapon -p 100 /dev/sda1 |
如果两个或更多的区域有同样的优先级,并且它们都是可用的最高优先级,页面会按照循环的方式在它们之间分配。
添加效果
PS: 原先对阿里云主机添加swap分区是否起作用表示质疑,现在看来,阿里在云主机中确实没做这方面的手脚。
注:关于top命令中的排序:top命令里面按下f或F,在通过箭头移动想要显示或者排序的列,按d表示显示或取消显示,按下s表示按此列排序,按下R表示翻转排序顺序。
1.查看SWAP
[root@192 oc]# cat /proc/swaps
Filename Type Size Used Priority
/dev/sda3 partition 8024 104 -1
[root@192 oc]#
2.通过DD创建文件
[root@192 oc]# dd if=/dev/zero of=/oc/swap bs=512 count=2000000
2000000+0 records in
2000000+0 records out
1024000000 bytes (1.0 GB) copied, 23.4213 seconds, 43.7 MB/s
[root@192 oc]#
[root@192 oc]# ll
总计 1001012
drwx------ 2 root root 16384 06-03 06:56 lost+found
-rw-r--r-- 1 root root 1024000000 06-12 10:24 swap
drwxr-xr-x 4 root root 4096 06-08 16:15 tmp
[root@192 oc]#
3.转化为swap格式
[root@192 oc]# mkswap /oc/swap
Setting up swapspace version 1, size = 1023995 kB
[root@192 oc]#
[root@192 oc]# free
total used free shared buffers cached
Mem: 1035108 1018168 16940 0 14716 892500
-/+ buffers/cache: 110952 924156
Swap: 8024 104 7920
[root@192 oc]#
启用,加入到swap池中。
[root@192 oc]# swapon /oc/swap
[root@192 oc]# free
total used free shared buffers cached
Mem: 1035108 1018228 16880 0 14748 892592
-/+ buffers/cache: 110888 924220
Swap: 1008016 104 1007912
[root@192 oc]#
[root@192 oc]# cat /proc/swaps
Filename Type Size Used Priority
/dev/sda3 partition 8024 104 -1
/oc/swap file 999992 0 -4
[root@192 oc]#
从swap池中拿掉
[root@192 oc]# swapoff /oc/swap
[root@192 oc]# free
total used free shared buffers cached
Mem: 1035108 1018780 16328 0 15096 892760
-/+ buffers/cache: 110924 924184
Swap: 8024 104 7920
[root@192 oc]# cat /proc/swaps
Filename Type Size Used Priority
/dev/sda3 partition 8024 104 -1
[root@192 oc]#
开机自动启动:
[root@192 oc]# echo "/oc/swap swap swap defaults 0 0" >> /etc/fstab
[root@192 oc]# cat /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
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
LABEL=SWAP-sda3 swap swap defaults 0 0
/dev/sdb1 /oa ext3 defaults 0 0
/dev/sdc1 /ob ext3 defaults 0 0
/dev/sdd1 /oc ext3 defaults 0 0
/dev/hdc /media/dvd iso9660 ro,auto 0 0
/oc/swap swap swap defaults 0 0
[root@192 oc]#
另:
将整个设备划为swap分区
fdisk时代码为82 linux swap,
分区后:
# mkswap /dev/sdc3
# swapon /dev/sdc3
一、缓存机制介绍
在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。
缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。
CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。
Swap用途:Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大
二、查看缓存区及内存使用情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
free 命令用于检测物理内存和交换内存已使用量和可用量(默认单位为KB) [root@backup ~] # free -m //使用-m参数表示以兆字节为单位显示内存 total used free shared buffers cached Mem: 64181 44372 19809 3 12 216 -/+ buffers /cache : 44143 20038 Swap: 32767 0 32767 第一部分Mem行解释: total:内存总数; used:已经使用的内存数; free :空闲的内存数; shared:当前已经废弃不用; buffers Buffer:缓存内存数; cached Page:缓存内存数。 关系:total = used + free 第二部分(-/+ buffers /cache )解释: (-buffers /cache ) used内存数:第一部分Mem行中的 used – buffers – cached (+buffers /cache ) free 内存数: 第一部分Mem行中的 free + buffers + cached 可见-buffers /cache 反映的是被程序实实在在吃掉的内存,而+buffers /cache 反映的是可以挪用的内存总数。 第三部分是指交换分区。 --------------------------------------------------------------------------------------------- 以字节为单位显示内存 加上-b参数的 free 命令,以字节为单位显示内存的大小。 [root@backup ~] # free -b total used free shared buffers cached Mem: 67299549184 46525181952 20774367232 3272704 12820480 227033088 -/+ buffers /cache : 46285328384 21014220800 Swap: 34359734272 0 34359734272 ------------------------------------------------------------------------------------------- 以千字节为单位显示内存 加上-k参数的 free 命令(默认单位,所以可以不用使用它),以(KB)千字节为单位显示内存大小。 [root@backup ~] # free -k total used free shared buffers cached Mem: 65722216 45435760 20286456 3196 12520 221712 -/+ buffers /cache : 45201528 20520688 Swap: 33554428 0 33554428 ------------------------------------------------------------------------------------------- 以千兆字节为单位显示内存 使用-g为参数,将会以GB(千兆字节)为单位显示内存大小。 [root@backup ~] # free -g total used free shared buffers cached Mem: 62 43 19 0 0 0 -/+ buffers /cache : 43 19 Swap: 31 0 31 ------------------------------------------------------------------------------------------ 定期时间间隔更新内存状态 -s选项加上一个整数,用来在定期时间间隔内更新 free 命令。举个例子,下面的命令将会在每5秒更新一个 free 命令。 [root@backup ~] # free -s 5 total used free shared buffers cached Mem: 65722216 45436660 20285556 3196 12712 222096 -/+ buffers /cache : 45201852 20520364 Swap: 33554428 0 33554428 total used free shared buffers cached Mem: 65722216 45436592 20285624 3196 12720 222096 -/+ buffers /cache : 45201776 20520440 Swap: 33554428 0 33554428 |
三、buffers和cached解释
=========================================================
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。–两者都是RAM中的数据。
两者都是RAM中的数据,简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面。一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成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。它是根据程序的局部性原理而设计的,就是cpu执行的指令和访问的数据往往在集中的某一块,所以把这块内容放入cache后,cpu就不用在访问内存了,这就提高了访问速度。当然若cache中没有cpu所需要的内容,还是要访问内存的。从内存读取与磁盘读取角度考虑,cache可以理解为操作系统为了更高的读取效率,更多的使用内存来缓存可能被再次访问的数据。
Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时,存储慢的数据先把数据存放到buffer,达到一定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU可以干其他的事情。
Buffer:一般是用在写入磁盘的,例如:某个进程要求多个字段被读入,当所有要求的字段被读入之前已经读入的字段会先放到buffer中。Buffer是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。
cache是高速缓存,用于CPU和内存之间的缓冲;
buffer是I/O缓存,用于内存和硬盘的缓冲;
cache最初用于cpu cache,主要原因是cpu 与memory,由于cpu快,memory跟不上,且有些值使用次数多,所以放入cache中,主要目的是,重复使用,并且一级\二级物理cache速度快,
buffer主要用于disk与 memory,主要是保护硬盘或减少网络传输的次数(内存数据表现dataSet).当然也可以提高速度(不会立即写入硬盘或直接从硬盘中读出的数据马上显示),重复使用,最初最主要的目的是保护disk,
Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。
========================================================
下面通过一些简单通俗的例子来说明下Cache和Buffer缓存之间的区别:
1)Cache缓存
假设某地发生了自然灾害(比如地震),居民缺衣少食,于是派救火车去给若干个居民点送水。救火车到达第一个居民点,开闸放水,老百姓就拿着盆盆罐罐来接水。假如说救火车在一个居民点停留100分钟放完了水,然后重新储水花半个小时,再开往下一个居民点。这样一个白天来来来回回的,也就是4-5个居民点。
但我们想想,救火车是何等存在,如果把水龙头完全打开,其强大的水压能轻易冲上10层楼以上, 10分钟就可以把水全部放完。但因为居民是拿盆罐接水,100%打开水龙头那就是给人洗澡了,所以只能打开一小部分(比如10%的流量)。但这样就降低了放水的效率(只有原来的10%了),10分钟变100分钟。
那么,我们是否能改进这个放水的过程,让救火车以最高效率放完水、尽快赶往下一个居民点呢?
方法就是:在居民点建蓄水池。
救火车把水放到蓄水池里,因为是以100%的效率放水,10分钟结束然后走人。居民再从蓄水池里一点一点的接水。
我们分析一下这个例子,就可以知道Cache的含义了。
救火车要给居民送水,居民要从救火车接水,就是说居民和救火车之间有交互,有联系。
但救火车是"高速设备",居民是"低速设备",低速的居民跟不上高速的救火车,所以救火车被迫降低了放水速度以适应居民。
为了避免这种情况,在救火车和居民之间多了一层"蓄水池(也就是Cache)",它一方面以100%的高效和救火车打交道,另一方面以10%的低效和居民打交道,这就解放了救火车,让其以最高的效率运行,而不被低速的居民拖后腿,于是救火车只需要在一个居民点停留10分钟就可以了。
所以说,蓄水池是"活雷锋",把高效留给别人,把低效留给自己。把10分钟留给救火车,把100分钟留给自己。
从以上例子可以看出,所谓Cache,就是"为了弥补高速设备和低速设备之间的矛盾"而设立的一个中间层。因为在现实里经常出现高速设备要和低速设备打交道,结果被低速设备拖后腿的情况。Cache的存在是为了解决什么问题?速度太慢了,要加快速度!
以PC为例。CPU速度很快,但CPU执行的指令是从内存取出的,计算的结果也要写回内存,但内存的响应速度跟不上CPU。CPU跟内存说:你把某某地址的指令发给我。内存听到了,但因为速度慢,迟迟不见指令返回,这段时间,CPU只能无所事事的等待了。这样一来,再快的CPU也发挥不了效率。
怎么办呢?在CPU和内存之间加一块"蓄水池",也就是Cache(片上缓存),这个Cache速度比内存快,从Cache取指令不需要等待。当CPU要读内存的指令的时候先读Cache再读内存,但一开始Cache是空着的,只能从内存取,这时候的确是很慢,CPU需要等待。但从内存取回的不仅仅是CPU所需要的指令,还有其它的、当前不需要的指令,然后把这些指令存在Cache里备用。CPU再取指令的时候还是先读Cache,看看里面有没有所需指令,如果碰巧有就直接从Cache取,不用等待即可返回(命中),这就解放了CPU,提高了效率。(当然不会是100%命中,因为Cache的容量比内存小)
2)Buffer缓存
比如说吐鲁番的葡萄熟了,要用大卡车装葡萄运出去卖果园的姑娘采摘葡萄,当然不是前手把葡萄摘下来,后手就放到卡车上,而是需要一个中间过程"箩筐":摘葡萄→放到箩筐里→把箩筐里的葡萄倒入卡车。也就是说,虽然最终目的是"把葡萄倒入卡车",但中间必须要经过"箩筐"的转手,这里的箩筐就是Buffer。是"暂时存放物品的空间"。
注意2个关键词:暂时,空间
再换句话说,为了完成最终目标:把葡萄放入卡车的空间,需要暂时把葡萄放入箩筐的空间。
以BT为例,BT下载需要长时间的挂机,电脑就有可能24小时连轴转,但BT下载的数据是碎片化的,体现在硬盘写入上也是碎片化的,因为硬盘是机械寻址器件,这种碎片化的写入会造成硬盘长时间高负荷的机械运动,造成硬盘过早老化损坏,当年有大量的硬盘因为BT下载而损坏。于是新出的BT软件在内存里开辟了Buffer,数据暂时写入Buffer,攒到一定的大小(比如512M)再一次性写入硬盘,这种"化零为整"的写入方式大大降低了硬盘的负荷。这就是:为了完成最终目标:把数据写入硬盘空间,需要暂时写入Buffer的空间。
3)二者之间的区别总结
Cache和Buffer的相同点:都是2个层面之间的中间层,都是内存。
Cache和Buffer的不同点:Cache解决的是时间问题,Buffer解决的是空间问题。
为了提高速度,引入了Cache这个中间层。
为了给信息找到一个暂存空间,引入了Buffer这个中间层。
为了解决2个不同维度的问题(时间、空间),恰巧取了同一种解决方法:加入一个中间层,先把数据写到中间层上,然后再写入目标。
这个中间层就是内存“RAM”,既然是存储器就有2个参数:写入的速度有多块(速度),能装多少东西(容量)
Cache利用的是RAM提供的高读写速度,Buffer利用的是RAM提供的存储容量(空间)。
a)Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。
b)Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。
c)假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。
========================================================
四、手动清理缓存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
释放缓存区内存的方法 1)清理pagecache(页面缓存) [root@backup ~] # echo 1 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=1 2)清理dentries(目录缓存)和inodes [root@backup ~] # echo 2 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=2 3)清理pagecache、dentries和inodes [root@backup ~] # echo 3 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=3 上面三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在 /etc/sysctl .conf文件中配置:vm.drop_caches=1 /2/3 ,然后sysctl -p生效即可! 另外,可以使用 sync 命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存 [root@backup ~] # sync 温馨提示: 上面操作在大多数情况下都不会对系统造成伤害,只会有助于释放不用的内存。 但是如果在执行这些操作时正在写数据,那么实际上在数据到达磁盘之前就将它从文件缓存中清除掉了,这可能会造成很不好的影响。 那么如果避免这种事情发生呢? 因此,这里不得不提一下 /proc/sys/vm/vfs_cache_pressure 这个文件,告诉内核,当清理inoe /dentry 缓存时应该用什么样的优先级。 [root@backup ~] # cat /proc/sys/vm/vfs_cache_pressure 100 vfs_cache_pressure=100 这个是默认值,内核会尝试重新声明dentries和inodes,并采用一种相对于页面缓存和交换缓存比较 "合理" 的比例。 减少vfs_cache_pressure的值,会导致内核倾向于保留dentry和inode缓存。 增加vfs_cache_pressure的值,(即超过100时),则会导致内核倾向于重新声明dentries和inodes 总之,vfs_cache_pressure的值: 小于100的值不会导致缓存的大量减少 超过100的值则会告诉内核你希望以高优先级来清理缓存。 其实无论vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。 如果将此值设置为10000,系统将会将缓存减少到一个合理的水平。 ====================================================== 这里顺便说下自己遇到的一个内存问题: IDC机房有一台专门的备份服务器,每天凌晨执行多个备份脚本。某天早上突然发现收到很多条zabbix监控报警信息:这台备份服务器的内存使用了已超过80%! 于是,赶紧登陆这台备份服务器,使用 free 命令查看内存使用情况: [root@backup ~] # free -m total used free shared buffers cached Mem: 64181 48585 15596 3 2 18 -/+ buffers /cache : 48564 15617 Swap: 32767 0 3276 确实发现内存使用率已超过80%!但是使用 "top" 命令查看,发现此时并没有什么进程在占用内存,并且本机是备份服务器,只有晚上执行备份脚本, 其他时间都没有服务进程在跑!于是尝试手动释放内存: [root@backup ~] # echo 1 > /proc/sys/vm/drop_caches [root@backup ~] # echo 2 > /proc/sys/vm/drop_caches [root@backup ~] # echo 3 > /proc/sys/vm/drop_caches [root@backup ~] # sync 发现在执行了上面第三条命令后,内存才真正被释放出来了,其他命令都没有起到效果。 |