RyzenでProxmoxVEを組むとフリーズする件

# はじめに
ProxmoxVEでサーバーを構築したのだが定期的にダウンしていた。原因が分かったため記事にする。

# 追記（Proxmox7以降の話）
pythonコマンドが無くなり、python3となりました。python3とコマンドは置き換えてください。この記事で適用したcronの設定もアップグレード後には機能しなくなっているはずです。

# マシンの構成
CPU：AMD Ryzen 5 1600 https://kakaku.com/item/K0000954888/
GPU：Geforce GTX 1050Ti https://kakaku.com/item/K0000921781/
マザボ：ASRock AB350 PRO4 https://kakaku.com/item/K0000947191/

# 障害発生時の状況
フリーズ時の実際の写真。
![rotate_log.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65278/a841ae7c-89d0-80d0-391a-ea52e8db15ec.jpeg)

文字に起こしてみると以下のような内容。

```sh
login: [1192.106507] watchdog: BUG soft lockup - CPU#11 stuck for 23s [pvesr:31246]
[16.102216] watchdog: BUG soft lockup - CPU#10 stuck for 22s [kworker/10:3:6830]
[20.106166] watchdog: BUG soft lockup - CPU#11 stuck for 23s [pvesr:31246]
[44.106166] watchdog: BUG soft lockup - CPU#10 stuck for 22s [kworker/10:3:6830]
```

節電のためC6ステートに切り替えを行ったときに不具合が発生するらしい。

Ryzen linux kernel bug 196683 - Random Soft Lockup
https://community.amd.com/t5/processors/ryzen-linux-kernel-bug-196683-random-soft-lockup/td-p/156304

# 直し方
"ZenStates-Linux"というPythonコードを使用するとRyzenのC6を無効化できる。msrモジュールを事前に有効化させる必要がある。

msrモジュールを自動で読み込むようにする

```sh
vim /etc/modules

# 中に以下を追記
msr
```

GitHubからコードを落とす
ZenStates-Linux
https://github.com/r4m0n/ZenStates-Linux

```sh
git clone https://github.com/r4m0n/ZenStates-Linux.git
```

現在のC6ステートを確認。C6が有効であることがわかる。

```sh
sudo python c6_state_check/ZenStates-Linux/zenstates.py -l
P0 - Enabled - FID = 80 - DID = 8 - VID = 32 - Ratio = 32.00 - vCore = 1.23750
P1 - Enabled - FID = 8C - DID = A - VID = 50 - Ratio = 28.00 - vCore = 1.05000
P2 - Enabled - FID = 7C - DID = 10 - VID = 68 - Ratio = 15.50 - vCore = 0.90000
P3 - Disabled
P4 - Disabled
P5 - Disabled
P6 - Disabled
P7 - Disabled
C6 State - Package - Enabled
C6 State - Core - Enabled

# Proxmox7以降
sudo python3 c6_state_check/ZenStates-Linux/zenstates.py -l
```
C6を無効化してみる

```sh
sudo python c6_state_check/ZenStates-Linux/zenstates.py --c6-disable
Disabling C6 state

# Proxmox7以降
sudo python3 c6_state_check/ZenStates-Linux/zenstates.py --c6-disable
Disabling C6 state
```

結果を確認。C6が無効化されている。

```sh
sudo python c6_state_check/ZenStates-Linux/zenstates.py -l
P0 - Enabled - FID = 80 - DID = 8 - VID = 32 - Ratio = 32.00 - vCore = 1.23750
P1 - Enabled - FID = 8C - DID = A - VID = 50 - Ratio = 28.00 - vCore = 1.05000
P2 - Enabled - FID = 7C - DID = 10 - VID = 68 - Ratio = 15.50 - vCore = 0.90000
P3 - Disabled
P4 - Disabled
P5 - Disabled
P6 - Disabled
P7 - Disabled
C6 State - Package - Disabled
C6 State - Core - Disabled

# Proxmox7以降
sudo python3 c6_state_check/ZenStates-Linux/zenstates.py -l
```

全くキレイなやり方ではないが、cronに入れて起動時に設定されるようにする。

```sh
crontab -e

# 一番最後の行に以下追記
@reboot sudo python c6_state_check/ZenStates-Linux/zenstates.py --c6-disable

# Proxmox7以降
@reboot sudo python3 c6_state_check/ZenStates-Linux/zenstates.py --c6-disable
```

# 最後に
マザーボードの蟹NIC用ドライバーが不安定なため、サーバーが機能しなくなることが度々あった。PCI Passthroughを行っていたため現象を把握しにくかった。

蟹NICを直した話

https://qiita.com/disksystem/items/5fb4c7af756214d10d6f

PCI Passthroughを行うとGPU(Geforce GTX1050Ti)は仮想マシンが持っていってしまう。購入したRyzenにはGPU機能がないためモニターが映らない状態だった。
ProxmoxVEはWeb上のコンソールで管理できるはず…だったのだが、NICが倒れてしまうとお手上げ。

GPU付きのIntelのほうが苦労しなかったかもしれない。