Linux定期清理内存方法

问题背景

最近在项目,一个用于文件上传服务的jar包业务总是崩溃,几乎就是几个小时崩一次,由于用户集中上传文件到服务器,服务器IO交互频繁,导致内存占满,程序崩溃。

解决方法:写一个清理缓存的脚本,加入到Linux的定时计划中,定时清理缓存,保证系统平稳运行。

查看内存使用情况

使用如下指令,查看内存使用的情况
free -h

结果如下:

              total        used        free      shared  buff/cache   available
Mem:            31G        1.3G         20G        362M        9.7G         29G
Swap:           63G          0B         63G

可以看到buff/cache占用的内存比较大,而且这个数据还在一直增长。

顺便说下Swap做什么用的呢?

         Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。

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

1.创建一个目录,名称自己定义,也可以放在已存在的目录中

我在系统的根目录下进行创建

mkdir my_bash_file

2.编写清除缓存脚本

# 直接编辑即可
vi /my_bash_file/cleanCache.sh

# 也可以先创建,在打开进行编辑
cd /my_bash_file
touch cleanCache.sh
vi cleanCache.sh
#!/bin/bash
# 没间隔25分钟清除一次缓存,时间可以在定时任务中,自定义进行设置
# 执行脚本时产生的标准输出以及错误输出都会保存在/my_bash_file/test.log中,出现问题可以查看该文件
echo "开始清理缓存"
sync;sync;sync          #清理之前先同步写入硬盘,防止数据丢失,这里进行三次同步
sleep 5          #延迟5秒
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "清理结束"

3.编辑完成后,给文件赋予可执行权限,或者最大的权限都可以

# 赋予脚本可执行权限
chmod +x cleanCache.sh
# 或者赋予其最大的权限都可以
chmod 777 cleanCache.sh

3.手动测试脚本是否可以正常运行

./cleanCache.sh

脚本运行没有问题后,可以加入到定时计划中。

注意:测试脚本运行没有问题后,在加入定时计划之前,要将脚本中的输入内容注释掉,或者直接删除输出指令,因为定时计划中的执行的脚本不会打印到控制台,会发送输出内容到用户的邮箱,防止log文件越大越大,尽可能的不要输出内容,或者设置输出到指定的文件,自己定期查看并删除。

4.定时计划的解释:

最主要的就是下面的那行带星号的

  • 第一个星号:表示分钟 (0-59)
  • 第二个星号:表示小时 (0-23)
  • 第三个星号:表示天数 (1-31)
  • 第四个星号:表示月份 (1-12)
  • 第五个星号:表示星期/周(1-7)(0-6 国外人习惯用这个方式,0表示星期天)
  • 后面写上需要操作的命令即可

时间格式定义:

符号\作用作用
*表示每(每分钟,每天)
*/n隔多久
n-m连续时间范围
n,m不连续时间范围

5.设定定时任务

输入如下指令,进入定时任务编辑界面

crontab -e

注意:

一、定时任务中执行脚本时,最好使用bash 或者sh来执行脚本,不要使用 ./ 指令进行脚本的云溪行否则会报错

-bash: ./my_bash_file/cleanCache.sh: No such file or directory

二、脚本中的路径要为绝对路径

三、如果出现mail的报错:mailed 65 bytes of output but got status 0x004b#012

/etc/postfix/main.cf文件中inet_interfaces值改为all即可

例子1:图表示每天的凌晨2点就会执行脚本

0 02 * * * bash /my_bash_file/cleanCache.sh

例子2:定时任务可以精确到分钟-->表示每天的凌晨2:30分会备份这个文件

30 02 * * * bash /my_bash_file/cleanCache.sh

例子3:间接性定时任务
可以设置一个每隔多久时间的操作一次定时任务
表示每隔2隔小时操作一次后面的命令,但是这里的每隔2小时是整数倍执行,2点 4点 6点 以此类推的时间备份。不会3点,5点的时间备份

* */2 * * * bash /my_bash_file/cleanCache.sh

例子4:时间段内执行定时任务
设置一个时间段内执行定时任务,表示8点到14点执行后面的命令

* 8-14 * * * bash /my_bash_file/cleanCache.sh

例子5:指定时间多次执行定时任务
比如需要这个定时任务,需要9点,10点,12点各执行一次

* 9,10,12 * * * bash /my_bash_file/cleanCache.sh

我们的脚本设定为每间隔25分钟执行一次,并将执行中产生的内容以及错误信息,输出到指定的文件

*/25 * * * * bash /my_bash_file/cleanCache.sh > /my_bash_file/test.log 2>&1

设定完成后:wq保存退出,定时计划就会运行,无需重启

6.检查定时计划

该指令会输出设定的定时计划内容

crontab -l

也可以通过log查看定时计划的执行情况

# tail -f /var/log/cron
Sep 24 13:29:01 filezj1 CROND[37695]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:30:01 filezj1 CROND[48823]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:30:01 filezj1 CROND[48824]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Sep 24 13:31:01 filezj1 CROND[60514]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:31:49 filezj1 crontab[5018]: (root) BEGIN EDIT (root)
Sep 24 13:31:55 filezj1 crontab[5018]: (root) END EDIT (root)
Sep 24 13:32:01 filezj1 CROND[7529]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:33:01 filezj1 CROND[19303]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:34:01 filezj1 CROND[31135]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:35:01 filezj1 CROND[42922]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)

使用这个命令就可以实时查看cron的日志文件
以空格做分割符号:
第一二三列:定时任务触发时间信息
第四列:定时任务执行主机名称
第五列:定时任务触发方式1. ROND:配置定时任务
2. anacron:系统默认定时任务
最后列:执行任务信息

 

参考链接:

http://www.minseng.com/topic/15

https://blog.csdn.net/Ming_Ba/article/details/103704388

 

 

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux服务器内存清理可以通过以下几种方式实现: 1. 使用free命令查看内存使用情况,如果发现内存占用过高,可以使用sync命令将内存中的数据写入磁盘,然后使用echo 3 > /proc/sys/vm/drop_caches命令清空内存缓存。 2. 使用top命令查看进程占用内存情况,如果发现某个进程占用过高,可以使用kill命令结束该进程。 3. 使用vmstat命令查看内存使用情况,如果发现内存占用过高,可以使用sysctl命令调整内存参数,例如调整vm.swappiness参数,使系统更倾向于使用交换分区而不是内存。 4. 定期清理无用的日志文件、缓存文件等,释放内存空间。 总之,Linux服务器内存清理需要根据具体情况采取不同的方法,保证系统稳定运行。 ### 回答2: Linux操作系统是一种非常强大和安全的服务器操作系统,很多公司和机构都使用Linux系统来运行他们的网站、数据库和其他应用程序。但是,在长时间运行后,Linux服务器内存可能会变得非常拥挤,这时候就需要进行内存清理来提高服务器性能。 以下是一些常见的Linux服务器内存清理方法: 1. 禁用不必要的服务和进程:Linux操作系统运行了许多的服务和进程,其中一些可能是不必要的,会占用大量的内存和CPU资源。通过禁用不必要的服务和进程,你可以释放大量的内存空间,从而提高服务器性能。 2. 清除不必要的缓存和日志:Linux系统使用缓存来加速磁盘访问,但是过多的缓存占用了大量的内存资源。你可以手动清除不必要的缓存来释放内存。另外,日志文件也会占用大量的内存资源,你可以定期清除无用的日志文件。 3. 使用内存清理工具:Linux系统提供了一些内存清理工具可以快速释放内存。例如,可以使用命令“sync; echo 1 > /proc/sys/vm/drop_caches”来释放缓存。 4. 增加服务器内存:如果你的服务器经常卡顿或崩溃,那么可能是内存资源不足。如果财力允许,可以考虑增加服务器内存。 总之,清理Linux服务器内存是非常重要的,你可以采用上述方法来优化服务器的性能。如果你不确定如何清理内存,建议咨询专业的Linux系统管理员。 ### 回答3: Linux服务器内存清理是一个非常重要的话题,因为清理内存能够提升服务器的性能和稳定性。内存清理主要有三个方面:缓存清理、内核缓存清理和交换分区。 缓存清理是指清理Linux服务器上的文件系统和应用程序的缓存。缓存是存储在内存中的数据,以便下次访问时可以更快地读取。但是,过多的缓存可能会影响服务器的性能,因此清理过期的缓存是必要的。在Linux服务器上,有两种方法可以清理缓存:手动和自动。手动清理可以使用“sync”命令来强制刷新文件系统缓存。而自动清理则需要通过设置/sys文件系统中的相应内核参数来实现。 内核缓存是由内核自己使用的缓存,包括虚拟内存和缓冲区。通过减少内核缓存,可以释放一定的内存空间,提升系统的性能。内核缓存的清理可以通过使用“echo 3 > /proc/sys/vm/drop_caches”命令来实现。该命令会将所有的内核缓存清空,并释放一定的内存空间。 交换分区是在服务器内存不足时使用的一种虚拟内存技术。当内存不足时,操作系统会将部分内存数据移动到硬盘中的交换分区中。但是这会导致系统的性能下降。因此,在有足够内存的情况下,禁用交换是一个不错的选择。 总的来说,清理Linux服务器内存是一个比较简单但重要的任务。通过缓存清理、内核缓存清理和交换分区控制,可以帮助提升服务器的性能和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值