情况描述:
朋友在阿里云上有一台系统为CentOS7的VPS,内存为2GB,用于平时开发自己的项目时测试使用;
他在上面运行了5个docker实例,运行java程序;还有一个mysql服务;
上述5个docker实例和mysql服务总共占用VPS1.35GB的内存,系统运行很慢。ssh连接输入命令都有卡顿;
因为内存太小,没什么可以优化的空间。所以准备启用swap交换空间。
百度了一下收到博客文章, 通过文章中提供的方式添加swap空间;但是遇到一个问题,该centos7系统中,不存在/dev/zero文件,所以找到另一篇博客文章.
具体步骤如下:
1. 误删/dev/zero文件的解决方法如下两条命令进行修复重建文件:
[root@localhost sslinux]# mknod /dev/zero c 1 5 [root@localhost sslinux]# chmod 666 /dev/zero
修复完成后用命令测试下是否可用,发现已经可以正常使用磁盘测试了
[root@localhost sq808sq]# dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
至此,/dev/zero 文件的修复重建工作已经完成(该文件为系统特殊文件丢失后不能从系统盘或其他系统直接复制使用,只能通过重建修复,/dev/null文件也是如此)
2.使用dd 命令 新增 swap空间(/var/swap)
dd if=/dev/zero of=/var/swap bs=1024 count=4096000 ls -lh /var/swap mkswap /var/swap mkswap -f /var/swap swapon /var/swap free -lh swapon /var/swap more /proc/swaps vim /etc/fstab free -lh
将swap设置为开机自动挂载:
[root@izbp12z8w3jbbgmy9yiz92z ~]# tail -1 /etc/fstab /var/swap swap swap defaults 0 0
但是此时使用 free -lh
命令查看memory和swap的使用情况,依旧没什么变化。
1.swap 是存储“暂时不需要使用的内存”到硬盘上,等到使用的时候再载入到内存中
这种情况只能说明,没有“长期不使用的内存”
2.Swap 的使用量和 OOM 没有直接关系。OOM 看的是申请量不是使用量。哪怕你内存没用完都会触发 OOM
系统在什么情况下才会使用SWAP?
实际上,并不是等所有的物理内存都消耗完毕之后,才去使用swap的空间,什么时候使用是由swappiness 参数值控制。
[root@rhce ~]# cat /proc/sys/vm/swappiness 60
该值默认值是60.
swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,
swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
即内存足够大的时候,swappiness设置尽量小; 内存较小的时候,swappiness要设置的尽量大;
如何修改swappiness参数?
- 临时性修改:
[root@rhce ~]# sysctl vm.swappiness=10 vm.swappiness = 10 [root@rhce ~]# cat /proc/sys/vm/swappiness 10
- 永久修改:
在/etc/sysctl.conf 文件里添加如下参数:
vm.swappiness=10 [root@izbp12z8w3jbbgmy9yiz92z ~]# sed -i '$a vm.swappiness=100' /etc/sysctl.conf [root@izbp12z8w3jbbgmy9yiz92z ~]# sysctl vm.swappiness vm.swappiness = 100
到这里,系统就会尽可能的使用swap。 可以执行一个占用大量内存的命令看一下效果;
此时再查看内存和swap的使用情况:
[root@izbp12z8w3jbbgmy9yiz92z ~]# free -lh total used free shared buff/cache available Mem: 1.8G 899M 690M 1.5M 249M 779M Low: 1.8G 1.1G 690M High: 0B 0B 0B Swap: 3.9G 715M 3.2G
OK,问题解决了。
因为觉得以后可能会再次遇到这样的情况,所以简单记录一下;