Linux + SSD 上交换分区的背景丢弃

san*_*aez 11 linux debian ssd swap trim

问题

我想在 Linux 上的 SSD 磁盘内的交换分区上启用后台TRIM 操作。根据几篇文章,例如这篇文章,内核会检测此配置并自动执行丢弃操作,但在我的测试中,尽管使用“丢弃”挂载选项来强制执行此行为,但它似乎不起作用。

设想

  • 运行 Linux 3.2.0 的 Debian Wheezy
  • SSD 磁盘:1 x 120GB OCZ Vertex 3 MI
  • 2GB 交换“普通”分区,无其他层(LVM、RAID 等)

背景

这些是我用来检查后台 TRIM 是否在交换分区上工作的步骤:

  1. TRIM 支持:检查 SSD 磁盘是否支持 TRIM 命令并且内核将设备标记为非旋转:

    # hdparm -I /dev/sda | grep TRIM
     * Data Set Management TRIM supported (limit 1 block)
     * Deterministic read data after TRIM
    
    # cat /sys/block/sda/queue/rotational
    0
    
    Run Code Online (Sandbox Code Playgroud)
  2. 交换填充:挂载分区,清理所有 VM 缓存并配置 Linux 以积极交换,将 vm.swappiness 设置为 100。然后,运行一个脚本来分配所有可用内存并强制内核开始交换:

    # swapon [--discard] /dev/sda2
    # echo 3 > /proc/sys/vm/drop_caches
    # echo 100 > /proc/sys/vm/swappiness
    # ./fill-up-memory.up
    
    Run Code Online (Sandbox Code Playgroud)

    该脚本在具有 32GB 物理内存 + 2GB 交换分区的服务器上运行,并在内存中创建一个 ~33.8GB 的​​对象,这足以填满所有内存并开始交换。这是实现此行为的脚本示例:

    #!/usr/bin/python
    
    mem = 33.8
    testing = 'A' * int(1024 * 1024 * 1024 * mem)
    raw_input()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 检查交换内容:“swapon -s”显示使用了 100% 的交换内存。使用“hdparm --read-sector”检查交换分区扇区的原始内容,所有字节都设置为“4141”,即“A”字符的相应十六进制表示法,一切都按预期工作。这是一个逐个扇区读取交换分区内容的示例脚本:

    #!/bin/bash
    
    for sector in `seq 194560 4100095` ; do
        hdparm --read-sector $sector /dev/sda
    done
    
    Run Code Online (Sandbox Code Playgroud)

注意:您可以使用 parted、cfdisk 等获取交换分区的开始/结束扇区。

当我停止脚本时,它会释放所有内存,包括交换分配,“swapon -s”在系统中不返回交换使用。此时,Linux 开始在后台丢弃交换分区的内容,但它不起作用,扇区的内容仍然是“4141”,甚至几个小时后。

我进行了几次测试,似乎 Linux 仅在使用swapon()系统调用启用分区时才执行完全丢弃,但从未在后台执行,尽管 /etc/fstab 上启用了“丢弃”挂载选项。

进一步研究: blkdev_issue_discard() 是负责向底层 SSD 设备发送 TRIM 命令的内核函数,该函数有两个独特的引用mm/swapfile.c

  • discard_swap() 它在 swapon() 过程中被调用,如果启用了“discard”挂载选项,它会丢弃所有内容,这按预期工作。
  • discard_swap_cluster() 它应该丢弃集群交换的内容,但似乎它从不执行 TRIM 命令。

问题:Linux 在交换 + SSD 设备上的预期行为是什么?它应该丢弃所有空闲扇区/页面还是仅在启动过程中启用分区时才发出初始完全丢弃?谢谢。

Sig*_*l15 -1

\n

当我停止脚本时,它会释放所有内存,包括交换\n分配, \xe2\x80\x9cswapon -s\xe2\x80\x9d 在系统中不返回交换使用情况。此时,\xe2\x80\x99 预计 Linux 会开始在后台丢弃\n 交换分区的内容,但\xe2\x80\x99 不起作用,\n 扇区的内容仍然是 \n xe2\x80\x9c4141\xe2\x80\x9d,甚至几个小时后。

\n
\n\n

当返回“未使用交换”时,交换的内容将被有效地“丢弃” swapon -s。\n系统不会覆盖块的内容(填充为“4141”),因为它是 SSD,过多的写入会缩短 SSD 的使用寿命。\n(至少,这是我从文档中得出的结论)

\n

  • 如果使用“discard”挂载选项,则应将 TRIM 命令发送到底层固态驱动器,以避免 SSD 磁盘上出现[写入放大](http://en.wikipedia.org/wiki/Write_amplification)问题。至少,这是其他文件系统(例如 ext4)的方式。 (5认同)