github编辑

23.5 Swap 分区

如果在安装系统时未设置 swap(交换分区),则只能通过 dd 命令创建交换分区文件或 ZFS 卷来实现。因为无论是 UFS 还是 ZFS,都不支持缩小文件系统分区。

传统的 dd 单个文件

创建一个大小为 8GB(1GB = 1024MB,如需更大容量,请读者做个简单的计算题)的交换文件 /usr/swap0

# dd if=/dev/zero of=/usr/swap0 bs=1M count=8192 status=progress  # bs=1M 表示使用 1MB 块写入零;status=progress 用于显示写入进度
  8416919552 bytes (8417 MB, 8027 MiB) transferred 4.011s, 2098 MB/s # 该输出为实时刷新信息
8192+0 records in
8192+0 records out
8589934592 bytes transferred in 4.071005 secs (2110028088 bytes/sec)

设置交换分区文件权限,仅允许所有者读写:

# chmod 0600 /usr/swap0

若要立即使用,可将 /usr/swap0 文件挂载为内存磁盘(memory disk)md0,并启用交换空间:

# mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0

为了在重启后仍能生效,还需在 /etc/rc.conf 文件中添加下行:

swapfile="/usr/swap0"

以定义交换文件路径。

使用 ZFS 卷充当 Swap

警告

本节操作可能会影响系统崩溃转储(core dump)。

警告

根据 OpenZFS 文档arrow-up-right 备份arrow-up-right所述,在内存压力极高的系统上,无论 swap 空间剩余多少,使用 zvol 作为 swap 设备都可能导致系统锁死。参见 Swap deadlock in 0.7.9arrow-up-right。而将 swap 放置在其他分区上又可能会影响 ZFS 对 swap 的数据校验,因此上游文档建议弃用 swap。需要读者注意,swap 对于休眠是至关重要的,若需要该功能,需要至少保证 swap 的容量不小于内存。

在 ZFS 池 zroot 下创建 8G 大小的 zvol(ZFS 块设备卷)用作交换空间:

在上述命令中:

  • $(getconf PAGESIZE) 可以返回页面大小(固态硬盘通常会返回值 4096),从而使 swap 卷和系统页面对齐,以期提高性能

  • -o 用于指定选项,意为“option”:-o 属性名=属性值

  • -o logbias=throughput:ZFS 将优化同步操作,提高池的全局吞吐量并有效使用资源,可提高文件写入的性能

  • -o sync=always:强制所有写入实时同步

  • -o primarycache=metadata:控制 ARC 的缓存策略只缓存元数据,不缓存实际数据块,避免 ARC 将 Swap 数据写入内存

  • -o com.sun:auto-snapshot=false:禁用自动快照,因为通常无必要快照 swap

  • 参数 -V 用于创建 ZFS 卷(zvol)而非 ZFS 文件系统

  • 在 FreeBSD 中,ZFS 默认的池名称为 zroot

  • 本次创建的卷叫 swap

启用 ZFS zvol 作为交换空间:

/etc/fstab 中添加 ZFS zvol 交换分区挂载项,实现开机时自动挂载:

写入后,可使用命令 mount -al 检查(-a 表示挂载 /etc/fstab 中所有条目;-l 表示仅挂载带 late 标记的分区,而不挂载普通分区),确保无错误输出。参见 man mount(8)arrow-up-right

参考文献

查看 swap 使用量

以更易读的单位显示系统交换空间信息:

选项 -h 表示以可读性较高的格式(human-readable)输出。参见 man swapinfo(8)arrow-up-right

可以看到,/dev/nda0p3 为交换分区,大小为 2GB,已使用 0。

最后更新于