IO性能不佳-PCIe NVMe Samsung 950 Pro


20

我刚刚完成了硬件构建,期望从新的NVMe驱动器中受益匪浅。我以前的性能低于预期(传输了约3gb),因此我更换了主板/ cpu /内存/ hdd。虽然性能是双什么,它仍然是一半是我得到我3岁的MacBook Pro与SATA6驱动。

  • CPU:i7-5820k 6核
  • 主板:微星X99A MPOWER
  • 记忆体:32GB
  • 驱动器:三星950 pro NVMe PCIe

Ubuntu(也已通过确认16.04.1 LTS):

Release:    15.10
Codename:   wily

4.2.0-16-generic

$ sudo blkid
[sudo] password for kross: 
/dev/nvme0n1p4: UUID="2997749f-1895-4581-abd3-6ccac79d4575" TYPE="swap"
/dev/nvme0n1p1: LABEL="SYSTEM" UUID="C221-7CA5" TYPE="vfat"
/dev/nvme0n1p3: UUID="c7dc0813-3d18-421c-9c91-25ce21892b9d" TYPE="ext4"

这是我的测试结果:

sysbench --test=fileio --file-total-size=128G prepare
sysbench --test=fileio --file-total-size=128G --file-test-mode=rndrw --max-time=300 --max-requests=0 run
sysbench --test=fileio --file-total-size=128G cleanup


Operations performed:  228000 Read, 152000 Write, 486274 Other = 866274 Total
Read 3.479Gb  Written 2.3193Gb  Total transferred 5.7983Gb  (19.791Mb/sec)
 1266.65 Requests/sec executed

Test execution summary:
    total time:                          300.0037s
    total number of events:              380000
    total time taken by event execution: 23.6549
    per-request statistics:
         min:                                  0.01ms
         avg:                                  0.06ms
         max:                                  4.29ms
         approx.  95 percentile:               0.13ms

Threads fairness:
    events (avg/stddev):           380000.0000/0.00
    execution time (avg/stddev):   23.6549/0.00

调度程序设置为none

# cat /sys/block/nvme0n1/queue/scheduler
none

这是lspci信息:

# lspci -vv -s 02:00.0
02:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a802 (rev 01) (prog-if 02 [NVM Express])
    Subsystem: Samsung Electronics Co Ltd Device a801
    Physical Slot: 2-1
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0, Cache Line Size: 32 bytes
    Interrupt: pin A routed to IRQ 45
    Region 0: Memory at fb610000 (64-bit, non-prefetchable) [size=16K]
    Region 2: I/O ports at e000 [size=256]
    Expansion ROM at fb600000 [disabled] [size=64K]
    Capabilities: [40] Power Management version 3
        Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
        Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
    Capabilities: [50] MSI: Enable- Count=1/8 Maskable- 64bit+
        Address: 0000000000000000  Data: 0000
    Capabilities: [70] Express (v2) Endpoint, MSI 00
        DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited
            ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
        DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
            RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-
            MaxPayload 128 bytes, MaxReadReq 512 bytes
        DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr+ TransPend-
        LnkCap: Port #0, Speed 8GT/s, Width x4, ASPM L1, Exit Latency L0s <4us, L1 <64us
            ClockPM+ Surprise- LLActRep- BwNot- ASPMOptComp+
        LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
            ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
        LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
        DevCap2: Completion Timeout: Not Supported, TimeoutDis+, LTR+, OBFF Not Supported
        DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
        LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis-
             Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
             Compliance De-emphasis: -6dB
        LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete+, EqualizationPhase1+
             EqualizationPhase2+, EqualizationPhase3+, LinkEqualizationRequest-
    Capabilities: [b0] MSI-X: Enable+ Count=9 Masked-
        Vector table: BAR=0 offset=00003000
        PBA: BAR=0 offset=00002000
    Capabilities: [100 v2] Advanced Error Reporting
        UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
        UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
        UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
        CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
        CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
        AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-
    Capabilities: [148 v1] Device Serial Number 00-00-00-00-00-00-00-00
    Capabilities: [158 v1] Power Budgeting <?>
    Capabilities: [168 v1] #19
    Capabilities: [188 v1] Latency Tolerance Reporting
        Max snoop latency: 0ns
        Max no snoop latency: 0ns
    Capabilities: [190 v1] L1 PM Substates
        L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1+ L1_PM_Substates+
              PortCommonModeRestoreTime=10us PortTPowerOnTime=10us
    Kernel driver in use: nvme

hdparm

$ sudo hdparm -tT --direct /dev/nvme0n1

/dev/nvme0n1:
 Timing O_DIRECT cached reads:   2328 MB in  2.00 seconds = 1163.98 MB/sec
 Timing O_DIRECT disk reads: 5250 MB in  3.00 seconds = 1749.28 MB/sec

hdparm -v

 sudo hdparm -v /dev/nvme0n1

/dev/nvme0n1:
SG_IO: questionable sense data, results may be incorrect
 multcount     =  0 (off)
 readonly      =  0 (off)
 readahead     = 256 (on)
 geometry      = 488386/64/32, sectors = 1000215216, start = 0

fstab

UUID=453cf71b-38ca-49a7-90ba-1aaa858f4806 /               ext4    noatime,nodiratime,errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
#UUID=C221-7CA5  /boot/efi       vfat    defaults        0       1
# swap was on /dev/sda4 during installation
UUID=8f716653-e696-44b1-8510-28a1c53f0e8d none            swap    sw              0       0
UUID=C221-7CA5  /boot/efi       vfat    defaults        0       1

菲奥

这有一些可比较的基准,而且还遥遥无期。当我用fio和disable进行测试时sync,情况就不同了:

sync=1
1 job  - write: io=145712KB, bw=2428.5KB/s, iops=607, runt= 60002msec
7 jobs - write: io=245888KB, bw=4097.9KB/s, iops=1024, runt= 60005msec

sync=0
1 job  - write: io=8157.9MB, bw=139225KB/s, iops=34806, runt= 60001msec
7 jobs - write: io=32668MB, bw=557496KB/s, iops=139373, runt= 60004msec

这是sync一份工作和7份工作的完整结果:

$ sudo fio --filename=/dev/nvme0n1 --direct=1 --sync=1 --rw=write --bs=4k --numjobs=1 --iodepth=1 --runtime=60 --time_based --group_reporting --name=journal-test
journal-test: (g=0): rw=write, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.11
Starting 1 process
Jobs: 1 (f=1): [W(1)] [100.0% done] [0KB/2368KB/0KB /s] [0/592/0 iops] [eta 00m:00s]
journal-test: (groupid=0, jobs=1): err= 0: pid=18009: Wed Nov 18 18:14:03 2015
  write: io=145712KB, bw=2428.5KB/s, iops=607, runt= 60002msec
    clat (usec): min=1442, max=12836, avg=1643.09, stdev=546.22
     lat (usec): min=1442, max=12836, avg=1643.67, stdev=546.23
    clat percentiles (usec):
     |  1.00th=[ 1480],  5.00th=[ 1496], 10.00th=[ 1512], 20.00th=[ 1528],
     | 30.00th=[ 1576], 40.00th=[ 1592], 50.00th=[ 1608], 60.00th=[ 1608],
     | 70.00th=[ 1608], 80.00th=[ 1624], 90.00th=[ 1640], 95.00th=[ 1672],
     | 99.00th=[ 2192], 99.50th=[ 6944], 99.90th=[ 7328], 99.95th=[ 7328],
     | 99.99th=[ 7520]
    bw (KB  /s): min= 2272, max= 2528, per=100.00%, avg=2430.76, stdev=61.45
    lat (msec) : 2=98.44%, 4=0.58%, 10=0.98%, 20=0.01%
  cpu          : usr=0.39%, sys=3.11%, ctx=109285, majf=0, minf=8
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=36428/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=145712KB, aggrb=2428KB/s, minb=2428KB/s, maxb=2428KB/s, mint=60002msec, maxt=60002msec

Disk stats (read/write):
  nvme0n1: ios=69/72775, merge=0/0, ticks=0/57772, in_queue=57744, util=96.25%

$ sudo fio --filename=/dev/nvme0n1 --direct=1 --sync=1 --rw=write --bs=4k --numjobs=7 --iodepth=1 --runtime=60 --time_based --group_reporting --name=journal-test
journal-test: (g=0): rw=write, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
...
fio-2.1.11
Starting 7 processes
Jobs: 6 (f=6): [W(2),_(1),W(4)] [50.4% done] [0KB/4164KB/0KB /s] [0/1041/0 iops] [eta 01m:00s]
journal-test: (groupid=0, jobs=7): err= 0: pid=18025: Wed Nov 18 18:15:10 2015
  write: io=245888KB, bw=4097.9KB/s, iops=1024, runt= 60005msec
    clat (usec): min=0, max=107499, avg=6828.48, stdev=3056.21
     lat (usec): min=0, max=107499, avg=6829.10, stdev=3056.16
    clat percentiles (usec):
     |  1.00th=[    0],  5.00th=[ 2992], 10.00th=[ 4512], 20.00th=[ 4704],
     | 30.00th=[ 5088], 40.00th=[ 6176], 50.00th=[ 6304], 60.00th=[ 7520],
     | 70.00th=[ 7776], 80.00th=[ 9024], 90.00th=[10048], 95.00th=[12480],
     | 99.00th=[15936], 99.50th=[18048], 99.90th=[22400], 99.95th=[23936],
     | 99.99th=[27008]
    bw (KB  /s): min=  495, max=  675, per=14.29%, avg=585.60, stdev=28.07
    lat (usec) : 2=4.41%
    lat (msec) : 2=0.57%, 4=4.54%, 10=80.32%, 20=9.92%, 50=0.24%
    lat (msec) : 250=0.01%
  cpu          : usr=0.14%, sys=0.72%, ctx=173735, majf=0, minf=63
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=61472/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=245888KB, aggrb=4097KB/s, minb=4097KB/s, maxb=4097KB/s, mint=60005msec, maxt=60005msec

Disk stats (read/write):
  nvme0n1: ios=21/122801, merge=0/0, ticks=0/414660, in_queue=414736, util=99.90%

对准

我已经检查了的对齐方式parted,以及基于http://www.intel.com/content/dam/www/public/us/en/documents/technology-briefs/ssd-partition-alignment-tech的数学计算方式-brief.pdf

kross@camacho:~$ sudo parted
GNU Parted 3.2
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s                                                           
(parted) print all                                                        
Model: Unknown (unknown)
Disk /dev/nvme0n1: 1000215216s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start       End          Size        File system     Name                                 Flags
 1      2048s       206847s      204800s     fat32           EFI system partition                 boot, esp
 2      206848s     486957055s   486750208s  ntfs                                                 msftdata
 3      486957056s  487878655s   921600s     ntfs                                                 hidden, diag
 4      590608384s  966787071s   376178688s  ext4
 5      966787072s  1000214527s  33427456s   linux-swap(v1)

kross@camacho:~$ sudo parted /dev/nvme0n1
GNU Parted 3.2
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) align-check opt 1                                                
1 aligned
(parted) align-check opt 2
2 aligned
(parted) align-check opt 3
3 aligned
(parted) align-check opt 4
4 aligned
(parted) align-check opt 5
5 aligned

TLDR;

尽管我的研究还没有发现任何东西,但我感觉我从根本上设置了一些错误。我期望吞吐量是3岁的Macbook pro(带SATA6)的吞吐量的4倍,而NVMe可以使吞吐量达到其1/2。我补充说noatime,nodiratime,这给了我很小的改进,但是没有我期望的4倍。我已经重新分区/重新安装了新的15.10服务器,只是为了确保我没有任何困扰,并且得到了相同的结果。

我的fio高于同步/不同步结果是否表明存在问题?

所以我的帐单干净,可以尝试任何事情。我怎样才能使自己的表现达到标准?欢迎任何参考。


什么是输出smartctl --scan,然后smartctl --all /dev/xxx在那里xxx是什么在第一个命令想出了???
Fabby 2015年

@fabby apt-get install smartmontools失败grub-probe: error: cannot find a GRUB drive for /dev/nvme0n1p3. Check your device.map.。根据我的努力,它似乎update-grub由于grub-probe错误而无法正常运行。 smartctl -i /dev/nvme0n1返回/dev/nvme0n1: Unable to detect device type. Please specify device type with the -d option. NVMe不会出现在smartctl -h设备类型中。
kross 2015年

uname --kernel-release&&lsb_release --code --short??? 的输出是什么?
Fabby 2015年

4.2.0-16-generic wily
克罗斯

我可能完全错了,我目前找不到源,但是考虑Skylake到这一点,您需要一个处理器来全速运行这些SSD ...
wawa 2015年

Answers:


5

谢谢您的提问,对我有很大帮助。

我有非常相似的经验,不同的硬件设置(我使用的是Intel NVMe SSD)。但是我也在运行Ubuntu 16.04。有了您的证据和本文中发现的类似结果,我确信问题出在Ubuntu如何设置NVMe驱动器。

我决心在不完全放弃Ubuntu的情况下解决问题。但是无论我做什么,使用hdparm进行测试时都无法完全按照您的描述获得高于2000 MB / sec的速度。

因此,我进行了一些挖掘,并找到了Intel提供的指南。我尝试了他们在本指南中建议的所有内容,发现其中一部分是不同的。在底部附近,讨论了正确对齐驱动器分区。这是与我的安装不匹配的一部分。我的起始块不能被4096字节整除。它使用的是512字节的扇区大小,而不是4k的扇区大小。

可以肯定的是,我格式化了磁盘以将分区启动为一个可被4096整除的值,并且最终我能够以2000 MB / s的速度中断。

现在,当我期望它更高时,平均速度为2.3 GB / s。我将此归咎于以下事实:当我运行sudo fdisk -lNVMe驱动器时,仍然显示其物理扇区大小为512字节。我计划继续调查,但希望对您有所帮助!


谢谢,我将再次检查对齐方式。我知道我曾经对此进行过调查,但是绝对值得一看这些信息。
kross

我用对齐方式更新了问题。 parted说它是对齐的,基于512块大小,但是不能被4096整除。所以我只想确认:您的扇区大小保持在512,并且唯一要做的就是在可以被4096整除的位置启动分区,对吗?
kross


1
gh,现在如何处理我现有的磁盘...尝试并调整大小/移动或dd,hmmm,不确定。确实,这似乎是根本原因。
kross


5

警告:这个答案很旧。从Linux 4.19开始,blk_mq是默认的调度程序。运行缓慢的PCIe NVMe SSD的问题很可能是在其他地方引起的。

原始答案:

请加

scsi_mod.use_blk_mq=1

内核引导参数,否则我认为您不会看到NVMe增加的命令队列和每个队列命令的好处。

注意:我知道它是用于arch的,但是您可能还想看看Wiki了解有关调整I / O的更多信息。


2
感谢您添加此内容,我在Ubuntu 16.04.1 LTS上进行了尝试,并没有发现任何不同。我当时很有希望,但是不幸的是这并没有改变任何事情。
kross's

2
对我来说也一样,与hdparm基准测试在性能上没有明显区别。
wordforthewise

我也是。我更新了下面的答案,显示启动速度降低了1秒。
WinEunuuchs2Unix

3

该线程已经发布了一年(2016年10月)。最高评价的答案之一是建议使用已使用两年(2015年)的英特尔NVMe驱动程序。

尽管在2017年2月,三星发布了固件更新,该更新使用了基于Linux的启动ISO安装程序。在同一链接上,可以安装Windows 7/8/10的驱动程序。我将很快在我的新Samsung 960 Pro和全新的基于Dell的i7-6700笔记本电脑上进行安装。以及刷新BIOS和更新其他基于Dell的驱动程序。

我认为重要的是重新访问这些旧线程并为新用户提供当前(无论如何截至2017年10月11日)链接,以便他们打开所有选项。

由于Google在Linux下的Samsung 960 Pro的性能下降速度是Windows的一半,因此返回了许多Google搜索,因此,我鼓励大家搜索尽可能多的选项。


实现scsi_mod.use_blk_mq=1内核参数后:

$ systemd-analyze
Startup finished in 7.052s (firmware) + 6.644s (loader) + 2.427s (kernel) + 8.440s (userspace) = 24.565s

除去内核参数并重新引导:

$ systemd-analyze
Startup finished in 7.060s (firmware) + 6.045s (loader) + 2.712s (kernel) + 8.168s (userspace) = 23.986s

因此,现在看来scsi_mod.use_blk_mq=1使系统变慢而不是变快。虽然有时可能是有益的。


仅供参考:启用SCSI多队列确实确实减慢了某些设备的速度,但已解决了各种问题。从v4.19内核开始,Linux默认启用scsi-mq。注意:我不清楚此选项是否会影响NVMe驱动器(与SCSI / SATA驱动器相反)。
Anon

1

以下是一些有趣的信息:在Windows上,直到禁用缓存刷新后,驱动器才会根据查看基准进行性能测试。通常,这不是直接完成的。而是安装了供应商的驱动程序(在本例中为Samsung NVMe驱动程序)。

如果使用供应商的驱动程序进行基准测试,然后在Windows中禁用缓存刷新,则会得到相同的数字。如果供应商不忽略高速缓存刷新,则不可能出现这种情况。

译为Linux-land,这意味着在Windows上,要获得您在所有评论中看到的重要基准数字,您必须禁用fsync,而所有这些都表示可靠性(没有fsync,或者没有写障碍,意味着强大的性能)。在错误的时间丢失可能会破坏整个FS,具体取决于实现方式-重新排序的写入会造成“不可能”的情况)。

三星的“数据中心” SSD带有电容器,以确保正确刷新缓存的数据。他们的消费者驱动器并非如此。

我刚刚从第一条原则中解决了问题,昨天在我的新版本中添加了1TB NVMe。我并不特别高兴,我已经开始与三星支持小组联系,以了解他们的意见-但我怀疑会收到答复。


他们有说什么吗
卡萨巴·托斯

0

我还不能发表评论,所以我必须回答。:-(

我没有可比的驱动器,但我想hdparm的值很好。如果是这样,我假设您只是以次优的方式使用sysbench。尝试使用参数--num-threads进行实验,以在驱动器上产生更多负载。至少在我的计算机上,标准SATA SSD上1个线程(默认)和16个线程之间的差异约为1:4。我的理解是,随着越来越多的并行任务加重负载,NVMe驱动器开始崭露头角。


我以与mbpro相同的方式使用它,它是性能的1/2,这是没有意义的。
克罗斯,2015年

我刚刚添加了一个fio具有1个线程和7个线程的测试,并引用了以它为基础的一堆基准测试。
克罗斯,2015年

0

如果sync = 1(D_SYNC)标志,则大多数SSD会平放在脸上。不幸的是,这是Ceph期刊众所周知的问题。有关更多信息,请参见此页面,以及在启用同步的情况下运行良好的驱动器列表:

http://www.sebastien-han.fr/blog/2014/10/10/ceph-how-to-test-if-your-ssd-is-suitable-as-a-journal-device/


谢谢,但是我已经在fio标题下引用了上面的文章,您可以从基准测试中看到,我的SSD Intel 750 NVMe 400GB 261 MB/s (1 job) 884 MB/s (5 jobs)在同步方面表现不佳,甚至比上一代产品表现不佳Samsung XP941 256GB 2.5 MB/s (1 job) 5 MB/s (7 jobs)。因此,尽管它是众所周知的,但仍然比应有的要少。
kross

0

我的M.2插槽上限为10Mbps。我使用PCIe适配器来解决此限制:https : //www.amazon.com/Lycom-DT-120-M-2-PCIe-to-PCIe-3-0-x4-Adapter-Support-M-2 -PCIe-2280-2260-2242 / dp / B00MYCQP38 /

您的主板双向都是全32Mbps,也许这是事实,但是我想我提到适配器是因为它对我有用(插入板载M.2插槽的速度几乎翻了一番)。我认为这是25美元,如果您已经花了足够的时间摆弄,这可能值得一试。

我在亚马逊评论中写了自己的经历:https : //www.amazon.com/gp/customer-reviews/R21BXILGXW4D9C/ref=cm_cr_arp_d_rvw_ttl?ie=UTF8&ASIN=B01639694M

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.