USB HDDで速度が激落ちするときの対処法

# Proxmoxのハードディスクパススルーの問題
私の自宅サーバーは、VMに4TBのUSBハードディスクをパススルーすることでNASを作成しています。しかし、先日4TBのHDDをさらに増設したのですが、VMがio-errorで停止するようになりました。さらに、io遅延が90％になり、速度がものすごく低下します。今回はこの対処法を調査したので、僕の知っている知識と合わせながら書いていきます。
**注:図があまりないので気になる方は調べてみてください。**


# PC・デバイスの原因
ここでは、OSに関係なく、USBデバイスの速度が低下している際に確認しておくべきものを説明します。

## チップセットの限界
　皆さんが使用しているPCには、チップセットと呼ばれるデバイスが搭載されています。自作PCを作ったことがある方は、CPUとの対応などで聞いたことがあると思います。
　このチップセットの役割は、PCに搭載されている1部のデバイスとCPUを繋げ、データの受け渡しの管理を行うことです。
　最新のPCは、GPU（PCIeの一部）とRAMのみCPUと直結してデータのやり取りをし、残りのデバイスはチップセットを介してCPUとデータのやり取りを行います。sata HDDやUSBもチップセット経由です。そのため、このチップセットとCPUの通信速度の限界値になると速度が低下します。新しいPCは基本的にチップセットの限界に達することはないのですが、古いPCは新しいデバイスをハブなどでたくさん繋げると速度低下を起こすかもしれないので、確認してみてください。
　私の場合は、2021年のH570チップセットなので、チップセットが原因なのは考えずらいと判断しました。

## USB HDDケースの問題
　USB HDDケースには、SATAとUSBを変換するチップが存在します。このチップですが、稀に不具合のあるファームウェアが搭載された製品もあるそうです。それが原因で通信速度が低下している可能性もあります。よく聞くのは、jms567というチップでファームウェアをアップデートしなければ安定しないらしいです。また、チップが発熱しすぎると速度が低下するという話も聞くので、使用温度も重要かもしれません。
　私が使用しているHDDケースはjms562というチップで、どうやら不具合はないようです。

## ケーブルのノイズ
　ケーブルの通信時には必ずノイズが発生します。デジタル通信はこのノイズを除去し、正しいデータを取り出すという作業をちゃんとしてます。しかしノイズ除去にも限界があり、ノイズが多すぎると正しく通信できなくなります。それを対処する方法としてフェライトコアというものを取り付けることで、ノイズを軽減することが出来ます。写真のようにUSBケーブルや電源ケーブルについている塊がフェライトコアです。
　ケーブルノイズ問題は、実は経験していました。なぜか大量の書き込みをしたときにVMが落ちました。しかし、ACアダプタを離したり、ノイズを除去するをフェライトコアを取り付けたら直りました。結構HDDのUSBケーブルはノイズも影響するそうです。
 　新しいHDDケースのケーブルにもフェライトコアは取り付けたのでノイズは大丈夫です。
![PXL_20240927_062439466.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/2def4a4c-0cec-809e-0e9e-e573bdba58bc.jpeg)


## USBの通信規格を確認する
　そもそも、USBを指す場所が違うという可能性もあります。基本的に外付けHDDケースはUSB3.0を使用します。USB3.0は青色の端子です。
　ちなみに、**私はこの端子を間違えていました。マザーボードの3.0の位置を思いっきり勘違いしてました。** 差し替えたらio遅延は16％程度に収まり、VMが落ちなくなりました。

## USB接続をあきらめる
　これが一番楽です。SATA接続の場合はUSBコントローラーではなく、チップセットのSATAコントローラーが使用されるので、このような問題はそもそも発生しなくなります。HDDがこれ以上はいらない場合は、PCケースの交換が必要となります。（だからUSB HDDを使っていると思いますが・・・）
　私の場合は、天板が木のITXケースが気に入っているので、この選択肢はなし！
 ![IMG_20220304_151521_387.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/5f93771d-2f6b-7442-42b6-a81134007c58.jpeg)

# Proxmoxの設定
以降はProxmoxでのみで解決する問題を見ていきます。

## ハードウェアパススルーはSCSIで行う
　Proxmoxの公式ドキュメントによると、SCSIコントローラーの仕様を強く推奨しているようです。HDDは大抵SATA接続なのでSATAコントローラー仮想化して使用するように設定していましたが、それが足を引っ張っている可能性があります。なので、HDDパススルーはSCSIを使いましょう。
　また、パススルー後にGUIからIO_threadを有効にしておきましょう。まぁ、私は直りませんでしたが。

~~~:
# qm set <VMID> -scsi1 <HDD Path>
[例]
# qm set 105 -scsi1 /dev/disk/by-id/ata-ST4000DM004-2CV104_ZFN4EN0M-part1
~~~

## キャッシュで対処する
　これらを確認しても直らない場合やUSB2.0しかない場合は、Proxmox側でキャッシュを割り当てましょう。
　HDDパススルーした後でGUIからキャッシュをWrite Backにします。これにより、1GB程度のファイルであれば高速に書き込みできます。ただし、大容量ファイルは途中で速度が大幅に低下します。また、このWrite BackはProxmox VEノードのメモリをキャッシュとして使うため、書き込み中に停電したらデータが破損します。気をつけてください。
 ![スクリーンショット 2024-09-27 152942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/2f76421a-f8c8-f48d-18c8-cf7a3b5ea385.png)


## 相性
　ProxmoxでVMに問題が発生しているデバイスをUSBパススルーしようとしてみてください。その際、USBの速度が表示されるので確認できるはずです。このときに、USB3.0に接続しているのにも関わらず、USB速度が違う場合、相性が悪い可能性もあります。今一度、コネクタの場所を確認し、掃除もしてみて直らない場合はあきらめましょう。
 ![スクリーンショット 2024-09-27 151236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/c228d09e-76ed-fdf9-5271-e639685d2340.png)


# まとめ
　えー、はい。思いっきり私のミスです。USB速度は今まで気にしてませんでしたが、重要だと思い知らせました。フェライトコアなどはProxmox以外でも通用すると思うので、参考になれば幸いです。