![如何用交换文件替换 zram 交换?](https://linux22.com/image/930699/%E5%A6%82%E4%BD%95%E7%94%A8%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6%E6%9B%BF%E6%8D%A2%20zram%20%E4%BA%A4%E6%8D%A2%EF%BC%9F.png)
我正在运行带有 Jetpack 4.4 的 Jetson Nano,它(Ubuntu 18.04)默认情况下具有 4x495 Meg ZRAM 分区作为交换空间。问题是,对于数据科学项目,我需要比 Jetson 上安装的 4gig 更多的 RAM(以及我从压缩 ZRAM 中获得的任何内存 - 不多)。所以我想制作一个 8gb 交换文件而不是 ZRAM 交换。
我如何完全禁用 ZRAM 交换以便可以创建交换文件?
我试过了
sudo apt remove --purge zram-config
sudo dpkg --purge zrawmswap-enabler
sudo dpkg --purge zram-config
sudo service zramswap stop
或者我可以创建一个磁盘交换文件并期望它替换 ZRAM 吗?
答案1
使用 zram 时,您可以在 RAM 中进行交换并压缩。每当您的系统进行交换时,它都会非常快地进行,就像 RAM 一样。
您无需停止 zram 以替换另一个交换区。您只需添加更多交换区,然后让系统处理它即可。
如果要更改 zram 的配置比例,请编辑:/etc/systemd/nvzramconfig.sh
为了在磁盘上创建新的交换,您有两个选择:
- 创建交换分区,专用
- 在驱动器中创建一个文件并将其用于交换。
如果你期望从交换到内存和从内存到交换有大量的移动:
- 您可以在 Jet Nano 中使用 16 GB eMMC 5.1,但它很快就会坏掉。它们不像 swap 那样适合在系统内存不足时进行重写。速度也会很慢。
- 您可以使用 USB 3.0 接口连接外部驱动器
- 如果您使用 SSD,大量写入可能会导致 SSD 过早损坏。您可以使用 SAS SSD 企业级,但我认为对于成本低廉的计算机来说,这会有点过度,而且速度也会限制在 USB 3.0 端口的速度。
- 如果您使用 HDD,交换将非常慢。在这两种情况下,您都会受到 USB 3.0 速度的限制
对于您所评论的内容,我相信您会运行该科学程序几次,最多 100 次,因此即使大量使用交换,对于家用 SSD 来说也应该没有问题。您也可以使用外部外壳连接 NVMe,但您不会看到高速,因为速度限制在 USB 3.0 中。三星 PRO 系列在损坏前提供双倍的写入速度。
注意使用 3.0,不要意外使用 2.0。
如果您需要使用该科学程序,也许您可以组装一台具有 16 GB 或 32 GB RAM 的廉价 PC,并且根本不需要交换。
更新 2020-11-04:在 JetPack-4.4 中,nvzramconfig 是一个 Systemd 服务,因此/etc/systemd/系统你有一个名为 nvzramconfig.service 的文件
#
# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
#
[Unit]
Description=ZRAM configuration
; Everything depends on the NVIDIA per-boot script
After=nv.service
; TPC power gating must be enabled before anything touching gpu
After=nvpmodel.service
[Service]
Type=simple
ExecStart=/etc/systemd/nvzramconfig.sh
[Install]
WantedBy=multi-user.target
您可以通过禁用该服务来完全阻止其启动:
sudo systemctl disable nvzramconfig
这是首选方法。但是,如果出于某种原因你不想禁用该服务,那么不太好的选择就是注释文件中的每一行/etc/systemd/nvzramconfig.sh像这样:
#!/bin/bash
#
# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
#
# NRDEVICES=$(grep -c ^processor /proc/cpuinfo | sed 's/^0$/1/')
# if modinfo zram | grep -q ' zram_num_devices:' 2>/dev/null; then
# MODPROBE_ARGS="zram_num_devices=${NRDEVICES}"
# elif modinfo zram | grep -q ' num_devices:' 2>/dev/null; then
# MODPROBE_ARGS="num_devices=${NRDEVICES}"
# else
# exit 1
# fi
# modprobe zram "${MODPROBE_ARGS}"
# Calculate memory to use for zram (1/2 of ram)
# totalmem=`LC_ALL=C free | grep -e "^Mem:" | sed -e 's/^Mem: *//' -e 's/ *.*//'`
# mem=$((("${totalmem}" / 2 / "${NRDEVICES}") * 1024))
# initialize the devices
# for i in $(seq "${NRDEVICES}"); do
# DEVNUMBER=$((i - 1))
# echo "${mem}" > /sys/block/zram"${DEVNUMBER}"/disksize
# mkswap /dev/zram"${DEVNUMBER}"
# swapon -p 5 /dev/zram"${DEVNUMBER}"
# done
只要执行以错误级别 0 退出(因此没有错误或没有不同于 0 的退出代码),它将被视为正在运行。
这两种方式都不会加载内核模块(modprobe zram)。
干杯