c++でnvmeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

49
1 C++ NVMe (* ´ Д`) ハァハァ 戯れていたら一年経ってた。 Boost.勉強会 #21 札幌 #boostjp 宮崎 典行 Twitter: @openlibsys http://crystalmark.info/ 49 PAGES

Upload: hiyohiyo

Post on 16-Apr-2017

2.602 views

Category:

Software


10 download

TRANSCRIPT

Page 1: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

1

C++でNVMeと(*´Д`)ハァハァ戯れていたら一年経ってた。

Boost.勉強会 #21 札幌#boostjp

宮崎 典行Twitter: @openlibsyshttp://crystalmark.info/ 49 PAGES

Page 2: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

2

自己紹介NVMe についてCrystalDiskMarkCrystalDiskInfoまとめ

Page 3: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

3自己紹介

名前:宮崎 典行, hiyohiyo/ひよひよ

年齢:37歳

家族:妻, 愛娘, 愛息子

趣味:ソフトウェア開発 (約17年)

住所:北海道札幌市

代表作: CrystalDiskInfo, CrystalDiskMark 他(通称 Crystal シリーズ)

パソコンがもっと好きになるソフトウェアを一貫して開発しています

Microsoft MVP・Visual C++ (Jan. 2014 – Sep. 2015) ・Visual Studio and Development Technologies (Oct. 2015 -)

Page 4: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

4

一枚の画像で表現すると…

Page 5: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

5自作ソフトウェア紹介

CrystalDiskInfo CrystalDiskMark

CrystalMark 2004 CrystalCPUID

Page 6: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

6Windows Store デビュー!!

Desktop App Converter サイコー

Page 7: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

7AmorphousDiskMark

CrystalDiskMark の macOS 版!?

katsura シェアウェアhttp://katsurashareware.com/index-j.html

AmorphousDiskMark by @polydron

Page 8: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

8

Page 9: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

92016/12/26 札幌C++勉強会にて

http://www.slideshare.net/hiyohiyo/20151228-nvme-sapporocpp

1年間の成果を報告します!!

Page 10: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

10

NVM Express

Page 11: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

11NVMe とは

NVM Express (NVMe)

SSD 向け次世代インターフェース

最大の特徴

速い!!

Page 12: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

12

0 500 1000 1500 2000 2500 3000 3500 4000

NVMe @PCIe 3.0x4

SATA/600

SATA/300

SATA/150

UDMA/100

UDMA/66

UDMA/33

転送レート (MB/s)

Page 13: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

13AHCI vs NVMe

ベンチマーカー視点での最重要ポイント

AHCI NVMe

Queue 1 64KCommands/Queue 32 64K

Q32T1 Q32T4 Q32T8

TOSHIBA PX04PMC080 800GBランダム4KiBリード結果 (MB/s) テストサイズ: 1GiB

Page 14: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

14

CrystalDiskMark

Page 15: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

15CrystalDiskMark (2007年リリース)

出典:窓の杜http://www.forest.impress.co.jp/article/2007/04/03/crystaldiskmark.html

□プログラム名CrystalDiskMark(くりすたるでぃすくまーく)

□人気★ ★ ★ ★ ☆年間150万DL以上 (Shizuku Edition 含む)

□開発動機ストレージに特化すれば良いもの作れる?

□アピールポイント• 縮小スクリーンショットでも全てがわかる• とにかくシンプル• 多言語対応 (40言語以上)

□リスペクト• FDBENCH (EP82改/かず 氏)

□ひとこと• 国内外でHDD/SSDの新製品評価に活用

□お詫び• Ver. 1.0~2.1までベンチマーク部に致命的

な不具合がありご迷惑をおかけしました。⇒ 最優先で修正に取り組み2.2で完治

Page 16: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

16CrystalDiskMark 3

CrystalDiskMark 3

従来手法(1MiBブロックの同期リード/ライト)ではNVMe SSDのピーク速度が測定できない

時代遅れなプロダクト

Page 17: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

17CrystalDiskMark 4/5 の開発

某I社

やぁ。ひよひよ。開発中のNVMe SSDのベンチマーク結果が振るわないんだけどなんとかならないかな?

なんとかしたいのは山々だけど、NVMe SSD持っていないし、どうすれば良いのかわからないんだ。

某I社

OK! OK!サンプル送るから色々試してみてくれ。出来るだけ早く対応よろしく!

Page 18: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

18

DiskSpdhttps://github.com/Microsoft/diskspd

CrystalDiskMark 3 と 5 の構成

UI

Core

CrystalDiskMark 3 CrystalDiskMark 5

DiskMark.exeベンチマーク部内製

DiskMark32.exe

Microsoft製DiskSpd採用

ベンチマーク機能改善

Page 19: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

19CrystalDiskMark 3 と 5 の比較

CrystalDiskMark 3 CrystalDiskMark 5

マルチキュー&スレッド対応

ピーク速度測定に対応

TOSHIBA PX04PMC080 800GB

シーケンシャルリード

3.4GB/sシーケンシャルリード

1.2GB/s

Page 20: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

20言わずにはいられない真実・・・

べっ、ベンチマークはスポーツだし⁉エンタープライズならきっとある!!

でっ、でも・・・こんな多数の並列処理って本当にあるんでしょうか?

Page 21: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

21ベンチマーク結果

0

500

1000

1500

2000

2500

3000

3500

4000

Sequential Read Sequential Write Random 4KiB Read Random 4KiB Write

TOSHIBA PX04PMC080 800GB (MB/s)

Q1T1 Q4T1 Q16T1 Q32T1 Q32T4 Q32T8

1Queue/1Threadではピーク速度測定不可

Threadを増やす必要あり

System: Shuttle SH170R6CPU: Intel Core i7 6700T (2.8GHz)Memory: DDR4 2133MHz 16GBOS: Windows 10 Enterprise Ver.1607 (64bit)

Page 22: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

22

CrystalDiskInfo

Page 23: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

23CrystalDiskInfo (2008年リリース)

出典:窓の杜http://www.forest.impress.co.jp/article/2008/05/23/crystaldiskinfo.html

□プログラム名CrystalDiskInfo(くりすたるでぃすくいんふぉ)

□人気★ ★ ★ ★ ★年間300万DL以上 (Shizuku Edition 含む)

□開発のきっかけCrystalCPUID の開発が頓挫し打ちひしがれ

ていた頃に出会った「月のお姫さまがホームステイ」という設定のゲームに出てくる「司祭のお嬢さん」があまりにツボだったため。

□アピールポイント• 一部のUSB/RAID接続に対応• スクリーンショットで概要を把握• 多言語対応 (30言語以上)

□リスペクト•なし

□ひとこと•ディスク系ツールならメンテナンス不要と考えていたのですが、SSDベンダーが多数出現し個別対応が必要に……

Page 24: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

24NVMe 対応への道のり

CrystalDiskInfo 7

PATA/SATA RAID USB(IEEE1394)

NVMe

Page 25: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

25NVMe のコマンド体系

標準コマンド必須3種類

Admin コマンド必須10種類

Page 26: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

26Intel SSD 750 1.2TB

Page 27: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

27SAMSUNG SSD 950 PRO 512GB

NVMe 調査のために購入

Page 28: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

28SAMSUNG SM951 128GB

NVMe 調査のためだけに購入

Page 29: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

29TOSHIBA PX04PMC080 800GB

TOSHIBA様から借用

Page 30: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

30S.M.A.R.T. | ATA

Microsoft 製 ATA Driver

ReadFile() ※Win32 API

ATA PASS THROUGH 経由で直接 ATA コマンドを送る

ATA HDD/SSD

SMART READ DATA※ATAコマンド

READ **** ※ATA コマンド

データ読み出し S.M.A.R.T.

Page 31: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

31S.M.A.R.T. | NVMe (Win8.1)

Microsoft 製 NVMe Driver(Win7/8/8.1/2012)

ReadFile() ※Win32 API

NVMe SSD

Get Log Page※NVMeコマンド

Read ※NVMe 標準コマンド

データ読み出し S.M.A.R.T.

Admin コマンドを通さない!!

Page 32: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

32

どうしたら・・・

NVMe SSD の S.M.A.R.T. 情報がWindows 上から読めない!!!!!!!!!!

NVMe \(^o^)/オワタ

Page 33: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

33神降臨

日本語の (*´Д`)ハァハァ ツイートに韓国の神から反応が!!

グローバルな活動が呼んだ奇跡か!?

Page 34: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

34神降臨

http://naraeon.net/

https://github.com/ebangin127/nvmetools

Page 35: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

35

神プロジェクトは Delphi 製だったorzステップ実行のため体験版ゲット(>_<)

【余談】神は Delphi 使いだったorz

Page 36: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

36S.M.A.R.T. | SAMSUNG SSD 950 PRO

Microsoft 製 NVMe Driver(Win 7/8/8.1/10/2012)

ReadFile() ※Win32 API

SAMSUNG SSD 950 PRO

データ読み出し

S.M.A.R.T.

Security Command (SCSI)

Get Log Page※NVMeコマンド

秘密の裏口からアクセス

Read ※NVMe 標準コマンド

SCSI PASS THROUGH 経由で特殊な SCSI コマンドを送る

Page 37: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

37

::ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS24));

sptwb.Spt.Length = sizeof(SCSI_PASS_THROUGH);sptwb.Spt.PathId = 0;sptwb.Spt.TargetId = 0;sptwb.Spt.Lun = 0;sptwb.Spt.SenseInfoLength = 24;sptwb.Spt.DataTransferLength = IDENTIFY_BUFFER_SIZE;sptwb.Spt.TimeOutValue = 2;sptwb.Spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf);sptwb.Spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, SenseBuf);

sptwb.Spt.CdbLength = 16;sptwb.Spt.Cdb[0] = 0xB5; // SECURITY PROTOCOL INsptwb.Spt.Cdb[1] = 0xFE; // SAMSUNG PROTOCOLsptwb.Spt.Cdb[3] = 6; // Get Log Pagesptwb.Spt.Cdb[9] = 0x40; // Transfer Lengthsptwb.Spt.DataIn = SCSI_IOCTL_DATA_OUT;sptwb.DataBuf[0] = 2; // SMART Health Information

sptwb.DataBuf[4] = 0xFF;sptwb.DataBuf[5] = 0xFF;sptwb.DataBuf[6] = 0xFF;sptwb.DataBuf[7] = 0xFF;

length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf) + sptwb.Spt.DataTransferLength;

bRet = ::DeviceIoControl(hIoCtrl, IOCTL_SCSI_PASS_THROUGH,&sptwb, length, &sptwb, length, &dwReturned, NULL);

秘密の裏口 | SAMSUNG SSD 950 PRO

一部抜粋

//SMART Health Information

Page 38: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

38隠しコマンド大好き!!

秘密の裏口大好きです!!

隠しコマンドがあるなんてビックリです‼

Page 39: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

39S.M.A.R.T. | Samsung SM951

Samsung 製 NVMe Driver

ReadFile() ※Win32 API

Samsung SM951

データ読み出し S.M.A.R.T.

Get Log Page※NVMeコマンド

Read ※NVMe 標準コマンド

NVMe PASS THROUGH (SM951専用)

経由で NVMe コマンドを送る

Page 40: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

40S.M.A.R.T. | Intel

Intel 製 NVMe Driver

ReadFile() ※Win32 API

Intel SSD 750

データ読み出し S.M.A.R.T.

Get Log Page※NVMeコマンド

Read ※NVMe 標準コマンド

NVMe PASS THROUGH (Intel専用) 経由で NVMe コマンドを送る

Page 41: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

41S.M.A.R.T. | Storage Query (Win10)

Microsoft 製 NVMe Driver

ReadFile() ※Win32 API

NVMe SSD

データ読み出し S.M.A.R.T.

Get Log Page※NVMeコマンド

Read ※NVMe 標準コマンド

NVMe Storage Query経由で NVMe コマンドを送る

Page 42: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

42

BOOL CAtaSmart::GetSmartAttributeNVMeStorageQuery

(INT physicalDriveId, INT scsiPort, INT scsiTargetId, ATA_SMART_INFO* asi)

{

CString path;

path.Format(L"¥¥¥¥.¥¥PhysicalDrive%d", physicalDriveId);

HANDLE hIoCtrl = CreateFile(path, GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

BOOL bRet = 0;

StorageQuery::TStorageQueryWithBuffer nptwb;

ZeroMemory(&nptwb, sizeof(nptwb));

nptwb.ProtocolSpecific.ProtocolType = StorageQuery::ProtocolTypeNvme;

nptwb.ProtocolSpecific.DataType = StorageQuery::NVMeDataTypeLogPage;

nptwb.ProtocolSpecific.ProtocolDataRequestValue = 2; // SMART Health Information

nptwb.ProtocolSpecific.ProtocolDataRequestSubValue = 0xFFFFFFFF;

nptwb.ProtocolSpecific.ProtocolDataOffset = sizeof(StorageQuery::TStorageProtocolSpecificData);

nptwb.ProtocolSpecific.ProtocolDataLength = 4096;

nptwb.Query.PropertyId = StorageQuery::StorageAdapterProtocolSpecificProperty;

nptwb.Query.QueryType = StorageQuery::PropertyStandardQuery;

DWORD dwReturned = 0;

bRet = DeviceIoControl(hIoCtrl, IOCTL_STORAGE_QUERY_PROPERTY,

&nptwb, sizeof(nptwb), &nptwb, sizeof(nptwb), &dwReturned, NULL);

CloseHandle(hIoCtrl);

memcpy_s(&(asi->SmartReadData), 512, nptwb.Buffer, 512);

return bRet;

}

Win10新機能 | NVMe Storage Query

一部抜粋

Page 43: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

43ついに NVMe に対応!!

Page 44: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

44NVMe 対応状況

NVMe DriverSSD

MicrosoftIntel Samsung

Win 10 Win 8.1

Intel SSD 750 〇 × 〇 -

SAMSUNG SSD 950 PRO 〇 〇 - 〇

SAMSUNG SM951 〇 × - 〇

TOSHIBA PX04PMC080 〇 × - -

TOSHIBA XG3 〇 × - -

ZOTAC SONIX 〇 × - -

裏口: SAMSUNG SSD 950 PROのみ

Page 45: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

45

まとめ

Page 46: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

46まとめ

CrystalDiskMark & CrystalDiskInfo

NVMe対応

Page 47: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

47

参考文献

Page 48: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

48• nvmexpress.org

http://www.nvmexpress.org/

• NVM Express 1.2a Specificationhttp://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf

• Naraeon NVMe Toolshttps://github.com/ebangin127/nvmetools

参考文献

Page 49: C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

49懇親会もよろしくお願いします!!

キーワード:NVMe, ベンチマーク, Benchmark, AHCI, SSD, HDD, CPU, CPUID, ビデオカード, メガデモ, Final Reality, 3DMark, HDBENCH, WCPUID, Direct3D, OpenGL, MIDI, GS, XG, Photoshop, HiDPI, 8K, 5K, 4K, Displayport 1.3, Thunderbolt 3, HDMI 2.0, BIOS, EFI, SMBIOS, Firmware, 逆アセンブル, 逆コンパイル, カーネルモードドライバ, コードサイニング証明書, デジタル署名, x64, x86, i386, Win32, Win64, MFC, Visual C++, Visual C#, WinForms, WPF, DirectWrite, Windows 10, GDI, GDI+, リソースリーク, ハンドルリーク, メモリーリーク, クラッシュ, ブルースクリーン, S.M.A.R.T., PCI, PCIExpress, 10GbE, 10GBase-T, ダブルフォルト, 8月