y_seto
2025年5月27日 16時37分
==========
製品型番:
Debian/ABOSバージョン:3.20.3-at.7
カーネルバージョン:Linux armadillo 5.10.232-0-at #1-Alpine SMP PREEMPT Fri Dec 20 06:51:53 UTC 2024 aarch64 Linux
3G/LTE モジュール情報 (Debianのみ):
その他:
==========
ethtoolを使ってeth0とeth1の設定を見ていたらpause from useの設定が異なっていることに気付いた
eth0:
Supported pause frame use: Symmetric
Advertised pause frame use: Symmetric
Link partner advertised pause frame use: Symmetric Receive-only
eth1:
Supported pause frame use: Symmetric Receive-only
Advertised pause frame use: Symmetric Receive-only
Link partner advertised pause frame use: Symmetric Receive-only
eth0の受信が若干遅く(1msほど)pause from useをeth1に合わせたいのですが、
コンテナ上でethtoolを使って設定を変えようとすると
netlink error: Operation not permitted
と表示され設定変更ができません。
ABOS WebのEth詳細設定でもpuase from useの項目が見つからず
設定の方法がわからない状態です。
設定方法についてご教授お願い致します。
コメント
y_seto
at_makoto.sato
佐藤です。
すいません。最初の質問を読み違えておりました。
> eth0:
> Supported pause frame use: Symmetric
> eth1:
> Supported pause frame use: Symmetric Receive-only
この表示は、これらのインターフェース(eth0/eth1)が対応している設定を並べたものであり、
現在この設定がされているというのを表すものではありません。
実際の設定値を表示すると
ethtool -a eth0
と
ethtool -a eth1
の表示結果は同じになると思います。
y_seto
佐藤様
ご回答ありがとうございます。
> 実際の設定値を表示すると
> ethtool -a eth0
> と
> ethtool -a eth1
> の表示結果は同じになると思います。
アドバイス頂いたコマンドを実行しました。
設定値は同じですが、詳細の違いがわからない状態です。
> > eth0:
> > Supported pause frame use: Symmetric
>
> > eth1:
> > Supported pause frame use: Symmetric Receive-only
> この表示は、これらのインターフェース(eth0/eth1)が対応している設定を並べたものであり、
> 現在この設定がされているというのを表すものではありません。
元々eth0とeth1で対応している設定が違うものだという認識でしょうか。
参考としてethtool eth0/1/2を実行した結果も添付します。
(eth2はUSB-LANで追加したものになります)
※質問の背景として
eth0-eth2,eth1-eth2においてEthにおけるゲートウェイプログラムを作成して動作させたところ
eth0→eth2がeth2→eth0より1msほど遅延が大きくなっており
また、eth1→eth2、eth2→eth1、eth2→eth0の遅延量は同程度になります。
eth0が入力側になる場合だけ遅延量が増える原因を探っていたところ、「pause fram use」の内容が異なっているため、
他のポートと設定を合わせて評価がしたく、設定変更の方法を相談させて頂いたという経緯になります。
ファイル | ファイルの説明 |
---|---|
Armadillo_eth0-1_ethtool-a.png | ethtool -aで確認したeth0,eth1の設定値 |
ethtool_eth0.png | ethtool eth0の結果:Supported pause frame useなどが Symmetric |
ethtool_eth1.png | ethtool eth1の結果:Supported pause frame useなどが Symmetric Receive-only |
ethtool_eth2(USB-LAN).png | ethtool eth2の結果:Supported pause frame useなどが No |
at_dominique.m…
マルティネです。
よこから失礼します
> > この表示は、これらのインターフェース(eth0/eth1)が対応している設定を並べたものであり、
> > 現在この設定がされているというのを表すものではありません。
>
> 元々eth0とeth1で対応している設定が違うものだという認識でしょうか。
設定の違いではなく、「Supported」はこのインタフェースで対応している設定の話ですね。
autoneg を無効化しても、eth0 で pause frame を tx off/rx on にすることはできません(一方、eth1 では tx on/rx on と tx off/rx on は対応できますので、「receive-onlyの設定も可能」ということになります。
> ※質問の背景として
> eth0-eth2,eth1-eth2においてEthにおけるゲートウェイプログラムを作成して動作させたところ
> eth0→eth2がeth2→eth0より1msほど遅延が大きくなっており
> また、eth1→eth2、eth2→eth1、eth2→eth0の遅延量は同程度になります。
> eth0が入力側になる場合だけ遅延量が増える原因を探っていたところ、「pause fram use」の内容が異なっているため、
> 他のポートと設定を合わせて評価がしたく、設定変更の方法を相談させて頂いたという経緯になります。
背景の説明、ありがとうございます。
Armadillo IoT G4 を評価した時に bandwidth/pps の問題はなかったが、改めて latency を確認したら eth0 はやや遅いですね。
私からも余計な説明を一つさせてください。
pause frame というのは、ethernet においてあるデバイスのバッファーが full になった場合に「次のメッセージを送るまで少し待って」と相手機器に送る機能ですので、idle 状態で ping を送る程度では関係のない機能です。
確認のため完全に無効化してみてもいいですが、そこでは差は出ないはずです。
Armadillo IoT G4 では eth0 と eth1 は違うドライバーを使ってますのでざんねんながらそういう差は出てしまいます…
1ms は確かに長いので頑張れば改善はできるかもしれませんが、こう言う設定ではなく irq の処理周りから確認した方がいいかと思います(例えば複数のパケットを同時に処理するために少し待ってる実装はよくありますので、そういうドライバーで異なる設定もあります)
そういう場合はバランスが必要ですので(時間を短くするとCPU負担が上がる等)、お手数ですがご確認ください。
よろしくお願いします
y_seto
マルティネ様
ご回答ありがとうございます。
> Armadillo IoT G4 では eth0 と eth1 は違うドライバーを使ってますのでざんねんながらそういう差は出てしまいます…
> 1ms は確かに長いので頑張れば改善はできるかもしれませんが、こう言う設定ではなく irq の処理周りから確認した方がいいかと思います(例えば複数のパケットを同時に処理するために少し待ってる実装はよくありますので、そういうドライバーで異なる設定もあります)
> そういう場合はバランスが必要ですので(時間を短くするとCPU負担が上がる等)、お手数ですがご確認ください。
ドライバーの差が影響しているのですね。承知致しました。
irqの処理周りの設定について、もう少し詳しく説明頂けないでしょうか。
特にドライバ処理の部分を確認する方法などあれば助かります。
at_dominique.m…
マルティネです。
> ドライバーの差が影響しているのですね。承知致しました。
> irqの処理周りの設定について、もう少し詳しく説明頂けないでしょうか。
> 特にドライバ処理の部分を確認する方法などあれば助かります。
確認してみたら「普通」のことしかやってないので、ドライバの差でデフォルトの値が変わるだけですね。
armadillo:/proc# ethtool -c eth0 | grep -A 1 rx-usecs: rx-usecs: 1000 rx-frames: 200 armadillo:/proc# ethtool -c eth1 | grep -A 1 rx-usecs: rx-usecs: 153 rx-frames: 0
試しに ethtool -C eth0 rx-usec 150
で eth0 の rx coalescing のタイミングを下げたら eth0 でも ~0.4ms 程度で ping を応答するようになりました。
永続化ですが、ethtool をコンテナ起動時に実行してもいいですが、NetworkManager からも設定可能です。
help 表示でオプションとして出てませんので abos-web の詳細表示で確認できませんが、ethtool の設定もだいたい変更可能です。
(設定変更な値は https://networkmanager.dev/docs/api/1.44/nm-settings-nmcli.html#:~:text… を参考ください)
# 設定 armadillo:~# nmcli c mod 'Wired connection 1' ethtool.coalesce-rx-usecs 200 # 設定確認 armadillo:~# nmcli c up 'Wired connection 1' Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5) armadillo:~# ethtool -c eth0 | grep -A 1 rx-usecs: rx-usecs: 200 rx-frames: 200 # 永続化 armadillo:~# persist_file -rv /etc/NetworkManager/system-connections/Wired\ connection\ 1.nmconnection '/mnt/etc/NetworkManager/system-connections/Wired connection 1.nmconnection' -> '/target/etc/NetworkManager/system-connections/Wired connection 1.nmconnection'
よろしくお願いします
y_seto
マルティネ様
ご回答ありがとうございます。
下記の設定コマンドにて設定変更できました。
変更してGW遅延を確認したところ、0.4ms程度まで改善しました。
>
> # 永続化
> armadillo:~# persist_file -rv /etc/NetworkManager/system-connections/Wired\ connection\ 1.nmconnection
> '/mnt/etc/NetworkManager/system-connections/Wired connection 1.nmconnection' -> '/target/etc/NetworkManager/system-connections/Wired connection 1.nmconnection'
>
>
> よろしくお願いします
永続化コマンドがうまくいっていないのですが、
電源ON/OFFを繰り返したり、rebootしても
ethtool -c eth0で確認したrx-usecsが200になっているので永続化もできているのではないかと思います。
ありがとうございました。
【ご参考】
以下、永続化コマンド実行時のエラー
-sh: can't create /target/etc/NetworkManager/system-connections/Wired connection 1.nmconnection: nonexistent directory # targetにmkdirで/target/etc/NetworkManager/system-connections/を作成後に再度永続化コマンド実行 Warning: some files do not exist and were skipped: /mnt/etc/NetworkManager/system-connections/Wired connection 1.nmconnection - removed '/target/etc/NetworkManager/system-connections/Wired connection 1.nmconnection' '/mnt/etc/NetworkManager/system-connections/Wired connection 1.nmconnection' -> '/target/etc/NetworkManager/system-connections/Wired connection 1.nmconnection'
y_seto
at_dominique.m…
> eth0とeth1のrx-usecs、rx-frames、tx-usecs、tx-framesの初期設定値に意図や根拠はあるのでしょうか。
> (ドライバの推奨値とかでしょうか?)
>
> 設定値が異なっているのはなぜか理由が知りたいです。
確認は最後までしてないので間違ってるかもしれませんが、 eth0 の 1000/200/1000/200 は linux のデフォルト値だと思います。
eth1 の場合はドライバー側で低くしています。
eth1 の drivers/net/ethernet/stmicro/stmmac/ を軽く読んだところ receive interrupt watchdog (riwt) を使ってるみたいで、irq 一つ分の処理が長くなると不具合として認識されますのであえて間隔を短くしているようです。
(実際に eth1 で rx-usecs 1000 を設定しようとしてもエラーします)
tx-frames の方は特に何も書いてないですがこれも stmmac で最大値を下げてます。
一般的な話としてはそれらの設定を短くすると latency (ping時間)が下がって、パッケット多い時に CPU 負担が上がって throughput/pps が下がります。
自分はデフォルトでいいと考えていますが、latency が重要な場合は設定を下げていいと思います。
よろしくお願いします。
y_seto
at_makoto.sato
2025年5月27日 17時46分
佐藤です。
設定をコンテナ上から実行したいのであれば、
ホスト(armadillo)側に、設定するコマンドを書いたシェルスクリプトを用意し、
コンテナ上からはRest APIでそのシェルスクリプトを実行するという方法になるかと思います。
Rest API については以下を参照してください。
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
カスタムスクリプト実行については以下を参照してください。
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…