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

Post on 16-Apr-2017

2.602 Views

Category:

Software

10 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

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

Boost.勉強会 #21 札幌#boostjp

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

2

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

3自己紹介

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

年齢:37歳

家族:妻, 愛娘, 愛息子

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

住所:北海道札幌市

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

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

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

4

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

5自作ソフトウェア紹介

CrystalDiskInfo CrystalDiskMark

CrystalMark 2004 CrystalCPUID

6Windows Store デビュー!!

Desktop App Converter サイコー

7AmorphousDiskMark

CrystalDiskMark の macOS 版!?

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

AmorphousDiskMark by @polydron

8

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

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

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

10

NVM Express

11NVMe とは

NVM Express (NVMe)

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

最大の特徴

速い!!

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)

13AHCI vs NVMe

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

AHCI NVMe

Queue 1 64KCommands/Queue 32 64K

Q32T1 Q32T4 Q32T8

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

14

CrystalDiskMark

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で完治

16CrystalDiskMark 3

CrystalDiskMark 3

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

時代遅れなプロダクト

17CrystalDiskMark 4/5 の開発

某I社

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

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

某I社

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

18

DiskSpdhttps://github.com/Microsoft/diskspd

CrystalDiskMark 3 と 5 の構成

UI

Core

CrystalDiskMark 3 CrystalDiskMark 5

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

DiskMark32.exe

Microsoft製DiskSpd採用

ベンチマーク機能改善

19CrystalDiskMark 3 と 5 の比較

CrystalDiskMark 3 CrystalDiskMark 5

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

ピーク速度測定に対応

TOSHIBA PX04PMC080 800GB

シーケンシャルリード

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

1.2GB/s

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

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

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

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)

22

CrystalDiskInfo

23CrystalDiskInfo (2008年リリース)

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

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

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

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

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

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

□リスペクト•なし

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

24NVMe 対応への道のり

CrystalDiskInfo 7

PATA/SATA RAID USB(IEEE1394)

NVMe

25NVMe のコマンド体系

標準コマンド必須3種類

Admin コマンド必須10種類

26Intel SSD 750 1.2TB

27SAMSUNG SSD 950 PRO 512GB

NVMe 調査のために購入

28SAMSUNG SM951 128GB

NVMe 調査のためだけに購入

29TOSHIBA PX04PMC080 800GB

TOSHIBA様から借用

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.

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 コマンドを通さない!!

32

どうしたら・・・

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

NVMe \(^o^)/オワタ

33神降臨

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

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

34神降臨

http://naraeon.net/

https://github.com/ebangin127/nvmetools

35

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

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

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 コマンドを送る

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

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

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

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

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 コマンドを送る

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 コマンドを送る

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 コマンドを送る

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

一部抜粋

43ついに 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のみ

45

まとめ

46まとめ

CrystalDiskMark & CrystalDiskInfo

NVMe対応

47

参考文献

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

参考文献

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月

top related