RTX1200でネットワークリソースの可視化(その2)

RTX1200をLua拡張してサーバ死活監視とネットワークリソースの可視化 - Mi’s blog の続き.Luaスクリプトを走らせるとルータの調子が悪くなったので,別の方法を考えた.

RTX1200でLuaを走らせると動作が不安定になる

ググっても似たような症例がヒットしなかったのでここにまとめておく. YamahaはLuaスクリプトの動作を保証しておらず,サポートへの問い合わせは無理そうな雰囲気. (そもそも現段階では,スクリプトの記述に問題があるのかファームウェアのバグなのか切り分け出来ておらず,どのみちサポートに投げるのは迷惑な話)
YAMAHA - Luaスクリプトのサポートについて

切り分けは気が向いたらやると思う.

メモリリークっぽい?

先の記事で作成したLuaスクリプトを数日間走らせた結果,RTX1200は2回(実際はそれ以上)ハングアップしている. このときインターネット接続はもちろん,VLAN間ルーティングもままならず,ステータスを確認しようにもtelnet接続を受け付けないし(というかping応答がない),コンソール接続してもプロンプトが戻ってこない. 回復手段は電源スイッチをON/OFFして強制再起動する以外なく,再起動すれば当然PPPセッション張り直しでIPが変わりDNSとかVPNで面倒が生じる. これはひどい.

薄くなっていしまっているが,画像中に赤い矩形で強調している部分がある. このタイミングで強制再起動を実行している. 矩形箇所周辺を拡大した次の2枚の画像を確認して欲しい.

1枚目の画像は3時15分頃からハングアップ,2枚目の画像は18時50分頃からハングアップしている. ハングアップ中はネットワーク周辺のメトリクス(帯域使用状況と死活監視結果)が送られてこないので,グラフからすぐに判断がつけられる. RADIUSサーバやDNSサーバが死んでるようなグラフになっているが,実際はピンピンしており,「死んでいるのはお前だ!」というオチ.

2回の(すべての)ハングアップでは,再起動直後で

  • CPU使用率
  • メモリ使用率

のグラフ形状が顕著に変化している.

この時刻はほとんどトラフィックが流れていないので,ルータはアイドル状態である. にもかかわらずCPU使用率は短期的(5秒平均)にギザギザとフラッピングし,長期的(5分平均)に30%近い高負荷を記録している.
メモリ使用率も,Luaスクリプトを走らせていない場合はアイドル状態で25%程度に安定しているが,Luaスクリプトを走らせた途端じわじわと上昇し続け,毎度50%近くまで来たところでハングアップする. メモリ使用率の増加率はほぼ一定で,そのためLuaスクリプト実行からハングアップまではいつも決まって約42時間. 2日も経たず再起動では使い物にならない.

ハングアップ時の環境を再現するため,ルータのconfigを下記にて公開してある. https://dev.mi2428.net/var/tmp/rtx1200-lua-hungup.config.txt

Python製スクリプトに切り替えた

Luaを使ったアクティブなメトリクス監視ができなくなったので,Pythonを使ったパッシブなメトリクス監視に切り替えた.

GitHub - mi2428/rtx1200-network-visualization

telnetlibを使いコマンドごとにtelnet接続を行っている (一見無駄に思えるが,Python側で長期間セッションを握られるとルータ管理時に支障が出るので,こっちのほうが良い).
インフラはDockerで完結,リポジトリにはJSONでエクスポートしたGrafanaのダッシュボード設定が含まれているので,新しいホストでもすぐに監視を開始できる.

% git clone https://github.com/mi2428/rtx1200-network-visualization
% cd rtx1200-network-visualization
% nvim docker-compose.yml
    # スクリプトが読み込む環境変数の設定(3行書き換えればOK)
    # - ROUTER_IP_ADDRESS=[ルータのIPアドレス(telnetログインが許可されているセグメント)]
    # - ROUTER_LOGIN_PASSWORD=[ルータのログインパスワード]
    # - ROUTER_PROMPT=[ルータのプロンプト]
% docker-compose up --build -d

Dockerコンテナが稼働しているホストの3000番にHTTPで接続,初期パスワードはadmin/changeme
続いてInfluxDBのデータベースenvironmentnatdhcppp1lan1をデータソースに追加.


あとはダッシュボードをインポートして,各グラフのPanelDataSourceを今追加したデータソースに設定しなおしていくだけ. (ほんとはDataSoucesも含めたエクスポートがしたかったけど無理みたい.ちょっと残念)