我最近买了一个 USB 闪存驱动器,打算专门用于交换分区。我知道闪存介质上的交换文件可能会很快耗尽写入周期数,但这就是我购买此 USB 的原因,这样我就不必处理笔记本电脑存储设备 (eMMC) 上的此类性能下降问题。我有两个关于如何使用它作为交换空间的想法。
方案 1:一个文件系统分区和多个较小的交换分区
该 USB 驱动器宣传其容量为 32 GB,其中 GB 定义为1000000000
字节,但扣除文件系统格式后的实际可用容量是307520000000
字节(顺便说一句,这里仍然存在一些虚假广告)。
我希望用 GUID 分区表格式化此驱动器并在其上创建多个分区,其中一个分区大于其他分区,并使用基本文件系统(例如 VFAT/FAT32、ext2、ext4)进行格式化。分区总数至少有数百个,并且,除去较大的文件系统分区,它们的大小将统一,并将用于分页/交换空间。文件系统分区将用于存储用于管理此特定方案的数据。
这里使用许多小分区而不是文件系统上的单个分区或交换文件的原因是为了防止坏块分散在 USB 驱动器上;这将使降级更容易管理,因为任何包含坏块的分区将不再使用。有关哪些分区不可用的记录将保存在单个较大分区上的文件系统中。
设备映射器的线性目标将用于从 USB 上任意数量的小分区中创建一个大型设备。将根据文件系统分区中记录的数据来确定使用哪些分区来创建映射设备。如果我选择加密交换设备,那么我将在文件系统分区中(或者可能在主机上)存储加密密钥。
回到如何对 USB 驱动器进行分区的问题,30752000000
原始存储空间的字节数转换为60062500
每个512
字节大小的扇区。使用 GPT 方案意味着将有两个区域,一个位于驱动器存储空间的两端,这两个区域将不能用作文件系统的一部分或交换空间。考虑到将分区与N
扇区边界对齐的做法,这两个区域将大于我将使用的分区表的大小(GPT 包含的分区条目数是可调整的,最大值为4294967295
)。
fdisk
和等工具gdisk
默认使用2048
-sector 对齐边界,这似乎表明 2048 是推荐的或在某种程度上是最佳的。如果我将分区边界与2048
扇区对齐,那么在驱动器的开头会留下一个2048
包含主 GPT 的 -sector 段,在驱动器的末尾会留下一个包含备份 GPT 的部分 804-sector 段,以及29326
2048
它们之间的可用于文件系统/交换分区的 -sector 段。
保持分区与2048
扇区边界对齐,如果文件系统分区X
的大小为 段数,则剩余用作多个交换分区的扇区总数
Y
等于29326-X
。现在,由于我希望交换分区大小相等,因此 的值Y
必须是一个合数,并且由于分区数越多可能导致分区表的2046
大小超过 扇区数,因此交换分区数必须是 的较大因子之一Y
。
概括上述内容,我得到以下计算结果:
30752000000
是 USB 驱动器的大小(以字节为单位)。60062500
是 USB 驱动器的大小(以512
字节扇区为单位)。p
是我将使用的分区数。P
是分区表的大小(以条目数表示)。此值是 GPT 标头的一部分。q
是主 GPT 的大小(以512
字节扇区为单位)。该值等于ceiling(P/4)+2
。r
是备份 GPT 的大小(以512
字节扇区为单位)。该值等于ceiling(P/4)+1
。N
是分区对齐的扇区数。Q
512
是驱动器开头不能成为任何分区一部分的字节扇区数。该值等于N
。R
512
是驱动器末尾不能成为任何分区一部分的字节扇区数。该值等于60062500 mod N
。X
N
是可用于分区的扇区段的数量。Y
是文件系统分区的扇区段大小N
。Z
N
是可用作交换分区一部分的 -sector 段数。该值等于X-Y
。S
是我将使用的交换分区的数量。Z
必须能被 整除S
。p
不能超过P
。r
不能超过N
。
我对这个方案的问题是:+ 分区对齐重要吗?+ 如果重要,那么我应该将分区与扇区边界对齐2048
还是应该使用其他数字?+ 是否有一个数字可以N
均匀划分60062500
。如果有,是否会导致任何数据重叠?如果该数字不是 2 的幂,那么它是否不是最佳选择?
方案 2:一个文件系统分区和一个更大的 LVM2 PV 分区
这个想法与第一个想法很相似,但不同之处在于,许多较小的交换分区将被一个大分区替换,该大分区被格式化为使用 LVM2 的物理卷。大分区将被分割成许多逻辑卷,可以根据需要调整大小和重新组合。文件系统将起到与第一个方案类似的作用。
我发现这个方案可能存在一些问题:+ 我不知道 LVM2 是否像文件系统一样工作,以及它是否像文件系统中文件的数据一样移动组成逻辑卷的数据。如果是这样,那么这对于隔离坏块来说就会有问题,而坏块是这个方案的必要条件,就像第一个方案一样。+ 我不知道调整大小和合并逻辑卷是否会遇到与上一个要点中假设的类似问题。+ 这个方案可能比第一个想法更复杂,但我无法确定是不是这样。
综上所述…
我应该使用哪种方案?每个方案下提出的问题/难题的答案是什么?我有没有办法利用交换空间的加密,当我不需要它时,它(加密)是否容易摆脱?压缩交换内存是否会zram
减少降级块的数量?如果是这样,我该如何使用它?如何确定我的 USB 驱动器的底层块大小?hdparm
似乎没有帮助。
答案1
我不想处理笔记本电脑存储设备(eMMC)的退化问题
最好的办法是安装足够的 RAM 并完全禁用交换。
分区总数至少会有数百个 [...] 这里使用许多小分区而不是文件系统上的单个分区或交换文件的原因是为了防止坏块分散在 USB 驱动器上;这将使降级更容易管理,因为任何包含坏块的分区将不再使用。
这毫无意义:块在哪里并不重要,所有块都可以以同样快(或慢)的速度访问。USB 棒中的微控制器无论如何都会重新分配坏块,或者使用磨损均衡并以任何它喜欢的方式移动块。
因此,不要创建太多小分区。创建一个足够大的分区来满足您预计的内存使用量(在最坏的情况下,您会使用多少个程序以及使用哪些程序?)。
使用 lvm 只是增加了一个间接级别,这会使一切变得更慢。
重复:最好的办法是安装足够的 RAM,并完全禁用交换。
编辑:解释磨损均衡
USB 棒的微控制器在 USB 棒的实际(物理)块和可通过 USB 访问的(逻辑)块之间实现了一个层。
举个例子,假设该条存储棒声称具有某种标准大小,比如说 150 个逻辑块。制造后总会有一些块被证明是坏的,并在生产过程中被标记出来。假设该条存储棒生产时有 200 个块,其中 20 个是坏的。这仍然没问题,现在你有 180 个身体的块,这超过了150逻辑阻挡了棍子所声称拥有的。
在内部,该存储棒会跟踪逻辑块和物理块之间的映射。现在假设您从 (逻辑) 块 0 到 49 创建一个分区,并将该分区中的每个块写入两次。第一次,该存储棒将写入物理块 0 到 49,第二次,它将写入物理块 50 到 99。依此类推。
因此,无论您想出什么样的分区方案,您都无法“保存”好块以供“以后”使用。这也是一个坏主意,因为当晶体管出现泄漏时,块就会出现缺陷,而所有东西都挤得非常紧密。因此,坏块也会影响相邻的块并使其变坏,一旦存储棒有大量坏块,我无论如何都不会信任它来保存重要数据。
按优先顺序排列的解决方案:
1) 完全关闭交换,仅使用可用 RAM。无论如何,从 USB 交换加载时间与从内部闪存加载时间相似。因此,请关闭那些您不使用的应用程序,如果再次需要它们,请重新启动它们。
2) 如果您确实必须使用比 RAM 所能容纳的更多的应用程序,或者您想要休眠,请创建一个合理大小的单独分区(这将使操作系统表保持合理的大小),并将其余部分留空。
将 swappiness 设置为“尽可能低”。这将使用您存储棒上的所有物理块,当几年后它坏了,就扔掉它并买一个新的。不要试图在上面存储重要数据,请使用不同的存储棒。
答案2
抱歉回答晚了,但在无法添加更多 RAM 的情况下,我所做的就是使用零位随机存取存储器。我执行了以下步骤:
#to activate zram module:
modprobe zram
#Assign 512Mb to the zram virtual space:
zramctl --size 512M /dev/zram0
#Now, make the zram device as a swap device:
mkswap /dev/zram0
#Enable swap memory
swapon /dev/zram0
建议将 swappiness 设置为尽可能低;仅在内存已满(或非常接近满)时使用它。执行此操作的命令如下:
sysctl vm.swappiness=1
现在测试更改是否成功应用:
cat /proc/sys/vm/swappiness
应该返回1 注意:它将在重启后重置所有更改。使其永久生效参见此帖来自 proxmox。这是我获取信息并应用于我的服务器的地方。