buff/cache 内容释放

| |
[不指定 2017/09/14 11:02 | by 刘新修 ]

实验环境 CentOS Linux release 7.3.1611 (Core)  3.10.0-514.6.1.el7.x86_64

oscache远程服务器特别卡,top命令查看获得 buff/cache 占据内存特别大,使用以下命令清理缓存:

swap清理:

swapoff -a && swapon -a

注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大

cache清理:

sync; sync; sync;&& echo 3 > /proc/sys/vm/drop_caches

sleep 2

echo 0 >/proc/sys/vm/drop_caches

To free pagecache:

echo 1 >/proc/sys/vm/drop_caches

To free dentries and inodes:

echo 2 >/proc/sys/vm/drop_caches

To free pagecache,dentries and inodes:

echo 3 >/proc/sys/vm/drop_caches

 

/proc/sys/vm/drop_caches 的值默认为0(所以我们清空后,还再恢复它的值为0)

一、概念介绍
linux系统中通常使用free命令来查看内存使用情况,free命令主要是从/proc/meminfo文件中读取的内存数据然后进行简单处理进行展示,根据查看free命令的手册了解到各个字段的含义。
total:系统总内存大小(分物理内存mem、交换分区swap)
used:已使用的内存(total - free - buffers - cache)
free:未使用的内存
shared:通常情况下是tmpfs(内存文件系统)使用的内存
buffers:内核缓冲区使用的内存
cache:page cache和slab所占用的内存之和
buff/cache:buffers + cache
available:在不进行swap的前提下还有多少内存可用于创建新的进程。这个跟free、buff/cache字段中的数字有所不同,这里的剩余内存是free加上可以被回收(有些slab、cache正在使用,不能回收)的page cache、mem slab的值的总和。
上述的page cache是系统读写磁盘文件时为了提高性能而将一部分文件缓存到内存中。这种做法虽然提高了磁盘I/O性能,但是也极大的占用了物理内存,特别当系统内存紧张时更容易出现问题。
 
二、实际用途
linux系统会经常执行一些写日志、生成备份文件的工作,当这些文件比较大时相应的cache就会占用大量的系统内存,而且这些类型的cache并不会被经常访问,所以系统会定期将这些cache flush到磁盘中。但是如果系统未及时的将这些cache flush到磁盘中的话,就会占用大量的内存导致出现swap的情况,这样会很影响系统的整体性能。
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。有一个内核配置接口 /proc/sys/vm/drop_caches 可以允许用户手动清理cache来达到释放内存的作用,这个文件有三个值:1、2、3。具体介绍如下
Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
- To free pagecache:
- * echo 1 > /proc/sys/vm/drop_caches
 
- To free dentries and inodes:
- * echo 2 > /proc/sys/vm/drop_caches
 
- To free pagecache, dentries and inodes:
- * echo 3 > /proc/sys/vm/drop_caches
 
- As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.
- This tunable was added in 2.6.16.
根据上面介绍,在执行上述命令需要先执行sync命令将page cache刷新到磁盘中,然后在通过该drop_caches接口进行缓存清理。
 
另外,在编写处理大文件的代码时,避免整个文件全部读取到内存中,这样会导致占用大量的内存,极端情况下会出现linux 系统的OOM导致的正常进程被终止。尽量将文件分割成小文件再进行处理,文件使用完毕后尽早close。
 
 
下面是我写的一个内存释放的脚本,分享给大家:
# vim /root/satools/freemem.sh
C#代码
  1. #!/bin/bash  
  2.   
  3. used=`free -m | awk 'NR==2' | awk '{print $3}'`  
  4. free=`free -m | awk 'NR==2' | awk '{print $4}'`  
  5.   
  6. echo "===========================" >> /var/log/mem.log  
  7. date >> /var/log/mem.log  
  8. echo "Memory usage | [Use:${used}MB][Free:${free}MB]" >> /var/log/mem.log  
  9.   
  10. if [ $free -le 100 ] ; then  
  11.                 sync && echo 1 > /proc/sys/vm/drop_caches  
  12.                 sync && echo 2 > /proc/sys/vm/drop_caches  
  13.                 sync && echo 3 > /proc/sys/vm/drop_caches  
  14.                 echo "OK" >> /var/log/mem.log  
  15. else  
  16.                 echo "Not required" >> /var/log/mem.log  
  17. fi
[root@Hongkong log]# vi mem.log
[root@Hongkong log]# chmod +x /etc/sh/freemem.sh
[root@Hongkong log]# pwd
/var/log
[root@Hongkong log]# chmod +x /etc/sh/freemem.sh
[root@Hongkong log]# cat /var/log/cron
 
查看定时任务执行的日志
/var/log/cron

查看定时任务是否开启
systemctl status crond.service
 
如果没有就安装:
yum install vixie-cron
yum install crontabs
 
/bin/systemctl restart crond.service  #启动服务
/bin/systemctl reload  crond.service  #重新载入配置
/bin/systemctl enable crond.service #加入开机服务列表
/bin/systemctl status  crond.service  #查看crontab服务状态
 
关闭并禁用默认防火墙:
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
 
手动开启一些服务:
systemctl start docker.service
systemctl start crond.service
 
开机自动开启默认服务:
systemctl enable nginx.service
systemctl enable httpd.service
systemctl enable docker.service
systemctl enable crond.service
 
 

安装crontab:

1
yum install crontabs

说明:

1
2
3
4
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
1
2
查看crontab服务状态:service crond status
手动启动crontab服务:service crond start

查看crontab服务是否已设置为开机启动,执行命令:ntsysv

加入开机自动启动:

1
chkconfig crond on
 
 
 
将脚本添加到crond任务,定时执行。
# echo "*/59 * * * * root /root/satools/freemem.sh" >> /etc/crondtab (59分钟执行一次)
# echo "2 8-20/6 * * * root /root/satools/freemem.sh" >> /etc/crondtab (8-20时的2分,每隔6个小时执行一次)
Linux/Unix | 评论(0) | 引用(0) | 阅读(568)