M.2 SSD

パッケージ探訪: libnvme

2024年11月16日
著者: 竹洞 陽一郎

はじめに

今回は、Slackware-currentで11/15に更新されたlibnvmeについてご紹介します。

libnvmeとは

libnvmeは、NVMeデバイスとのやり取りを容易にするためのオープンソースのCライブラリです。
NVMe(Non-Volatile Memory Express)は、SSDなどの高速ストレージデバイスのパフォーマンスを最大限に引き出すために設計されたインターフェース規格です。
このライブラリを使うことで、ユーザーや開発者はNVMeデバイスの情報取得、管理、パフォーマンス計測など、複雑な操作をシンプルに行うことができます。

Linux環境での利用が想定されており、NVMeの標準仕様に沿った高度な機能をサポートしています。

libnvmeの主な機能

libnvmeは、以下のような機能を提供しています。

NVMeデバイスの検出と管理
libnvmeを利用することで、接続されているNVMeデバイスを簡単に検出し、管理することが可能です。
例えば、デバイスの状態を確認したり、健康状態をモニタリングすることができます。
I/O操作のサポート
NVMeデバイスへのI/Oリクエストの送信を簡単に行えます。
これにより、データの読み書き操作やキューの管理が容易になります。
標準に基づく拡張性
libnvmeはNVMe仕様に準拠しており、標準コマンドセットのサポートはもちろん、ZNS(ゾーン名前空間)などの最新の機能にも対応しています。

nvmeコマンド

libnvmeには、nvmeというコマンドが実装されており、多種多様なサブコマンドが実装されています。

サブコマンド実行内容
listマシン上のすべてのNVMeデバイスと名前空間を一覧表示
list-subsysNVMeサブシステムを一覧表示
id-ctrlNVMeコントローラを識別する
id-nsNVMe名前空間を識別し、構造を表示
id-ns-granularityNVMe名前空間の粒度リストを識別し、構造を表示
id-ns-lba-format指定されたLBAフォーマットインデックスのNVMe名前空間を識別し、構造を表示
list-nsNVMeリストを識別し、構造を表示
list-ctrlNVMeコントローラリストを識別し、構造を表示
nvm-id-ctrlNVMe NVMコマンドセットのコントローラを識別し、構造を表示
nvm-id-nsNVMe NVMコマンドセットの名前空間を識別し、構造を表示
nvm-id-ns-lba-format指定されたLBAフォーマットインデックスのNVMe NVMコマンドセットの名前空間を識別し、構造を表示
primary-ctrl-capsプライマリコントローラの機能を識別
list-secondaryプライマリコントローラに関連するセカンダリコントローラを一覧表示
cmdset-ind-id-nsI/Oコマンドセットに依存しない名前空間を識別
ns-descsNVMe名前空間の記述子リストを識別し、構造を表示
id-nvmsetNVMe NVMセットリストを識別し、構造を表示
id-uuidNVMe UUIDリストを識別し、構造を表示
id-iocsNVMe I/Oコマンドセットを識別し、構造を表示
id-domainNVMeドメインリストを識別し、構造を表示
list-endgrp耐久グループのリストを識別し、構造を表示
create-ns指定されたパラメータで名前空間を作成
delete-nsコントローラから名前空間を削除
attach-ns指定されたコントローラに名前空間をアタッチ
detach-ns指定されたコントローラから名前空間をデタッチ
get-ns-idオープンされたブロックデバイスの名前空間IDを取得
get-logNVMeの一般的なログを取得し、生の形式で返す
telemetry-logFWテレメトリログを取得し、ファイルに書き込む
fw-logFWログを取得し、表示する
changed-ns-list-log変更された名前空間リストを取得し、表示する
smart-logSMARTログを取得し、表示する
ana-logANAログを取得し、表示する
error-logエラーログを取得し、表示する
effects-logコマンドの影響ログを取得し、表示する
endurance-log耐久グループのログを取得し、表示する
predictable-lat-log各Nvmsetの予測可能な遅延ログを取得し、表示する
pred-lat-event-agg-log予測可能な遅延イベント集計ログを取得し、表示する
persistent-event-log永続的なイベントログを取得し、表示する
endurance-event-agg-log耐久グループイベントの集計ログを取得し、表示する
lba-status-logLBAステータス情報ログを取得し、表示する
resv-notif-log予約通知ログを取得し、表示する
boot-part-logブートパーティションログを取得し、表示する
phy-rx-eom-log物理インターフェースレシーバーのアイオープニング測定を取得し、表示する
get-feature機能を取得し、結果の値を表示する
device-self-test必要なテストを実行してパフォーマンスを観察する
self-test-log自己テストログを取得し、表示する
supported-log-pagesサポートされているログページの詳細を取得し、表示する
fid-support-effects-logFIDのサポートおよび影響ログを取得し、表示する
mi-cmd-support-effects-logMIコマンドのサポートおよび影響ログを取得し、表示する
media-unit-stat-logメディアユニットの構成と摩耗状況を取得し、表示する
supported-cap-config-logサポートされている容量構成記述子のリストを取得
set-feature機能を設定し、結果の値を表示する
set-propertyプロパティを設定し、結果の値を表示する
get-propertyプロパティを取得し、結果の値を表示する
format新しいブロックフォーマットで名前空間をフォーマットする
fw-commitファームウェアを特定のスロットに検証してコミットする (バージョン1.2より前ではfw-activate)
fw-download新しいファームウェアをダウンロードする
admin-passthru任意の管理コマンドを送信し、結果を返す
io-passthru任意のI/Oコマンドを送信し、結果を返す
security-sendセキュリティ送信コマンドを送信し、結果を返す
security-recvセキュリティ受信コマンドを送信し、結果を返す
get-lba-statusLBAステータスコマンドを送信し、結果を返す
capacity-mgmt容量管理コマンドを送信し、結果を返す
resv-acquire予約獲得を送信し、結果を返す
resv-register予約登録を送信し、結果を返す
resv-release予約解除を送信し、結果を返す
resv-report予約レポートを送信し、結果を返す
dsmデータセット管理コマンドを送信し、結果を返す
copyシンプルなコピーコマンドを送信し、結果を返す
flushフラッシュコマンドを送信し、結果を返す
compare比較コマンドを送信し、結果を返す
read読み取りコマンドを送信し、結果を返す
write書き込みコマンドを送信し、結果を返す
write-zeroesゼロを書き込むコマンドを送信し、結果を返す
write-uncor訂正不可能な書き込みコマンドを送信し、結果を返す
verify検証コマンドを送信し、結果を返す
sanitizeサニタイズコマンドを送信する
sanitize-logサニタイズログを取得し、表示する
resetコントローラをリセットする
subsystem-resetサブシステムをリセットする
ns-rescanNVMe名前空間を再スキャンする
show-regsコントローラのレジスタまたはプロパティを表示する。キャラクタデバイスが必要
set-regレジスタを設定し、結果の値を表示する
get-regレジスタを取得し、結果の値を表示する
discoverNVMeoFサブシステムを検出する
connect-allNVMeoFサブシステムを検出し、接続する
connectNVMeoFサブシステムに接続する
disconnectNVMeoFサブシステムから切断する
disconnect-allすべての接続されたNVMeoFサブシステムから切断する
configNVMeoFサブシステムの構成
gen-hostnqnNVMeoFホストNQNを生成する
show-hostnqnNVMeoFホストNQNを表示する
gen-dhchap-keyNVMeoF DH-HMAC-CHAPホストキーを生成する
check-dhchap-keyNVMeoF DH-HMAC-CHAPホストキーを検証する
gen-tls-keyNVMeoF TLS PSKを生成する
check-tls-keyNVMeoF TLS PSKを検証する
tls-keyNVMeoF TLS PSKを操作する
dir-receiveディレクティブ受信コマンドを送信し、結果を返す
dir-sendディレクティブ送信コマンドを送信し、結果を返す
virt-mgmtプライマリとセカンダリコントローラ間でフレキシブルリソースを管理する
rpmbリプレイプロテクションメモリブロックコマンド
lockdownロックダウンコマンドを送信し、結果を返す
dimディスカバリーコントローラにディスカバリー情報管理コマンドを送信する
show-topologyトポロジを表示する
io-mgmt-recvI/O管理受信
io-mgmt-sendI/O管理送信
nvme-mi-recvNVMe-MI受信コマンドを送信し、結果を返す
nvme-mi-sendNVMe-MI送信コマンドを送信し、結果を返す
versionプログラムのバージョンを表示する
helpこのヘルプを表示する

例えば、詳細なS.M.A.R.T(Self-Monitoring, Analysis and Reporting Technology)ログを取得するには、smart-logというオプションを使います。


sudo nvme smart-log /dev/nvme0

Smart Log for NVMe device:nvme0 namespace-id:ffffffff
critical_warning                        : 0
temperature                             : 37 °C (310 K)
available_spare                         : 100%
available_spare_threshold               : 5%
percentage_used                         : 0%
endurance group critical warning summary: 0
Data Units Read                         : 4751861 (2.43 TB)
Data Units Written                      : 5374489 (2.75 TB)
host_read_commands                      : 19291776
host_write_commands                     : 22572763
controller_busy_time                    : 89
power_cycles                            : 230
power_on_hours                          : 1702
unsafe_shutdowns                        : 38
media_errors                            : 0
num_err_log_entries                     : 497
Warning Temperature Time                : 0
Critical Composite Temperature Time     : 0
Thermal Management T1 Trans Count       : 0
Thermal Management T2 Trans Count       : 0
Thermal Management T1 Total Time        : 0
Thermal Management T2 Total Time        : 0

libnvmeのプラグイン

特定のベンダー固有の機能や特定のNVMe機能をサポートするために、プラグインが用意されています。

プラグイン名説明
amznAmazonのベンダー固有の拡張機能
dapustorDapuStorのベンダー固有の拡張機能
dellDELLのベンダー固有の拡張機能
deraDeraのベンダー固有の拡張機能
fdpFlexible Data Placement対応デバイスの管理
huaweiHuaweiのベンダー固有の拡張機能
innogritInnogritのベンダー固有の拡張機能
inspurInspurのベンダー固有の拡張機能
intelIntelのベンダー固有の拡張機能
memblazeMemblazeのベンダー固有の拡張機能
micronMicronのベンダー固有の拡張機能
nbftACPI NBFTテーブルの拡張機能
netappNetAppのベンダー固有の拡張機能
nvidiaNVIDIAのベンダー固有の拡張機能
sfxScaleFluxのベンダー固有の拡張機能
seagateSeagateのベンダー固有の拡張機能
shannonShannonのベンダー固有の拡張機能
solidigmSolidigmのベンダー固有の拡張機能
toshibaToshibaのNVMeプラグイン
transcendTranscendのベンダー固有の拡張機能
virtiumVirtiumのベンダー固有の拡張機能
wdcWestern Digitalのベンダー固有の拡張機能
ymtcYMTCのベンダー固有の拡張機能
znsZoned Namespaceコマンドセット
ssstcSSSTCのベンダー固有の拡張機能
sedSED Opalコマンドセット
ocpOCPクラウドSSD拡張機能

プラグインを使う場合、例えば、IntelのNVMeデバイスであれば、以下のようにして実行します。


sudo nvme intel smart-log /dev/nvme0

libnvmeのメンテナンス

libnvmeは、Metaのソフトウェアエンジニアである、Keith Busch氏を中心に開発されています。
Keith Busch氏は以下の経歴と実績を持っています。

libnvmeのドキュメントは、Welcome to libnvme’s documentation!にあります。
ソースコードは、GitHubにあります。

libnvmeは、NVMe機能へのアクセスを提供するオープンソースライブラリとして開発されており、約20,000行のCコードで構成され、250の公開関数、900の定数を定義する200の列挙型、100の仕様定義構造体を含む大規模なプロジェクトとなっています。

Keith氏によるlibnvmeの解説動画はこちらで観ることができます。

まとめ

libnvmeは、NVMeデバイスの操作を簡素化し、効率的なストレージ管理を実現するための強力なライブラリです。
NVMeデバイスの性能を最大限に引き出すためには、このようなツールを利用して高度な管理・最適化を行うことが非常に有効です。
もし、NVMeデバイスを利用しているなら、libnvmeを活用してみてはいかがでしょうか。