如何用交换文件替换 zram 交换?

如何用交换文件替换 zram 交换?

我正在运行带有 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 交换仍然处于启用状态: 在此处输入图片描述

或者我可以创建一个磁盘交换文件并期望它替换 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)。

干杯

相关内容