KUSONEKOの見る世界

CentOS 8 で r8168 のドライバに変更してみた

CentOS 8でもr8168のドライバに変更をしました。
以前と違い、今回はそこまで苦労しませんでした。

変更前のドライバ

r8169となっていますが、サーバに搭載されているNICはRTL8111Hでr8168が正しいものとなります。
ethtool -i enp2s0
driver: r8169
version: 2.3LK-NAPI
firmware-version: rtl8168h-2_0.0.2 02/26/15
expansion-rom-version:
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

ドライバの変更

コンパイルに必要な物をインストール
dnf install kernel-devel elfutils*
elfutilsが無い状態でmakeすると以下のエラーになりました。
Makefile:958: *** "Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel".  中止. 
ここから、『GBE Ethernet LINUX driver r8168 for kernel up to 4.15』をダウンロードし、/rootに配置します。
Eメールのアドレスを入力する必要があります。
tar vjxf r8168-8.047.04.tar.bz2
cd r8168-8.047.04
make
問題なく終わることが確認できたら、以下を実行。
./autorun.sh
SSHが切れ、しばらくたったら、再接続する。

変更後のドライバ

無事変更されました。
ethtool -i enp2s0
driver: r8168
version: 8.047.04-NAPI
firmware-version:
expansion-rom-version:
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

初期RAMDISKの再作成

再起動後も変更後のドライバが使用されるように、初期RAMDISKを新しくしておく。
↓起動時にr8169が選ばれないようにするため削除。
rm -f /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/r8169.ko.xz
↓再作成。
cd /boot/
mv initramfs-$(uname -r).img initramfs-$(uname -r).img.bak
dracut /boot/initramfs-$(uname -r).img

ドライバ変更の効果

正しいドライバを使用することで安定性が上がるそうです。
前後で違いがあるかiperf3を使用し、PC(Windows)からサーバに向けてパケットを投げてみました。
CentOS 8のiperf3は、dnfでインストールできます。
Windows用は、どこかで拾ってきました。

TCP速度測定

サーバ側
iperf3 -s
PC側
iperf3.exe -c サーバのIPアドレス

変更前

1回目
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.04  sec  1.10 GBytes   937 Mbits/sec                  receiver
2回目
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.04  sec  1.10 GBytes   939 Mbits/sec                  receiver

変更後

1回目
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.04  sec  1.10 GBytes   939 Mbits/sec                  receiver
2回目
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.04  sec  1.10 GBytes   938 Mbits/sec                  receiver
違いは見られません。

UDPロスト量測定

とりあえずたくさん送信するために、10G指定しています。
計測方法が正しいかはわかりません。
サーバ側
iperf3 -s
PC側
iperf3.exe -c サーバのIPアドレス -u -b 10G

変更前

1~5回目。
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.04  sec   832 MBytes   695 Mbits/sec  0.071 ms  0/106520 (0%)  receiver
[  5]   0.00-10.04  sec   837 MBytes   699 Mbits/sec  0.070 ms  153/107285 (0.14%)  receiver
[  5]   0.00-10.04  sec   834 MBytes   697 Mbits/sec  0.085 ms  2/106768 (0.0019%)  receiver
[  5]   0.00-10.04  sec   805 MBytes   672 Mbits/sec  0.076 ms  425/103429 (0.41%)  receiver
[  5]   0.00-10.04  sec   770 MBytes   644 Mbits/sec  0.106 ms  4/98587 (0.0041%)  receiver

変更後

1~5回目。
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.04  sec   771 MBytes   644 Mbits/sec  0.079 ms  1/98654 (0.001%)  receiver
[  5]   0.00-10.04  sec   771 MBytes   644 Mbits/sec  0.070 ms  24/98721 (0.024%)  receiver
[  5]   0.00-10.04  sec   821 MBytes   686 Mbits/sec  0.074 ms  1/105143 (0.00095%)  receiver
[  5]   0.00-10.04  sec   769 MBytes   643 Mbits/sec  0.076 ms  25/98507 (0.025%)  receiver
[  5]   0.00-10.04  sec   829 MBytes   693 Mbits/sec  0.055 ms  182/106309 (0.17%)  receiver
変更後のロスト量は減っているようですが、Transferが少ないため結果としては微妙です。
実際に効果があるかは分かりませんでした…。