SanDisk SSD Plus:Linux 上的性能是 Windows 上的一半?

JLT*_*LTD 5 performance ssd

我的笔记本电脑中有两个 SSD:

  • Crucial 英睿达 MX300 725GB --> /dev/sda
  • 闪迪 SSD Plus 240GB --> /dev/sdb

它们在 Linux 和 Windows 上的性能如下所示:

Crucial MX300 --> 在两个操作系统上相同

sudo hdparm -tT /dev/sda # Crucial
Timing cached reads:   13700 MB in  2.00 seconds = 6854.30 MB/sec
Timing buffered disk reads: 1440 MB in  3.00 seconds = 479.58 MB/sec
Run Code Online (Sandbox Code Playgroud)

Crucial 英睿达 MX300 725GB

SanDisk Plus --> 在 Windows 上速度更快!

sudo hdparm -tT /dev/sdb # SanDisk
Timing cached reads:   7668 MB in  2.00 seconds = 3834.92 MB/sec
Timing buffered disk reads: 798 MB in  3.00 seconds = 265.78 MB/sec # TOO LOW !!
Run Code Online (Sandbox Code Playgroud)

闪迪

闪迪在 Linux 上的顺序读取性能大约是它在 Windows 上的一半!

我的问题当然是:为什么可以修复?这是因为 SanDisk SSD Plus 被当作SCSI驱动器处理吗?

从系统日志:

~$ grep SDSSD /var/log/syslog
systemd[1]: Found device SanDisk_SDSSDA240G
kernel: [    2.152138] ata2.00: ATA-9: SanDisk SDSSDA240G, Z32070RL, max UDMA/133
kernel: [    2.174689] scsi 1:0:0:0: Direct-Access     ATA      SanDisk SDSSDA24 70RL PQ: 0 ANSI: 5
smartd[1035]: Device: /dev/sdb [SAT], SanDisk SDSSDA240G, S/N:162783441004, WWN:5-001b44-4a404e4f0, FW:Z32070RL, 240 GB
smartd[1035]: Device: /dev/sdb [SAT], state read from /var/lib/smartmontools/smartd.SanDisk_SDSSDA240G-162783441004.ata.state
smartd[1035]: Device: /dev/sdb [SAT], state written to /var/lib/smartmontools/smartd.SanDisk_SDSSDA240G-162783441004.ata.state
Run Code Online (Sandbox Code Playgroud)

与 Crucial MX300 相比,它在 Linux 上的性能几乎与在 Windows 上相同:

~$ grep MX300 /var/log/syslog
systemd[1]: Found device Crucial_CT750MX300SSD1
kernel: [    1.775520] ata1.00: ATA-10: Crucial_CT750MX300SSD1,  M0CR050, max UDMA/133
smartd[1035]: Device: /dev/sda [SAT], Crucial_CT750MX300SSD1, S/N:16251486AC40, WWN:5-00a075-11486ac40, FW:M0CR050, 750 GB
smartd[1035]: Device: /dev/sda [SAT], state read from /var/lib/smartmontools/smartd.Crucial_CT750MX300SSD1-16251486AC40.ata.state
smartd[1035]: Device: /dev/sda [SAT], state written to /var/lib/smartmontools/smartd.Crucial_CT750MX300SSD1-16251486AC40.ata.state
Run Code Online (Sandbox Code Playgroud)


非常欢迎任何帮助!

编辑:

hdparm 在 Linux 上显示的差异是非常真实的。我创建了两个相同的目录,在两个驱动器中的每一个中创建一个,每个目录包含大约 25Gb 的文件(36395 个文件),并在两个目录上运行完全相同的 hashdeep 校验和创建脚本(该脚本只是为每个文件创建一个 md5-checksum在测试目录中并将所有校验和存储在一个文件中)。这些是结果:

test-sandisk# time create-file-integrity-md5sums.sh .
real    1m49.000s
user    1m24.868s
sys 0m15.808s

test-mx300# time create-file-integrity-md5sums.sh .
real    0m54.180s
user    1m4.628s
sys 0m11.640s
Run Code Online (Sandbox Code Playgroud)

使用单个 7Gb 文件进行相同测试:

test-sandisk# time create-file-integrity-md5sums.sh .
real    0m26.986s
user    0m19.168s
sys 0m3.232s


test-mx300# time create-file-integrity-md5sums.sh .
real    0m17.285s
user    0m16.248s
sys 0m1.368s
Run Code Online (Sandbox Code Playgroud)

编辑2:

分区是“最佳”对齐的,/sys/block/$disk/queue 中唯一的区别是discard_zeroes_data(在Crucial 上为1,在SanDisk 上为0)。使用的文件系统和挂载选项:键入 ext4(rw、nosuid、nodev、relatime、data=ordered、uhelper=udisks2)

dmesg | grep -i sata | grep 'link up'
[    1.936764] ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
[    2.304548] ata2: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
Run Code Online (Sandbox Code Playgroud)

Sta*_*man 1

这可能不是一个足够好的答案,但我是新人,无法“发表评论”,并且想与您分享,以防有帮助:

我曾经使用 eMMC 闪存,它的硬件基础与 SSD 类似。Discard_zeroes_data 听起来可能很重要。有一些非常慢的功能,称为擦除,尤其是修剪(如擦除,但基于 4kB 读取块,而不是性能所需的更大的擦除组块。后来引入了“丢弃”功能,该功能不会擦除数据全零(实际上是全一,但为了方便起见颠倒了),但只是将数据状态更改为“不关心”。

因此,如果您丢弃 4kB 的数据,速度会更快,因为没有进行擦除,而是让固件知道您不再需要该数据,并且它会在表中跟踪该物理区域。这允许垃圾收集类型的机制稍后在可以擦除足够多的邻居时回收该数据位置(可能将其重新映射到不同的地址),根据需要将任何需要的数据复制到另一个区域,然后执行昂贵的“擦除” ”在后台运行。

说实话,我们一开始就禁用了丢弃,因为它效果不佳,并且当太多数据处于丢弃状态时会导致性能问题,并且物理擦除从未发生。

所以我无法说出“discard_zeros_data”的确切含义,但如果我是你,我肯定会尝试将其更改为相反的状态,看看会发生什么。如果它读起来像“主语动词宾语”,那么它可能是一个安全功能,需要花时间强行删除即使是很小的数据(昂贵),这样就没有机会在您认为您之后有人可以回收您的旧文件我已经把它们删除了。我认为将其设置为“零”实际上会提高性能,如果您是这么理解的,但您看到的恰恰相反。

还可以尝试执行您能够执行的最大强制“擦除”,无论是使用特殊的 SSD 工具,还是完整格式,还是其他什么,然后看看擦除后性能是否会更好。这至少会给您一些有关该问题的信息。

文件系统类型肯定也很重要,但我认为这是您的两个实验中的一个常数。


sud*_*dus 1

与 USB 闪存盘的比较

简单的USB随身碟在使用一段时间后会逐渐变慢。此类驱动器没有丢弃功能(据我所知;我不是在谈论先进且非常昂贵的随身碟)。擦除整个驱动器,用零(或内部的)覆盖将再次恢复速度。根据我自己的经验,我知道这适用于 Sandisk Extreme 随身碟,新的时候速度很快(与其他简单的 USB 随身碟相比)。

因此,我可以预期,丢弃方法(或缺乏该方法)也可能导致 Sandisk SSD 的性能下降。我认为@Starman 的回答为解决您的问题添加了有价值的信息。

你可以

  • 尝试让系统空闲运行一整夜,并检查它是否已利用空闲时间来赶上丢弃应丢弃的内容。如果运气不好的话,你可以

  • 擦除驱动器的可用空间并检查这是否会提高性能,

  • 尝试在linux中找到一些挂载选项,或者SSD的一些设置,这将提高性能。

工具

  • zerofree是文件系统的有效工具ext。看到这个链接,

    manpages.ubuntu.com/manpages/zesty/man8/zerofree.8.html

  • 否则(如果您检查并仔细检查,一切都正确),您可以用来dd创建一个blank包含零的大文件,然后擦除它(速度慢,但适用于所有文件系统)。

    从另一个驱动器启动,例如实时 USB 驱动器

    cd <mountpoint-of-the-target-partition>  # for example: cd /mnt
    sudo dd if=/dev/zero of=blank bs=4096
    
    Run Code Online (Sandbox Code Playgroud)

    让它运行直到它停止,因为驱动器已满,然后删除文件blank。这假设已经没有具有该名称的有用文件blank

    sudo rm blank
    
    Run Code Online (Sandbox Code Playgroud)

    警告: dd这是一个强大但危险的工具,因此请仔细检查,确保不会破坏有价值的数据。在这种情况下,为了安全起见,请将连接的驱动器上有价值的所有内容备份到另一个位置(例如备份到随后断开连接的外部驱动器)。

擦除整个设备

我的 USB 随身碟的方法是擦除整个设备(不仅仅是部分填充的分区中文件之间的可用空间)。我认为这是针对随身碟最有效的方法,但我认为应该有一些丢弃设置,可以在 SSD 中高效工作,而无需擦除整个设备。不管怎样,如果你想测试的话,你可以尝试一下,然后创建一个新的分区表和分区ext4。请参阅此链接

help.ubuntu.com/community/mkusb/wipe#Wipe_the_whole_device