Ubuntu Weekly Recipe

第802回USB外付けポータブルSSDとの付き合い

第800回第801回では「⁠USBメモリ型SSD」もしくは「スティック型SSD」と呼ばれる製品の中から、最安価格帯のものを検証しました。その中で参考データとして、USBメモリサイズとは関係がない一般的なM.2 2280サイズのSSD図1を比較対象として使ったところ、良好なパフォーマンスが観測されました。

図1 USB変換ケース入りM.2 NVMe SSDこそがポータブルSSDとして最強なのだろうか
図1

買って使ってみるまで詳細なスペックがわかりづらいUSBメモリ型SSDと比べると、ベンチマークや詳細なデータが公開されている有名どころのM.2 NVMe SSDのほうがパフォーマンスの面で確実性が高いです。そうすると自分なりの組み合わせでNVMe SSDとUSB変換ケースを選んだ方が結果的にお得なのでは、と考えたくなります。これはある程度は正しいのですが、持ち運び用のコンパクトな外付けSSDにしたいという視点で見ると、使いにくい部分も出てきます。今回はそういった点を一つ一つ見ていきながら、USB外付けポータブルSSDとの付き合い方を考えていきます。

ケーブルの取り回しがしにくい

「⁠USBメモリ型SSD」もしくは「スティック型SSD」と呼ばれる製品が人気である理由の一つが、USB端子が一体になった形をしていて、すぐにテレビやPS4/PS5、ノートPCなどに挿して使えることでしょう。対してM.2 NVMe SSD用のUSB変換ケースはUSB端子が一体化しているわけではなく、30cmほどの短めのUSBケーブルが付属している場合が多いです[1]。付属のケーブルをそのまま使うと、ノートPCを持ち上げた時にぶら下がるような形になってしまって不格好になり、ポータブル感が削がれてしまいます。

これに対する筆者としての解決策は単純で、ケーブルをなくしてしまいました。L字型のUSB Type-C/Type-A変換アダプターを購入し、Type-C側をUSB変換ケースに、Type-A側をノートPCに挿し込むことで自立させ、垂れ下がるスタイルから卒業しました図2⁠。もちろんType-A端子はType-Cと違い挿し込む際に向きがあるので、ここを間違ってしまうとUSB変換ケースが机にめり込む方向になってしまいます。購入時には端子の向きに十分注意してください。テレビの裏に取り付ける場合は、逆に下向きの方が収まりがいいかもしれません。

図2 NVMe SSDを一昔前の無線LAN子機のように装着する例。この状態のままノートPCの蓋を開け閉めできる
図2

性能が高いゆえに発熱が大きい

一般的に性能が高いSSDほど高温になりやすく、大型のヒートシンクをつけてそこに風がしっかり当たることが安定稼働の鍵になってきます。USB接続でも大型のヒートシンクや、さらに小型ファンがついているケースも販売されてはいます。ただその場合は、元のM.2 2280 SSDと比べると一回りも二回りも大きくなり、カバンに常に入れておくといったポータブル性を重視した使い方をするには厳しいです。大型のヒートシンクもファンもついていない小型薄型のUSB変換ケースでもある程度やりくりする方法はあるのでしょうか。

対策を考える前に、まずはサーマルスロットリング(熱による性能制限)が実際にどのように適用されるかの例を見てみましょう。室温15-20℃程度で、KIOXIA EXCERIA G2 NVMe SSD 500GBモデルをRealtek RTL9210B-CG搭載のUSB変換ケースに入れ、10Gbps接続で全域にシーケンシャル書き込みをした際の1秒ごとのパフォーマンスが図3です。条件を明確にしておくと、このケースには大型のヒートシンクもファンもついておらず、冷却はそれほど得意ではない環境です。

図3 NVMe SSDを小型USB変換ケースで使用しサーマルスロットリングがかかった例
図3

このSSDは、Warningとなる温度が72℃、Criticalが90℃なのですが、72℃を超えてもその時点ではまだ明らかなサーマルスロットリングは発生せず、80℃をうかがうあたりから制限がかかり始めます。速度が制限されても温度は下がっていかず、82℃あたりを超えないようにより強い制限をかけざるを得ない様子がわかります。別途ファンを用意して風を当て続け80℃を超えないようにすると、最後まで700MB/sを維持できるのは確認済みです。

次に、同じ条件と構成で、接続先のUSBポートを10Gbps(筆者の環境の場合Type-C)から5Gbps(同じくType-A)に変えてみます。両方の結果を同じグラフに入れてみたのが図4です。

図4 5Gbps接続と10Gbps接続で性能差ゆえにサーマルスロットリングのかかりやすさの違いがある
図4

意図的に性能を制限された5Gbps接続のほうが、最高速度が絞られているため温度の上昇が穏やかで、結果的にサーマルスロットリングに引っかかる前に全書き込みを終えています。前半の部分を見ると10Gbps接続のほうが圧倒的なパフォーマンスですが、後半部分も考慮に入れると甲乙つけがたいところです。

大型のヒートシンクやファンをつけない場合に限って言えば、USB変換ケースが10Gbpsもしくはそれ以上の速度に対応していても、あえて5Gbpsのポートを使いピーク速度を制限することで発熱を抑えるのは悪い考えではないでしょう。

ちなみに、この5Gbps接続と10Gbps接続でのサーマルスロットリングの発生のしやすさの違いは、USB接続SSD製品の史上最小クラスであるBUFFALO SSD-PSTU3Aシリーズでも観測できます図5⁠。同じような条件で測定したときに、最初によく速度が出る10Gbps接続の場合よりも、全体を通して安定した速度が出る5Gbpsのほうが平均速度が結果的に速くなり、書き込みを終えるまでの時間が短くなっています。SSD-PSTU3Aシリーズはその圧倒的な小ささゆえ放熱のための表面積も小さいので、用途によっては風を当ててあげたほうがよさそうです。

図5 史上最小クラスのUSB接続SSD、PSTU3Aシリーズでもサーマルスロットリングのかかり方に違いがある(1800秒以降は省略)
図5

温度の監視がしにくい

先ほどからSSDを使う場合は温度が重要という話をしていますが、実際に温度を監視してみようとするとUSB接続の場合は少し面倒です。

M.2 NVMe SSDを内蔵ドライブとして使用する場合は、GNOME extensionsを使ってデスクトップ上に温度を表示したり、Prometheusのnode_exporterを使って温度の経過を見たりが簡単にできます図6⁠。

図6 内蔵NVMe SSDであれば温度を簡単に監視できる。node_expoerterの例
図6

USB変換ケースを使うと、NVMe SSDはNVMeで直接接続されているようにOSから見えるわけではなく、UAS(USB Attached SCSI)というプロトコルを介して接続されます。温度を取得するには、smartmontoolsパッケージに入っているsmartctlコマンドなどを使う必要があります。

筆者が普段使用しているRealtek RTL9210B-CG搭載のUSB変換ケースは次のようにsntrealtek("NVMe disks that are behind a Realtek USB to NVMe bridge")と上手く判定されて温度が取得できます[2]

$ smartctl --scan
/dev/sda -d sntrealtek # /dev/sda [USB NVMe Realtek], NVMe device
/dev/nvme0 -d nvme # /dev/nvme0, NVMe device

$ sudo smartctl /dev/disk/by-id/usb-Realtek_RTL9210B-CG_012345679350-0\:0 \
    -x | grep Celsius
Warning  Comp. Temp. Threshold:     72 Celsius
Critical Comp. Temp. Threshold:     90 Celsius
Temperature:                        31 Celsius

このように自動判定が動作するものだと、監視スクリプトの中で次のような形にすれば温度部分の情報が抜き出せます。

$ sudo smartctl /dev/sda --attributes --json \
    | jq -r .temperature.current
31

自動判定がいつも動いてくれるわけではなく、筆者が他にも所有しているJMicron JMS583搭載の変換ケースでは-d sntjmicron("NVMe disks that are behind a JMicron USB to NVMe bridge")を手動で追加する必要があったり、USBメモリ型SSDでは-d sat-d sat,12 -T permissive -s onなど自分で動作する組み合わせを探る必要があったりします。ただその中でも面白かったのが前回使用したI-O DATA SSPE-USC250で、このデバイスは温度の履歴を一定期間保存してくれます。そのため、次のように気軽に履歴グラフをチェックするにはよかったです。

$ sudo smartctl /dev/disk/by-id/usb-I-O_DATA_SSPE-USC_B00000000EC1-0\:0 \
    -d sat -l scttemphist
...

=== START OF READ SMART DATA SECTION ===
SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:     -127/127 Celsius
Min/Max Temperature Limit:           -127/127 Celsius
Temperature History Size (Index):    478 (204)

Index    Estimated Time   Temperature Celsius
...
  33    2024-02-17 07:41     ?  -
  34    2024-02-17 07:42    30  ***********
  35    2024-02-17 07:43    32  *************
  36    2024-02-17 07:44    32  *************
  37    2024-02-17 07:45    33  **************
  38    2024-02-17 07:46    34  ***************
  39    2024-02-17 07:47    35  ****************
 ...    ..( 18 skipped).    ..  ****************
  58    2024-02-17 08:06    35  ****************
  59    2024-02-17 08:07    34  ***************
  60    2024-02-17 08:08    33  **************
  61    2024-02-17 08:09     ?  -
...

TRIM/discardが標準ではできない

筆者が思っていた最大のデメリットは、USB変換ケースを挟むとTRIM/discardが有効になっていないことです。内蔵NVMe SSDの場合は週に一度発動するfstrim.timerによって、fstrimが実行されます。USB接続だとdiscardが使えないと思い込んでいたので、定期的に変換ケースから外し、ミニPCのM.2スロットに挿して内蔵SSDにしてからfstrimを実行してまた変換ケースに戻す、ということをしていました。

UAS(USB Attached SCSI)で接続したときになぜdiscardが有効になっていないのか、lsscsisg3-utilsパッケージを入れてから次のようにして情報をみてみましょう。

$ lsscsi -Nlv
[0:0:0:0]    disk    Realtek  RTL9210B-CG      1.00  /dev/sda 
  state=running queue_depth=30 scsi_level=7 type=0 device_blocked=0 timeout=30
  dir: /sys/bus/scsi/devices/0:0:0:0  [/sys/devices/pci0000:00/0000:00:08.1/0000:04:00.4/usb4/4-1/4-1:1.0/host0/target0:0:0/0:0:0:0]


$ sudo sg_readcap -l /dev/sda 
Read Capacity results:
   Protection: prot_en=0, p_type=0, p_i_exponent=0
   Logical block provisioning: lbpme=0, lbprz=0
   Last LBA=976773167 (0x3a38602f), Number of logical blocks=976773168
   Logical block length=512 bytes
   Logical blocks per physical block exponent=0
   Lowest aligned LBA=0
Hence:
   Device size: 500107862016 bytes, 476940.0 MiB, 500.11 GB

この出力の中で注目すべきはlbpme=0で、デバイス側からlbpme(Logical Block Provisioning Management Enabled)が1(有効)であることを通知してきていません。LinuxカーネルとしてはそこでSCSIの仕様通りdiscardを有効にするのをやめてしまうようです。過去には「このフラグが立っていなくても実際にはdiscardがサポートされているデバイスはよくあるから、lbpme=0でも情報を読み進めて判断しよう」という提案があったようですが「仕様に則ってdiscardサポートを通知して来ていないのはデバイス側なのに、データ破壊のリスクをおかしてまで一律でフラグを無視することなんてできない。自分のデバイスに対して有効にしたければ個別にやればいい」⁠意訳)という返答を受けています。たしかにその通りです。

そこで個別に有効にするために、次のようにUnmap command supported (LBPU)1になっていて、unmapコマンド(discardに相当)がサポートされていることを確認します[3]

$ sudo sg_vpd -a /dev/sda \
    | grep -A3 'Logical block provisioning VPD page'
Logical block provisioning VPD page (SBC):
  Unmap command supported (LBPU): 1
  Write same (16) with unmap bit supported (LBPWS): 0
  Write same (10) with unmap bit supported (LBPWS10): 0

続いて、SCSIデバイスのprovisioning_modeunmapを書き込んでdiscardが有効になることを確認します。

$ lsblk -e7 --discard 
NAME                        DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                                0        0B       0B         0
nvme0n1                            0      512B       2T         0
...

$ cat /sys/block/sda/device/scsi_disk/0:0:0:0/provisioning_mode
full

$ echo unmap | sudo tee /sys/block/sda/device/scsi_disk/0:0:0:0/provisioning_mode

$ lsblk -e7 --discard
NAME                        DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                                0      512B       4G         0
nvme0n1                            0      512B       2T         0
...

これでUSB接続でもfstrimblkdiscardが使えるようになるのですが、udevルールなどで恒久的に有効にする前にデータ破壊が発生していないかよくテストしたほうがよさそうです。

ここまでUSB接続SSDを使う上での注意点とその対策をまとめてきました。USBメモリ型SSDのような完成されたものも自分でM.2 NVMe SSDとUSB変換ケースを組み合わせるものもそれぞれの良さがあります。性能が高いSSDの発熱には気をつけて、快適なポータブルSSDライフをお過ごしください。

おすすめ記事

記事・ニュース一覧