第800回、第801回では
買って使ってみるまで詳細なスペックがわかりづらいUSBメモリ型SSDと比べると、ベンチマークや詳細なデータが公開されている有名どころのM.
ケーブルの取り回しがしにくい
「USBメモリ型SSD」
これに対する筆者としての解決策は単純で、ケーブルをなくしてしまいました。L字型のUSB Type-C/
性能が高いゆえに発熱が大きい
一般的に性能が高いSSDほど高温になりやすく、大型のヒートシンクをつけてそこに風がしっかり当たることが安定稼働の鍵になってきます。USB接続でも大型のヒートシンクや、さらに小型ファンがついているケースも販売されてはいます。ただその場合は、元のM.
対策を考える前に、まずはサーマルスロットリング
このSSDは、Warningとなる温度が72℃、Criticalが90℃なのですが、72℃を超えてもその時点ではまだ明らかなサーマルスロットリングは発生せず、80℃をうかがうあたりから制限がかかり始めます。速度が制限されても温度は下がっていかず、82℃あたりを超えないようにより強い制限をかけざるを得ない様子がわかります。別途ファンを用意して風を当て続け80℃を超えないようにすると、最後まで700MB/
次に、同じ条件と構成で、接続先のUSBポートを10Gbps
意図的に性能を制限された5Gbps接続のほうが、最高速度が絞られているため温度の上昇が穏やかで、結果的にサーマルスロットリングに引っかかる前に全書き込みを終えています。前半の部分を見ると10Gbps接続のほうが圧倒的なパフォーマンスですが、後半部分も考慮に入れると甲乙つけがたいところです。
大型のヒートシンクやファンをつけない場合に限って言えば、USB変換ケースが10Gbpsもしくはそれ以上の速度に対応していても、あえて5Gbpsのポートを使いピーク速度を制限することで発熱を抑えるのは悪い考えではないでしょう。
ちなみに、この5Gbps接続と10Gbps接続でのサーマルスロットリングの発生のしやすさの違いは、USB接続SSD製品の史上最小クラスであるBUFFALO SSD-PSTU3Aシリーズでも観測できます
温度の監視がしにくい
先ほどからSSDを使う場合は温度が重要という話をしていますが、実際に温度を監視してみようとするとUSB接続の場合は少し面倒です。
M.
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/fstrim.
によって、fstrim
が実行されます。USB接続だとdiscardが使えないと思い込んでいたので、定期的に変換ケースから外し、ミニPCのM.fstrim
を実行してまた変換ケースに戻す、ということをしていました。
UAS(USB Attached SCSI)で接続したときになぜdiscardが有効になっていないのか、lsscsi
とsg3-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
lbpme=0
でも情報を読み進めて判断しよう」
そこで個別に有効にするために、次のようにUnmap command supported (LBPU)
が1
になっていて、unmap
コマンド
$ 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_
にunmap
を書き込んで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接続でもfstrim
やblkdiscard
が使えるようになるのですが、udevルールなどで恒久的に有効にする前にデータ破壊が発生していないかよくテストしたほうがよさそうです。
ここまでUSB接続SSDを使う上での注意点とその対策をまとめてきました。USBメモリ型SSDのような完成されたものも自分でM.