View
2.602
Download
10
Category
Preview:
Citation preview
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月
Recommended