增加定时检测linux占用内存,及时清理功能

原文:http://www.voidcn.com/article/p-wnmannom-boa.html

free -m 查看,发现内存跑满了。

再 top,然后按下shift+m,也就是按内存占用百分比排序,发现排在第一的进程,才占用7.9%。

但是总内存大小8G,竟然有5G都被使用了,

那是什么占用的呢?

百度了一下,据说是centos为了提高效率,把部分使用过的文件缓存到了内存里。

如果是这样的话,我又不需要这样的文件性能,那就可以释放。如下两个命令就可以:

#sync

#echo 3 > /proc/sys/vm/drop_caches

内存释放后,就占用很低了,

写一个脚本,然后使用crontab定时没分钟执行一次,检测内存量使用超过80%的时候报警,释放内存,

释放内存脚本如下:

#!/bin/bash

#系统分配的区总量
mem_total=`free -m | awk 'NR==2' | awk '{print $2}'` #当前剩余的大小
mem_free=`free -m | awk 'NR==3' | awk '{print $4}'` #当前已使用的used大小
mem_used=`free -m | grep Mem | awk '{print $3}'` if (($mem_used != 0)); then #如果已被使用,则计算当前剩余free所占总量的百分比,用小数来表示,要在小数点前面补一个整数位0
mem_per=0`echo "scale=2;$mem_free/$mem_total" | bc`
DATA="$(date -d "today" +"%Y-%m-%d-%H-%M") free percent is : $mem_per"
echo $DATA >> /var/log/mem_detect.log
#设置的告警值为20%(即使用超过80%的时候告警)。
mem_warn=0.20 #当前剩余百分比与告警值进行比较(当大于告警值(即剩余20%以上)时会返回1,小于(即剩余不足20%)时会返回0 )
mem_now=`expr $mem_per \> $mem_warn` #如果当前使用超过80%(即剩余小于20%,上面的返回值等于0),释放内存
if (($mem_now == 0)); then
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
#将release memory OK !写入temp文件夹的memstat_日期.log日志中
echo "--->release memory OK ! " >>temp/memstat_$(date +%Y%m%d_%H%M%S).log fi
fi

下面说一下怎么使用定时:

一.  Crontab 介绍

crontab命令的功能是在一定的时间间隔调度一些命令的执行。

二.查看/etc/crontab文件

vim  /etc/crontab

在crontab中增加定时任务

三.文件/etc/crontab中每行任务的描述格式如下:

minute hour day month dayofweek command

minute - 从0到59的整数 
    hour - 从0到23的整数 
    day - 从1到31的整数 (必须是指定月份的有效日期)
    month - 从1到12的整数 (或如Jan或Feb简写的月份)
    dayofweek - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
    command - 需要执行的命令(可用as ls /proc >> /tmp/proc或 执行自定义脚本的命令)

如果是每五分钟执行一次可改为:

*/5 * * * * /home/dbbackup/db2backup.sh

四.crontab服务的启动关闭

sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置

代码如下:

#!/bin/bash
echo "current time is $(date -d "today" +"%Y-%m-%d-%H-%M-%S")" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#系统分配的区总量
mem_total=`free | grep "Mem:" |awk '{print $2}'`
echo "mem_total is $mem_total " >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#当前剩余的大小
mem_free=`free | grep 'buffers/cache' | awk '{print $3}'` echo "mem_free is $mem_free" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#当前已使用的used大小
mem_used=`free -m | grep Mem | awk '{print $3}'`
echo "mem_used is $mem_used" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
if (($mem_used != 0)); then #如果已被使用,则计算当前剩余free所占总量的百分比,用小数来表示,要在小数点前面补一个整数位0
mem_per=0`echo "scale=2;$mem_free/$mem_total" | bc`
echo "free percent is $mem_per" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
DATA="$(date -d "today" +"%Y-%m-%d-%H-%M-%S") free percent is : $mem_per"
echo $DATA >> /usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
echo $DATA >> /var/log/mem_detect.log
#设置的告警值为44%(即使用超过56%的时候告警)。
mem_warn=0.4
echo "mem_warn is $mem_warn" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#当前剩余百分比与告警值进行比较(当大于告警值(即剩余44%以上)时会返回1,小于(即剩余不足44%)时会返回0 )
mem_now=`expr $mem_per \> $mem_warn`
echo "剩余百分比与警告值比较 mem_now is $mem_now" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
echo "when mem_now is 1 , means mem is ok ! " >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log echo "-----------------------------------" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#如果当前使用超过56%(即剩余小于44%,上面的返回值等于0),释放内存
if (($mem_now == 0)); then
echo "but now the mem_now is 0 ,小于(即内存剩余不足44%),所以清理内存, start to clear memery....." >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "---> start auto clear memery is OK ! $DATA , warn is $mem_warn ,小于(即内存剩余不足44%),所以清理内存, " >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d_%H).log fi #取当前空闲cpu百份比值(只取整数部分)
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`
echo "cpu_idle percent is $cpu_idle,cpu 剩余量充足,警告值是当剩余不足30%时,自动清理内" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
echo "================================================================" >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
#设置空闲cpu的告警值为30%,如果当前cpu使用超过70%(即剩余小于30%),立即发邮件告警,自动清理内存
if (($cpu_idle < 30)); then
echo " cpu 剩余不足30% ,所以清理内存, start to clear memery....." >>/usr/local/tomcat/logs/monitor/mem_auto_$(date +%Y%m%d).log
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "--->cpu used more than 70% ,so start auto clear memery is OK ! $DATA , warn is $mem_warn " >>/usr/local/tomcat_treasure/logs/memery_monitor/memstat_cpu_auto_$(date +%Y%m%d_%H).log fi
fi

(转)增加定时检测linux占用内存,及时清理功能的更多相关文章

  1. 增加定时检测linux占用内存,及时清理功能

    centos为了提高效率,把部分使用过的文件缓存到了内存里. 如果是这样的话,我又不需要这样的文件性能,那就可以释放.如下两个命令就可以: #sync #echo 3 > /proc/sys/v ...

  2. CentOS7 定时检测进程占用内存大小,执行重启进程操作(xjl456852原创)

    在使用CentOS时,个别程序的进程会一直增大,直到宕机.但是这种程序本身有没有更好的版本使用(比如ngrok免费就这样,付费的就没这个问题),所以想写一个脚本定时检测一下这个程序的情况,决定是否需要 ...

  3. 查看linux占用内存/CPU最多的进程

    可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 可以使用一下命令查使用CPU最多的10个进程 ps -aux | sort -k3nr ...

  4. <转>查看linux占用内存/CPU最多的进程

    转自 http://beginman.cn/page26/ 查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 或者top (然后按下M,注意大写) 查使用 ...

  5. Linux服务器内存cache清理

    发现cache中占用大量内存,无free内存可用 使用如下命令清理: syncsysctl -w vm.drop_caches=1 转自:http://blog.csdn.net/sky_qing/a ...

  6. 记录Redis连接未正确释放,TCP连接过多,造成服务器上部分功能不可用和linux服务器内存一直增加问题

    问题1 多人共享开发服务器(windows系统),我们小组有个程序,定时检测mongodb,redis,mysql连接是否正常,程序启动一段时间后,服务器管理人员找到我们说,我们的某个pid的程序把T ...

  7. 查看 Linux memory 内存占用

    linux 系统内存: 如果系统内存使用过高 就会产生 out of memory exception 现象: 通常 在mongo 默认服务运行资源是不受限制的.也会占用而同一系统运行的其他服务: 当 ...

  8. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题(转)

    原文地址:https://wzfou.com/php-fpm/ 最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个 ...

  9. linux 查看内存和cpu占用比较多的进程

    1.可以使用一下命令查使用内存最多的10个进程        ps -aux | sort -k4nr | head -n 102. 可以使用一下命令查使用CPU最多的10个进程        ps ...

随机推荐

  1. 编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值

    建议35:使用default为泛型类型变量指定初始值 有些算法,比如泛型集合List<T>的Find算法,所查找的对象可能会是值类型,也有可能是引用类型.在这种算法内部,我们常常会为这些值 ...

  2. element时间选择器插件转化为YYYY-MM-DD的形式

    let datete = new Date(this.form.value0);this.form.value0 =datete.getFullYear() +"-" +(date ...

  3. WINDOWS权限大牛们,请进

    大家好, 我遇到一个问题,我的一台windows7去访问另一个电脑的共享,输入账号密码后,老是说密码不正确.而其他电脑去访问共享,密码账号密码后都OK 我想知道原因是什么?

  4. Sql Server 公用表达式(CTE)

    简介 对于select查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可续,在一个查询中引入另外的结果集都是通过视图而不是子查询来进行分解的,但是,视图是作为系统对象存在数据库中,那对于结果集 ...

  5. .net core Task.Result Wait等造成502

    这两天公众号项目上线,刚开始项目运行没什么问题,但几天之后,访问量激增,服务器崩溃了,每次请求都返回502,一脸懵逼,无从下手,赶紧开日志里的BUG,拿出来一个个改,BUG都改完之后,没有明显的效果, ...

  6. .NET Framework的一些基本概念

    各种Framework的区别(按在Windows程序管理中显示的名称) .NET Framework: 运行环境,仅用于运行程序 .NET Framework Developer Pack: 包含Ru ...

  7. Flutter的使用教学笔记

    QQ交流群 Flutter 程序开发群:766307130 教程 官方实战 使用Flutter 构建精美的页面 云在千峰 博主一直是从事 Android 开发的,所以主要从 Android 技术角度来 ...

  8. activeMq延迟消息队列

    Long delay = 30 * 1000L; jmsTemplate.send(type.getValue(),new MessageCreator() { @Override public Me ...

  9. MVC,MVP 和 MVVM 的区别之处

    其实我一直以来,虽然做的是前端的工作,但是有一个疑问,就是什么是mvc模式,虽然大概知道,但是具体确实说不上来的的,今天,我就好好总结一下mvc ,mvp,mvvm模式的区别与相同. 1.MVC模式: ...

  10. Servlet的概念与用法

    Servlet: Servlet(Servlet+Applet) Servlet是一种独立于平台和协议的服务器端Java应用程序,通用Servlet      可以生成动态Web页面.Servlet还 ...