Linux + SSD上交换分区上的后台丢弃


11

问题

我想在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
    
  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
    

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

    #!/usr/bin/python
    
    mem = 33.8
    testing = 'A' * int(1024 * 1024 * 1024 * mem)
    raw_input()
    
  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
    

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

当我停止脚本时,它将释放所有内存,包括交换分配,“ swapon -s”在系统中不返回任何交换使用情况。在这一点上,预计Linux将在后台开始丢弃交换分区的内容,但是它不起作用,甚至在几个小时之后,扇区的内容仍为“ 4141”。

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

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

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

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


4
重点是什么?RAM很便宜,因为您的服务器中有32个大型内存足以证明这一点。关闭“交换”,使用SSD进行有用的处理,然后停止乱扔垃圾。
Tom O'Connor 2013年

3
无法在这些服务器上禁用交换,并且它们具有唯一的SSD磁盘,无法选择在传统HDD上托管交换分区。我知道将交换放在SSD磁盘上不是最好的选择,但是我想知道是否可以在交换分区上实现相同的“丢弃” ext4行为,以尽可能提高磁盘性能。
santisaez 2013年

2
这听起来确实像是过早优化的情况。
MikeyB

“评论只能编辑5分钟”-就像我在说的那样,正好适合我在SF上班时的工作。@MikeyB实际上,我一直在阅读。维基百科文章提到了一些我不知道的东西。“由于闪存操作的特性,不能像硬盘驱动器那样直接覆盖数据。” 因此,先前在交换中使用的块将是空的是有道理的。...但是当santisaez检查交换内容时,这些块看起来像“ 0000”吗?
Signal15

所有这些都发生在操作系统下的一层。就操作系统而言,块上的数据一直存在,直到被重写为止。驱动器负责处理读-写-写周期。
MikeyB

Answers:


1

看来,discard_swap_cluster只从所谓scan_swap_map而这又是从所谓的get_swap_pageget_swap_page_of_type。因此,如果我是对的,则仅在要分配新的交换页面时才丢弃,而在释放页面时则不会。


听起来像个虫子。
kasperd '16

2
这可能不是错误。这样,Linux可以一次丢弃许多页面,而不是一个一个地丢弃。
lav

1

可能是您的系统具有--discard=once默认设置。您是否尝试过使用特定的丢弃选项进行安装?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

并强迫这样:

# swapon --discard=pages /dev/sda2

您也可以尝试fstrim提供服务,或者配置服务(如果已经可用)。


-1

当我停止脚本时,它将释放所有内存,包括交换分配,“ swapon -s”在系统中不返回任何交换使用情况。在这一点上,预计Linux将在后台开始丢弃交换分区的内容,但是它不起作用,甚至在几个小时之后,扇区的内容仍为“ 4141”。

swapon -s返回“未使用交换”时,交换的内容将被有效地“丢弃” 。系统不会覆盖块的内容(填充“ 4141”),因为它是固态硬盘,过多的写入操作会缩短交换器的寿命。 SSD(至少,这是我从文档中删除的内容)


5
如果使用了discardmount选项,则应将TRIM命令发送到基础固态驱动器,以避免SSD磁盘上的写放大问题。至少,这是其他文件系统(例如ext4)的方式。
santisaez

需要明确的是,这的确会导致只读取与hdparm的命令零,但SSD的垃圾收集后才能有机会运行..
Halfgaar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.