关闭 Mac 上的虚拟内存

MacBook Pro with Retina display 的标配内存是8GB,这个内存足够日常使用了,考虑到 SSD 硬盘寿命的问题,建议关闭系统的虚拟内存(Swap),避免频繁写入。关闭系统 swap 还可以提高性能(参考 Linux 性能监测:MemoryLinux 性能监测:IO 的 swap 部分)。

查看当前正在使用的虚拟内存:

$ sysctl vm.swapusage
vm.swapusage: total = 1024.00M  used = 354.50M  free = 669.50M  (encrypted)

关闭虚拟内存以后,系统里还保留着这些用作虚拟内存的交换文件,可以删除:

$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

$ sudo rm /private/var/vm/swapfile*

用了一段时间还没有遇到系统不稳定问题,如果发现系统不稳的话可以重新开启虚拟内存:

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

VMware ESXi 上使用内存预留减少 vswap 文件大小

VMware ESXi 上创建的虚拟机会自动根据虚拟机的内存大小创建一个同等大小的 swap 文件,这个文件通常和虚拟机镜像文件在同一个目录,文件名以 .vswp 结尾。比如创建一个内存为 8GB 的虚拟机,那么 .vswap 就会自动创建,并且大小也是 8GB,保存在同一个 datastore 里。现在问题来了,如果我要创建一个内存为 512GB 的虚拟机,那么 VMware ESXi 就会自动创建一个 512GB 的 .vswap 文件,本地硬盘(datastore)只有 500GB 容不下 .vswap 文件怎么办?前段时间 VPSee 就碰到这个 insufficient disk space on datastore 问题,原因是 VMware ESXi 企图创建一个大小为 512GB 的交换文件,结果 datastore 只有 500GB,所以硬盘空间不够,创建失败:

vmware esxi insufficient disk space

有两个解决办法:

  • 把 .vswap 文件从本机移到其他的 datastore 或者 NFS/SAN 存储上;
  • 修改内存预留值为最大值,点击左边列表的 host,选择右边 Resource Allocation 页面,右键点击 vpsee.com 这个虚拟机后选择 Edit Resource Settings… 出现如下对话框,然后调整 Memory Resources 栏的 Reservation 至最大值 501760MB.

vmware esxi memory reservation

修改后可以在上面这张图的 Resource Allocation 页面的 Memory 部分看到 Reserved Capacity 由 0 变成了 505531 MB,再次启动虚拟机就应该会得到一个内存大小为 500GB 的虚拟机了(host 需要一点内存,所以 512GB 的 host 不能创建 512GB 的虚拟机哦)。

VMware vSphere 标准版1个授权可以用在1个物理 CPU 和 32GB VRAM 上,每台虚拟机最多支持8个 VCPU。这台 512GB 服务器虽然只有4个物理 CPU 却需要 512/32=16 个授权(VMware 新的授权政策是按照 VRAM 算而不是 RAM)。每个标准版授权995美元,16个授权需要约1.6万美元,可能比这台服务器还贵。

为 OpenNebula VM 添加 swap 分区

给 OpenNebula 制作 Ubuntu 模板的时候推荐只分一个单独区,不要交换区(swap),交换区可以以后在虚拟机外部由 OpenNebula 加上,这样把 root 区和 swap 区分开更灵活一些,方便以后创建不同大小 swap 的虚拟机。以下是在 OpenNebula 上为 Ubuntu 虚拟机增加 swap 的步骤:

修改 Ubuntu 模板文件,注意 DISK 一栏的 target 是 sda 不是 sda1,否则会出现 Boot Failed: 的错误。

$ vi ubuntu.one
NAME   = ubuntu
CPU    = 1
MEMORY = 512

OS = [ ARCH = x86_64,
        BOOT = hd,
        ROOT = sda1
]

DISK = [ source   = /var/lib/one/images/ubuntu.img,
         clone    = no,
         target   = sda,
         readonly = no ]

DISK = [ type     = swap,
         size     = 512,
         target   = sdb ]

GRAPHICS = [ type ="vnc",
             listen ="0.0.0.0",
             port = "5900" ]

启动 Ubuntu 虚拟机后,OpenNebula 就为这个虚拟机准备了一个大小为 512MB 的分区 /dev/sdb,现在登录虚拟机激活这个 swap,这样 Linux 就能识别 /dev/sdb 是个交换分区了(这个过程其实和在自己电脑上增加交换分区或用文件充当交换分区的过程差不多):

$ vncviewer 172.16.39.111:5900

$ sudo swapon /dev/sdb

$ free
             total       used       free     shared    buffers     cached
Mem:        504112      90896     413216          0      11440      33160
-/+ buffers/cache:      46296     457816
Swap:       524284          0     524284

最后可以在 /etc/fstab 里增加一条记录以便重启虚拟机以后系统能自动加上 swap:

$ sudo vi /etc/fstab
/dev/sdb    none    swap    sw    0    0