返回果真SPESHOW博客列表

swap

发布于 1年前
摘要
ubuntu14.04 交换分区 缓存

问题:查看日志的服务器经常发生挂载mfs文件系统失败,每次重启服务器就好了


原因:Cached的值过大,导致系统没有可以再分配的内存空间。Cached用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,从2.6.16以后的核心版本才提供,也就是老版的操作系统。这就可以解释为什么mfsmount进程总挂掉了,当使用vim,grep等命令查看日志文件时文件会被缓存起来,一直耗着内存不释放,系统内存被全部占用,导致mfsmount进程异常终止


解决方法:清理cached,设置交换分区


一、清理cached


1.手动清理

root@prod-k8s-mfs2:~# sync       --sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件,确保文件系统完整性
root@prod-k8s-mfs2:~# echo 1 > /proc/sys/vm/drop_caches
root@prod-k8s-mfs2:~# echo 2 > /proc/sys/vm/drop_caches
root@prod-k8s-mfs2:~# echo 3 > /proc/sys/vm/drop_caches


执行完这三条指令后通过free -m命令查看,free可用内存马上增多,buff/cache列值变小,说明内存被释放了

执行前

blob.png

执行后

blob.png


2.自动清理

root@prod-k8s-mfs2:~# vim freemem.sh
#! /bin/sh
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /app/memory/logs/mem.log
date >> /app/memory/logs/mem.log
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/memory/logs/mem.log
if [ $free -le 4000 ] ; then
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches
used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/memory/logs/mem.log
                               echo "OK" >> /app/memory/logs/mem.log
else
                               echo "Not required" >> /app/memory/logs/mem.log
fi
exit 1


添加到时任务

06 * * * /root/freemem.sh       --每天早上6点执行一次freemem.sh脚本


重启crond服务

service crond restart


查看crond服务是否重启成功

service crond status


二、设置swap

SWAP是操作系统虚拟出来的一部分内存地址,它的物理存储元件是磁盘。在备份数据或恢复数据或其他操作时,文件系统会向Linux系统请求大量的内存作为cache。在物理内存使用殆尽时候,为了确保程序运行,往往会将另外的一些占用物理内存地址空间的程序映射到swap分区上。


系统未设置SWAP,如下图所示:

blob.png


这里给系统划出一块swap


1.在根目录下新建一个文件夹swap

root@prod-k8s-mfs2:~# mkdir /swap


2.创建swap分区:使用dd命令生成一个空文件, 由于VPS的内存是16G, 这里swap设置为32G

root@prod-k8s-mfs2:~# cd /swap
root@prod-k8s-mfs2:/swap# dd if=/dev/zero of=swap.img bs=1M count=32768
32768+0 records in
32768+0 records out
34359738368 bytes (34 GB) copied, 796.07 s, 43.2 MB/s


3.格式化swap分区

root@prod-k8s-mfs2:/swap# mkswap swap.img
Setting up swapspace version 1, size = 33554428 KiB
no label, UUID=975c5142-c60e-4c38-9433-4964e0c3a507


4.激活swap

root@prod-k8s-mfs2:/swap# swapon swap.img


5.设置完成,查看结果

root@prod-k8s-mfs2:/swap# free -h
            total       used       free     shared    buffers     cached
Mem:           15G        15G       159M       784K        48M        14G
-/+ buffers/cache:       1.1G        14G
Swap:          31G         0B        31G


6.在系统重启后,swap文件的大小又会变回原大小,我们可以在/etc/fstab里增加下面的配置,使其重启后,我们刚刚的配置仍然有效。

$ sudo vim /etc/fstab
/swap/swap.img             swap                    swap    defaults        0    0


7.设定Linux内存参数,始终留出一块空间,以避免缓存不释放导致死机。

ubuntu@prod-k8s-mfs2:~$ mv /etc/sysctl.conf /etc/sysctl.conf.back                         --备份
ubuntu@prod-k8s-mfs2:~$ echo 'vm.min_free_kbytes = 2097152' >> /etc/sysctl.conf           --预留2G内存








 
相关信息
     标签
       附件
      文件 标题 创建者

      评分 0次评分

      日程