
正文
linux清理内存的命令 linux 清理
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Linux中Cache内存占用过高解决办法
在Linux系统中,linux清理内存的命令我们经常用free命令来查看系统内存的使用状态。
默认显示单位是kb,linux清理内存的命令我的服务器是128G内存,所以数字显得比较大。这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(linux清理内存的命令我是说比例越少)。一般情况下,对此命令输出的理解可以分这几个层次:
1. 不linux清理内存的命令了解。这样的人的第一反应是:天啊,内存用了好多,70个多G,可是我几乎没有运行什么大程序啊?为什么会这样?Linux好占内存!
2. 自以为很了解。这样的人一般评估过会说:嗯,根据我专业的眼光看的出来,内存才用了17G左右,还有很多剩余内存可用。buffers/cache占用的较多,说明系统中有进程曾经读写过文件,但是不要紧,这部分内存是当空闲来用的。
3. 真的很了解。这种人的反应反而让人感觉最不懂Linux,他们的反应是:free显示的是这样,好吧我知道了。神马?你问我这些内存够不够,我当然不知道啦!我怎么知道你程序怎么写的?
4. 根据目前网络上技术文档的内容,我相信绝大多数了解一点Linux的人应该处在第二种层次。大家普遍认为,buffers和cached所占用的内存空间是可以在内存压力较大的时候被释放当做空闲空间用的。但真的是这样么?
在论证这个题目之前,我们先简要介绍一下buffers和cached是什么意思:
Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。
cache是高速缓存,用于CPU和内存之间的缓冲linux清理内存的命令;
buffer
是I/O缓存,用于内存和硬盘的缓冲
buffer和 cache 是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page
cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。
明白了这两套缓存系统的区别,就可以理解它们究竟都可以用来做什么了。
Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。
Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。
Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。
但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行 释放 。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。
在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:
[root@tencent64 ~]# cat /proc/sys/vm/drop_caches
1
方法是:
echo 1 /proc/sys/vm/drop_caches
当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:
sync //先做同步数据 防止数据部分丢失
echo 1 /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。
#!/bin/bashecho "开始清理缓存"
sync;sync;sync #写入硬盘,防止数据丢失
sleep 10 #延迟10秒
echo 1 /proc/sys/vm/drop_cachesecho "清理结束"
设置定时任务
crontab -e
* 0 * * * /root/cleanBuff.sh
crontab -l //查看是否设置成功
相关问答
Q1: linux如何清理内存
1、使用free命令查看一下当前内存使用情况
free
total used free shared buffers cached
Mem: 16621896 8967952 7653944 0 212352 8377276
-/+ buffers/cache: 378324 16243572
Swap: 10241428 0 10241428
#针对free命令后出现的信息解释
#total:总计物理内存的大小
#used:已使用多大
#free:可用有多少
#Shared:多个进程共享的内存总额
#Buffers/cached:磁盘缓存的大小
2、执行sync同步数据
sync
#该命令将未写的系统缓冲区写到磁盘中
#包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。
3、清理cache(缓存)
echo 3 /proc/sys/vm/drop_caches
free
total used free shared buffers cached
Mem: 16621896 579592 16042304 0 268 308708
-/+ buffers/cache: 270616 16351280
Swap: 10241428 0 10241428
4、对比步骤1和3的free命令,used(减少)、free(增大)对应Mem部分就清楚了,cache(缓存)被清理掉了。
Q2: 正确理解linux运行内存过高的问题以及free命令
周末闲来无事,查看了一下服务器的运行状态。发现通过监控页面可以看到,服务器的运行内存一直占用在98%左右,难道服务器出现什么问题了???
后来通过了解到,linux系统和平时使用的windwos系统内存运行机制不同。
windows系统的内存是程序运行过程中需要使用才会用到,不用时空闲着。所以当内存使用率过高时,需要检查是否超负载运行。解决方法是停止掉一些进程。
linux系统中,是进程优先使用内存,而不是磁盘。这样会加快读取速度。当有新的进程启动时,再从内存中开辟出一定空间,为新的进程所用。即使进程退出,也不会立刻从内存中清理掉,这样可以加快下次启动进程的速度。所以内存一直是使用率很高的。这是linux系统的独特之处,初使用linux系统的同学需要转换一些思维。不用为linux的内存使用率高而担心。
在图1中,第三行反映出真实内存使用率为12.5%
再介绍一个linux查看内存的命令, free
free命令可以显示当前系统为使用和以使用的内存情况,还可以显示被内存使用的内存缓冲区。
free命令默认以K单位来显示内存使用情况
Mem行显示数据
total:总内存大小
used:已使用内存大小
free:当前空闲内存大小
shared:多个进程共享的内存总额
buffers/cached:缓存内存数据
-/+ buffers/cache行数据显示
这一行的数据代表应用内存使用情况,可理解为真实内存使用情况。如图1中第三行数据。
used:当前(真实)使用内存总数
free:当前(真实)空闲内存总数
-/+ buffers/cache: 1025604 7165460可理解为当前已经使用的内存为1/8,计算公式used/(used+free)。也就是12.6%左右。
Swap代表交换分区,不做过多详解
free常用参数:
free -b #以Byte为单位显示内存使用情况
free -k #以KB为单位显示内存使用情况,也是默认参数
free -m #以MB为单位显示内存使用情况
free -g #以GB为单位显示内存使用情况
free -o #不显示应用(真实)内存使用情况列,不推荐
free -s数字 #间隔数字秒数刷新显示内存使用情况
free -t #显示内存总和列
free -V #显示当前版本
Q3: linux下清理内存以及swap
第一步linux清理内存的命令:先执行sync命令
#sync
sync命令用于强制被改变的内容立刻写入磁盘linux清理内存的命令,更新超块信息,以防止释放,sync命令则可用来强制将内存缓冲区中的数据立即写入磁盘中。
第二步:清理linux内存缓存
#echo 3 /proc/sys/vm/drop_caches
一般系统是不会自动释放内存的
关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录linux清理内存的命令了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:
0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存
此指令输入立即生效,意在释放所有缓存。
第三步:关闭swap,再开启swap
(如果只是清理swap,第二部可以不用进行操作,因为操作了第二步关闭swap时会使用更长的时间)
#swapoff -a 这一步因为是后台 在一点一点的释放,如果配置的swap超大,这里就等待得超久一些
#swapon -a 再开启
linux什么时候开始使用虚拟内存(swap)
A.[root@wenwen ~]# cat /proc/sys/vm/swappiness
60
上面这个60代表物理内存在使用60%的时候才会使用swap
swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,
swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
通常情况下:
swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。
B.修改swappiness参数
临时性修改:
[root@wenwen ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@wenwen ~]# cat /proc/sys/vm/swappiness
10
永久性修改:
[root@wenwen ~]# vim /etc/sysctl.conf
加入参数:
vm.swappiness = 35
然后在直接:
[root@wenwen ~]# sysctl -p
查看是否生效:
cat /proc/sys/vm/swappiness
35
Q4: 如何手动释放Linux内存的方法
1、首先打开Linux命令窗口,可使用快捷键Ctrl+Alt+T打开。
2、这时查看一下当前Linux系统内存使用情况,使用命令:Free –m,total 内存总数,used 已经使用的内存数,free 空闲的内存数。
3、接下来的操作需要先获取高级用户权限,输入命令:sudo -i,确定后输入高级用户密码。
4、这时进行拷贝文件拷贝,增加内存使用量(即used的占用量),输入命令: cp -r /etc ~/test/。
5、执行命令结束后,再次查看一下当前Linux系统内存使用情况,发现有70M的内存被cached用了。使用命令:Free –m。
6、接下来释放已被占用的缓存,输入命令: cat /proc/sys/vm/drop_caches,回车后返回结果0。
7、接着输入命令:sync,回车后继续输入命令:echo 3 /proc/sys/vm/drop_caches,回车后继续输入:cat /proc/sys/vm/drop_caches,回车后返回结果3,将/proc/sys/vm/drop_caches值设为3。
8、这样缓存释放就已经完成了,再次执行命令Free –m看看,通过图中可以对比看到,内存被释放了218M。
Q5: linux清理内存缓存命令
看缓存的命令
free -m
清理缓存的命令
echo 1 /proc/sys/vm/drop_caches
echo 2 /proc/sys/vm/drop_caches
echo 3 /proc/sys/vm/drop_caches
echo 0 是不释放缓存
echo 1 是释放页缓存 《Linux就该这么学》
ehco 2 是释放dentries和inodes缓存
echo 3 是释放 1 和 2 中说道的的所有缓存
linux清理内存的命令的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 清理、linux清理内存的命令的信息别忘了在本站进行查找喔。








