Linuxでcurlコマンドを使った通信を行った際に、通信が異常に遅くなる(5秒以上かかる)ことがあります。
そこでここではRedHat互換のAlmaLinuxを例に、curlコマンドを使った通信が遅くなってしまう原因と対処方法を紹介します。
目次
cURLの通信が遅くなる原因
RedHat6系から名前解決においてIPv4のAレコードとIPv6のAAAAレコードは同一ソケットで問い合わせを⾏っており、名前解決時にAレコードとAAAAレコードの⼆つのレコードの結果が両⽅揃うまで待ち続けます。
ですが、家庭向けのブロードバンドルーターなどの中には、同一ソケットによる名前解決の問い合わせに対応してない場合があり、そのようなDNSサーバーへ名前解決を依頼すると、1つしかレコードの結果が返ってこないため、タイムアウトエラーが発生して、常に5秒の遅延が発⽣してしまいます。
対処方法
上の問題に対処する場合は、以下のコマンドでAレコードとAAAAレコードでそれぞれ別ソケットを使って名前解決を行うよう設定を追加します。
# nmcli con modify eth0 ipv4.dns-options single-request-reopen
コマンドを実行したら、設定を適用するためにネットワークインターフェースを再起動します。
# nmcli connection up eth0
設定が正しく追加されているかは、以下のコマンドで確認できます。
# nmcli con show eth0 | grep ipv4.dns-options
ipv4.dns-options : "single-request-reopen"
設定を既定値に戻すときは、以下ののコマンドを実行します。
# nmcli con modify eth0 -ipv4.dns-options single-request-reopen
あとがき
一般家庭用のブロードバンドルーターの中には、AレコードとAAAAレコードの同一ソケットによる問い合わせに対応してない機種もあるようなので、自宅Linuxなどでcurlによる通信が遅い場合には上に紹介した方法が役立つかもしれません。
なお未検証ですが、上に紹介した方法以外にもIPv6そのものを無効化する方法も有効なようです。