刚入了一台 digital ocean 的 VPS,1 核 1G,30G+SSD 只要 10$, 遂在上面跑了一个 gitlab,作为个人 git 仓库,然而启动后出现了 502,已检查发现内存不够,原来默认没有分 swap(好坑),手动添加一下吧
查看 swap 分区占用情况
$ cat /proc/meminfo | grep Swap
SwapCached: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
此时 Swap 分区为空
查看系统还有多少空间
$ df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 30G 1.8G 27G 7% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 493M 4.0K 493M 1% /dev
tmpfs 100M 316K 100M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 498M 24K 497M 1% /run/shm
none 100M 0 100M 0% /run/user
此时 /
目录还有 27G,可以分
创建 Swap 文件
$ sudo dd if=/dev/zero of=/swap.disk bs=1m count=2k
([/dev/zero][1]) 或者
$ sudo fallocate -l 2G /swap.disk
([fallocate][2]) man page
此时根目录下生成 swap.disk,可设置 chmod 600 /swap.disk
使 swap 只能 root 可读写,保证读写安全
设置 Swap
$ sudo mkswap /swap.disk
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=1ba86321-c49d-434c-8c52-741173fb5eab
启动 Swap
$ sudo swapon /swap.disk
在查看内存用量
$ cat /proc/meminfo | grep Swap
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
已有 Swap 数据
设置重启不失效
上述方法在系统重启后 swap 会自动不挂载,设置方法为
$ sudo echo "/swap.disk none swap sw 0 0" >> /etc/fstab
其他操作
设置 Swap 用量
$ sudo echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf
为了不重启生效,则
$ sysctl vm.swappiness=10
[1]: javascript:void (0) “在类 UNI 操作系统中,/dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符 (NULL,ASCII,NUL,0x00) 其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。BSD 就是通过 mmap 把 /dev/zero 映射到虚地址空间实现共享内存的。可以使用 mmap 将 /dev/zero 映射到一个虚拟的内存空间,这个操作的效果等同于使用一段匿名的内存(没有和任何文件相关)。”
[2]: javascript:void (0) “dd 指令为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果欲产生超大文件,速度很慢如果想让系统认为这里存在一个大文件,而不用具体将空字符写入此处磁盘,则可以使用 fallocate,但 Docker 中该指令失效”