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

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

  • Crucial MX300 725GB – > / dev / sda
  • SanDisk 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 

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 !! 

SanDisk公司

Linux上SanDisk的顺序读取性能大约是Windows上性能的一半!

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

来自syslog:

 ~$ 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 

与在Linux上具有几乎与Windows相同的Crucial MX300相比:

 ~$ 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 

非常欢迎任何帮助!

编辑:

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

 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 

使用单个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 

编辑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) 

这可能不是一个足够好的答案,但我是新的,不能“评论”,并希望与您分享,以防它有所帮助:

我曾经使用eMMC闪存,与SSD类似的硬件基础。 discard_zeroes_data听起来很重要。 有一个非常缓慢的function,称为擦除,特别是修剪(如擦除,但在4kB读取块的基础上,而不是性能所需的更大的擦除组块。后来引入了“丢弃”function,没有删除数据到全部为零(真的是全部的,但为了方便而倒置),但只是将数据状态更改为“不关心”。

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

TBH我们最初最终禁用丢弃,因为当丢弃状态中存在太多数据并且物理擦除从未发生时,它不能很好地工作并导致我们性能问题。

所以我不知道“discard_zeros_data”究竟意味着什么,但如果我是你,我肯定会尝试将其改为相反状态,看看会发生什么。 如果它看起来像“主题动词对象”,那么它可能是一个安全function,它需要花时间强行擦除甚至一小部分数据(昂贵的),以便在你认为你之后没有人可以收回你的旧文件删除了他们。 我认为将其设置为“零”实际上会提高性能,如果这是你如何阅读它,但你看到相反的情况。

也可以尝试使用特殊的SSD工具或完整格式或其他东西进行最大的强制“擦除”,并查看擦除后性能是否更好。 这至少会为您提供有关该问题的一些信息。

文件系统类型也应该是重要的,但我认为这是你的两个实验中的常量。

与USB pendrives的比较

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

所以我可以预期,丢弃方法(或缺少方法)也可能导致Sandisk SSD的性能下降。 我认为@ Starman的答案会为解决您的问题增加有价值的信息。

您可以

  • 尝试让系统在一夜之间保持空闲状态,并检查它是否已经使用空闲时间来赶上丢弃应该丢弃的内容。 如果没有运气,你可以

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

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

工具

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

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

  • 否则(如果你检查并双重检查,一切都是正确的)你可以使用dd创建一个包含零的巨大文件blank并在之后擦除它(缓慢但在所有文件系统中都有效)。

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

     cd  # for example: cd /mnt sudo dd if=/dev/zero of=blank bs=4096 

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

     sudo rm blank 

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

擦拭整个设备

我的USB pendrives方法是擦除整个设备(不仅是部分填充分区中文件之间的空闲空间)。 我认为这是pendrives最有效的方法,但我认为应该有一些丢弃设置,它可以在SSD中高效工作而无需擦除整个设备。 无论如何,如果你想测试,你可以尝试它,然后创建一个新的分区表和一个ext4分区。 看到这个链接

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

我想添加一条评论以回应@sudodus的优秀post,但我现在仍然只有4个代表可以评论,所以坚持在这里:

至于让事情闲置 – 我使用的eMMC技术(再次,应该与你的相似但不完全相同),这不会起作用,因为设备不得不假设系统设计师可能削减核心能力并且只留下IO力量活着。

实际上有一种睡眠模式来协调节能,但我确实记得eMMC供应商说他们不想在没有时间的情况下开始进行后台操作,他们只在接受命令之间运行这些清理类型操作你发送它,然后返回状态(结果)。

SSD可能是不同的,具有一个控制器,具体地说,在空闲时间,向NAND闪存后端发送命令,导致清理和重新组织其中的数据块。 但根据我的经验,我不一定能指望这种情况发生。