最近新项目开发完毕,着手上线。但公司只分配了一台阿里云1核512MB 20GB的CentOS 7云主机。
项目上线没几天,数据库直接宕机,查看日志,报警提示为内存溢出错误。在领导直接说没有更多资源分配给我时,我只好去思考其他方法。
重现打开那本尘封已久的《鸟哥Linux私房菜》,在第七章第五节--内存交换空间(swap)之创建找到解决办法。
创建交换空间有两种方法:
因阿里云主机无法支持实体分区,此文只讨论使用文件创建swap
# more /etc/centos-release ## 查看系统版本
CentOS Linux release 7.9.2009 (Core)
# cat /proc/meminfo | grep -i swap ## 查看是否启用swap
SwapCached: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
# free -m ## free命令也可以观察swap使用情况
total used free shared buff/cache available
Mem: 488 380 7 1 100 93
Swap: 0 0 0
# swapon -s ## 查看swap是否开启
# lsblk ## 列出本系统下的所有磁盘与磁盘内的分区信息
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 20G 0 disk
└─vda1 253:1 0 20G 0 part /
通过lsblk
命令可以看出,阿里云的云服务器默认只分出一个主分区/
,所以可以把swap文件创建在/
目录下。
# fallocate -l 4G swapfile ##快速生成swap文件
# ls -hltr | grep swapfile
-rw-r--r-- 1 root root 4.0G Nov 22 16:19 swapfile
## 可选的方案,这个方法相对较慢
# dd if=/dev/zero of=/swapfile bs=4096 count=1024K
# chmod 600 /mnt/swapfile ## 权限设置,必要设置,如果不设置 使用swapon会报错
# mkswap /swapfile ## 使用mkswap将文件设置为Linux交换区
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=069dc4e5-76c9-468e-9da1-231fa0f9ef28
# swapon swapfile ## 启用Linux交换分区
# swapon -s
Filename Type Size Used Priority
/swapfile file 4194300 0 -1
## 配置OS启动时自动加载Linux交换分区
# echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
交换空间频繁使用的默认值是60(最大值是100)。
数值越高,内核使用的交换空间越频繁。当该值设置为0时,交换文件将只在操作系统已充分利用内存的情况下使用。
# vim /etc/sysctl.conf
vm.swappliness=10
# sysctl -p
# cat /proc/meminfo|grep -i swap
SwapCached: 0 kB
SwapTotal: 4194300 kB
SwapFree: 4194300 kB
基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建