問題
VPSに置いているシステムを自前のProxmoxクラスターのVM上に移行したところ、Webサーバーからごく稀に以下のエラーが発生するようになりました。
FetchError: request to https://xxxxxxxx/ failed, reason: connect ETIMEDOUT xxx.xxx.xxx.xxx:443undefined
このエラーはタイムアウトが発生していることを示しています。
このWebサーバーは外部連携をすることがあり、その外部連携先のURLから応答が得られないためタイムアウトが発生しているようでした。
最小構成・検証用のコードを作成して試験したところ、「50回に1回ほどの頻度で大きく遅延することがある」ことが分かりました。
システム
ハード
Proxmox: 8.3.2
CPU: AMD Ryzen 5700X
Mem: 128GB
VM
OS: Rocky Linux 8.10 (Cloud-image)
CPU: 1socket/1core x86-64-v3
Mem: 4GB
SSD: 10GB
プログラム
Node.js: v16 Latest
Express: v4.18.1
node-fetch: v2.6.7
変わったもの
前の環境から変わったのは、以下のようなものです。
・クラウド
・ハイパーバイザー(VPS管理 → proxmox)
・ハードウェア(CPU、メモリ)
・ネットワーク機器(民生用のルーターなどを使用している)
・VM
・OSのバージョン(Rocky 8.6 -> Rocky Linux 8.10)
・OSの設定・パッケージ(Xserver Default -> Rocky 公式 Cloudimage)
調べたこと
パケット取得
まず、問題が発生するまでパケットキャプチャを取得してみました。
すると、SYN リクエストを複数回実行後、サーバーがタイムアウトによるRSTを送り終了しているようでした。
パケットドロップが発生しているように見えました。
外部サイトからブロックされている
各WebサーバーがグローバルIPを持たなくなったため、まずはIPアドレスでブロックされていることを疑いました。
しかし、直後のリクエストは処理できていることから無関係と判断。
通常のブロックされた場合のメッセージとも違いました。
→ 無関係と判断
ハードウェアの変更
・CPUをHostに変更
・ネットワークインターフェースを変更
→問題発生
ネットワーク機器のログ調査
NEC UNIVERGE IX (ルーター) にてエラーパケットはありましたが、発生件数と整合性が合わず。
新規TCPコネクションの処理限界・コネクションテーブルの限界など疑うものののCPU使用率は関係なし。
該当機器(IX2105)は3000件/秒まで処理できるため、現システムの最大500件/秒程度のリクエストでは問題が発生するとは考えにくいと判断
→無関係?
Interface GigaEthernet1.2 is up
Fundamental MTU is 1500 octets
Current bandwidth 1G b/s, QoS is disabled
Datalink header cache type is ieee802.1q: 18/0 (standby/dynamic)
IPv4 subsystem connected, physical layer is up, 55d17h43m14s
ARP subsystem connected, physical layer is up, 55d17h43m14s
SNMP MIB-2:
ifIndex is 386
Logical INTERFACE:
Elapsed time after clear counters 55d18h14m43s
127228892 packets input, 51164940615 bytes, 0 errors
127221059 unicasts, 7833 non-unicasts, 120 unknown protos
0 drops, 0 misc errors
201467190 output requests, 126603274348 bytes, 5817 errors
201445601 unicasts, 21589 non-unicasts
82 overflows, 5735 neighbor unreachable, 0 misc errors
2 link-up detected, 1 link-down detected
node-fetchのバージョンを変える
外部通信を行うnode-fetchのバージョンを変えてみました。
→ 問題発生
node-fetchをaxiosに変更
node-fetchの問題を疑い、ソースコードを書き換えてaxiosに変更
→問題発生
OSを変える
OSの変更が原因を想定し、
Windows10のVMを作成し、そのVMからプログラムを実行してみました
→ 問題解消
OSかよ!と叫んでしまいました。
Rocky8.6を使用してみる
元々使用していたRocky8.6を使用してみることにしました。
→ 問題解消
どうやら本当にOS問題のようです。
node.jsのバージョンを変更
Node.jsのバージョンを v16 から v20 に変更
→ 問題解消
原因
謎です。
OS上の環境周りのようですが、何に引っかかっているのかは正直分かりませんでした。
node.jsのバージョンも現行システムは古いことから、OSのバージョンダウンではなく、Node.jsのバージョンアップにて対応しました。
パッケージが使用できないものもありましたが、個々調査してソースコードを修正しました。
この調査・対応に3日は取られました。。。
コメント