差的IO性能 – PCIe NVMe Samsung 950 pro

我刚刚完成了硬件构建,期望从新的NVMe驱动器获得巨大收益。 我之前的表现低于预期(转移约3gb),所以我更换了主板/ cpu / memory / hdd。 虽然性能是它的两倍,但它仍然是我使用SATA6驱动器的3岁macbook pro的一半

  • CPU:i7-5820k 6核心
  • Mobo: MSI X99A MPOWER
  • 内存:32GB
  • 驱动器:Samsung 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- 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

这有一些类似的基准测试 。 当我使用fio和禁用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 

这是一个作业和7个作业的完整sync结果:

 $ 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-进行了数学计算。高科技,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给了我一个非常小的改进,但没有像我期待的那样4x。 我重新分区/重新安装了新的15.10服务器,以确保我没有任何遗留问题,并得到了相同的结果。

我的fio结果是否高于同步/无同步指示问题?

所以我有一个干净的石板,可以尝试任何东西。 我可以尝试将我的表现提升到标准杆? 欢迎任何参考。

    请加

     scsi_mod.use_blk_mq=1 

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

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

    谢谢你的问题,这对我来说非常有帮助。

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

    我决心在不放弃Ubuntu的情况下解决问题。 但无论我做了什么,当你完全按照你的描述使用hdparm进行测试时,我无法获得超过2000 MB /秒的速度。

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

    果然,我将磁盘格式化为以4096整除的值启动分区,最后我能够打破2000 MB / s的速度。

    现在它的平均值是2.3 GB / s,我预计它会高一点。 我责备这个事实,当我运行sudo fdisk -l ,NVMe驱动器仍显示物理扇区大小为512字节。 我打算继续调查,但我希望这会对你有所帮助!

    这个post是一年(2016年10月)。 最受欢迎的答案之一推荐使用两年前的英特尔NVMe驱动程序(2015年)。

    2017年2月,虽然三星发布了使用基于Linux的引导ISO安装程序的固件更新 。 在同一个链接上有可以为Windows 7/8/10安装的驱动程序。 我将很快安装在我的新款Samsung 960 Pro和全新戴尔的i7-6700笔记本电脑上。 随着BIOS刷新和更新其他基于Dell的驱动程序。

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

    有很多谷歌搜索返回,因为Linux下的三星960 Pro性能下降速度只有Windows的一半,所以我鼓励大家搜索尽可能多的选项。


    实现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使系统变慢而不是更快。 有一段时间它可能是有益的。

    以下是一些有趣的信息:在Windows上,在禁用缓存刷新之前,驱动器不会根据审核基准执行。 通常这不是直接完成的; 相反,安装了供应商的驱动程序(在本例中为Samsung NVMe驱动程序)。

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

    转换为Linux-land,这意味着在Windows上,为了获得您在所有评论中看到的大基准数,您需要禁用fsync ,以及可靠性的所有方法(没有fsync,或者特别是没有写屏障,意味着在错误的时间断电可能会破坏整个FS,具体取决于实现 – 重新排序的写入会产生“不可能”的情况)。

    三星的“数据中心”SSD配有电容器,可确保正确刷新缓存数据。 他们的消费者驱动器不是这种情况。

    我刚刚从最初的原则开始研究,昨天为我的新版本添加了1TB NVMe。 我并不是特别高兴,我已经开始接触三星的支持,看看他们说什么 – 但我怀疑我会听到回复。

    我还不能评论,所以我必须回答。 🙁

    我没有类似的驱动器,但我猜想hdparm的值很好。 如果是这样,我会假设您只是以次优的方式使用sysbench。 尝试使用参数–num-threads进行试验,以在驱动器上产生更多负载。 至少在我的计算机上,1个线程(默认)和16个线程之间的差异在标准SATA SSD上大约是1:4。 我的理解是NVMe驱动器开始闪耀更多并行任务正在给它们带来负担。

    如果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/

    我的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