背景
ことの発端はnetdataをインストールしようとした際にどうしてもタイムアウトエラーが発生してしまったこと。
$ sudo /usr/sbin/netdatacli reload-claiming-state
Netdata Agent is not claimed to Netdata Cloud: Request failed with error: Timeout was reached (proxy is set to 'env')
試しにcurlコマンドでnetdataのClaim URL
にアクセスしようとすると、最初の"resolved"が出力されるまで5秒ほど、全体で6秒ほどの時間がかかる。
$ curl https://app.netdata.cloud -v -o /dev/null -s
* Host app.netdata.cloud:443 was resolved. # この行が出力されるまで5秒くらいかかる
* IPv6: 2600:1f18:428d:5e00::80, 2600:1f18:428d:5e01::80, 2600:1f18:428d:5e02::80
* IPv4: 54.198.178.11, 44.207.131.212, 44.196.50.41
* Trying 54.198.178.11:443...
digやnslookupコマンドで名前解決のみを試しても時間はかからない。
$ dig app.netdata.cloud
$ nslookup app.netdata.cloud
glibcのDNS解決が競合する問題について
この場合以下のglibcの問題であることが疑われる。
ChatGPTによる説明:
glibc
のDNSリゾルバは、IPv4とIPv6のアドレスを並行してリクエストすることがあります(getaddrinfo()
関数がその典型例)。- 並行リクエストを行う際、一部の古いルーターやDNSサーバーでは、IPv4とIPv6のリクエストを同じソケットで処理できず、リクエストがタイムアウトすることがあります。
- この問題により、DNS解決が遅延したり、失敗することがあります。
以下のコマンドを順番に試すことで再現できる。 もし3番目のコマンドのみ時間がかかる場合はおそらくこれが原因。
$ getent ahostsv4 example.com
$ getent ahostsv6 example.com
$ getent ahosts example.com
その他の影響
- apt update, apt installにやたら時間がかかる
- 外部へのリクエストが必要なコマンドでタイムアウトエラーが発生する
修正方法
options single-request-reopen
を/etc/resolv.conf
に追記する。
確認
自分の環境では保存後すぐに以下のコマンドの応答が高速で帰ってくることを確認できた。
getent ahosts example.com