本文总体结构:
第一部分:本文中释放系统内存的原理
第二部分:创建用于释放内存的Shell脚本并加入到系统定时任务
第三部分:详细分析Shell脚本中的每一条指令
第四部分:系统定时任务的工作方式
第一部分:本文中释放系统内存的原理
本文中介绍的方法是通过释放内存缓冲区的数据,达到降低系统内存占用的目的。
当我们在Linux系统中输入 top
指令时,可以在 Mem
这一栏看到下面这些内存指标:
total, free, used, buff/cache
其中, total
是物理内存总量; free
是目前的空闲内存总量; used
是目前已使用的内存总量; buff/cache
(即 Buffers/Cached
)是内存缓冲区的大小。
在Linux中:
total = free + used + buff/cache
Linux系统在运行的过程中,CPU需要和外存进行数据交换,但是一般情况下,CPU的读写速度远大于外存设备(如硬盘)的读写速度,为了提升外存的I/O性能,提升系统的运行速度,就需要用到内存缓冲区(外存,如硬盘中,也有缓冲区)。内存缓冲区有两种类型,一种是Buffers, 用于存放由CPU输出的,需要写入外存的数据,另一种是Cache, 用于存放从外存读取的,需要输入到CPU进行处理的数据。
第二部分:创建用于释放内存的Shell脚本并加入到系统定时任务
在 */*/
目录下(具体目录自定义)新建一个以 .sh 结尾的文件,如:
vim /*/*/freemem.sh
再创建一个文件用于保存Shell脚本的输出内容:
vim /*/*/ifdone.txt
将以下内容写入该文件:
#!/bin/bash sync echo 1 > /proc/sys/vm/drop_caches sync echo 2 > /proc/sys/vm/drop_caches sync echo 3 > /proc/sys/vm/drop_caches echo "done!"
赋予 freemem.sh
可执行权限:
chmod +x freemem.sh
设置定时任务
crontab -e
写入
00 00 * * * /*/*/freemem.sh >> /*/*/ifdone.txt
即:每天0点0分执行 freemem.sh
这个脚本并将脚本中 echo "done!"
输出的内容写入到 ifdone.txt
这个文件中,这样我们就可以通过查看 ifdone.txt
中的内容来大致确定Shell脚本是否成功执行。
第三部分:详细分析Shell脚本中的每一条指令
本文中Shell脚本内容的说明:
1. #!/bin/bash
以 #
开头,当然是注释,但既然是注释,为什么还要写上呢?
其实这里不是写的 #
加上 !/bin/bash
,而是写的 #!
加上 /bin/bash
. #!
是一个约定的标记,可以告诉系统用来解释这个脚本的解释器位于系统的哪个位置(Shell说到底就是一种编程语言,和Python、PHP这些脚本语言一样,只要有一个文本编辑器和一个相应的脚本解释器就可以编写并解释运行脚本了),本文这个Shell脚本的解释器就是位于 /bin
路径下的 bash
.
Shell是一个用C语言编写的程序,通过这个程序以及这个程序提供的交互界面,用户可以操控系统,向系统发出指令并接收系统的返回结果,是用户与Linux/Unix系统进行交互的纽带。
在Shell刚出现的时候,Shell的界面就是指的是Linux/Unix系统的纯命令行界面。但是随着图形化界面的发展,我们可以认为图形化界面也是一个Shell.
Shell并不是只有一种,常见的Shell类型有:
名称 | 解释器位置 |
---|---|
Bourne Again Shell | /bin/bash |
Bourne Shell | /usr/bin/sh或/bin/sh |
C Shell | /usr/bin/csh |
K Shell | /usr/bin/ksh |
Shell for Root | /sbin/sh |
… | … |
Shell和内核、文件系统以及应用程序一起被认为是Linux系统的4个主要部分,其中内核、Shell和文件系统是Linux系统的系统基本结构。
2. sync
sync
: 强制将缓冲区的数据立即写入。
在Linux和Unix系统中,一般会把正在处理的文件或数据放到内存缓冲区内,由于内存缓冲区的I/O速度更高,相比于硬盘的I/O速度,内存缓冲区的读写速度更加接近CPU的处理速度,因此将正在处理的数据放在内存缓冲区可以加快系统运行速度。
一般情况下,用户是不需要主动执行 sync
命令的,因为系统会自动执行 update
(更新)或 bdflush
(将缓冲区中的数据冲洗到硬盘上),除非在系统无法执行 update
或者 bdflush
操作、系统需要非正常关机以及用户需要主动对内存中的数据进行一些关键性操作时需要主动执行 sync
.
3. drop_caches
drop_caches
这个文件的意义比较好理解:
drop
: 降低、减少
caches
:(计算机)快速缓冲贮存区
但是,为什么, drop_caches
这个文件会在 /proc/sys/vm
这个路径下呢?
proc
的英文全称是 process
, 即:进程,工序。
/proc
这个路径下主要是和系统进程信息相关的文件,即正在运行的系统内核的信息的映射。 /proc
路径下除了 /proc/sys
之外基本都是只读的。 /proc/sys
路径下的文件可写,可以查看和修改系统内核的运行参数。
/sys
路径下存放的是硬件设备的驱动程序信息。
我们可以通过把不同的数值写入 /proc/sys/vm/drop_caches
这个文件来调整系统内核,进而释放内存:
0: 默认值
1: to free pagecache, use
2: to free dentries and inodes, use
3: to free pagecache, dentries and inodes, use
第四部分:系统定时任务的工作方式
本文中执行定时任务的是 crond
这个系统守护进程。
在百度百科“守护进程”词条中是这样描述守护进程的:
引用:守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
crontab的用法如下:
crontab -e
: 以当前用户的身份创建一个定时任务,该定时任务只对当前用户有效。
例如,输入:
00 00 * * * /*/*/freemem.sh >> /*/*/ifdone.txt
上述指令串从左向右含义依次是:
minute hour day month dayofweek command
解释如下:
指令 | 含义 |
---|---|
minute | 分钟,整数0~59 |
hour | 小时,整数0~23 |
day | 日,整数1~31(对应月份的有效日期) |
month | 月,整数1~12 |
dayofweek | 周X,0~7(0和7代表周日) |
command | 需要执行的命令 |
也可以直接编辑 /etc/crontab
这个文件来创建定时任务,这样创建的定时任务可以作用到整个系统的所有用户。
crontab -l
: 列出当前所有定时任务。
crontab -l -u mm
: 列出用户mm的所有定时任务
crontab -r
: 删除所有定时任务(警示:慎用!!!)