自宅Linuxなどでcurlでの通信が異常に遅いときの対処方法

自宅Linuxなどでcurlでの通信が異常に遅いときの対処方法

Linuxでcurlコマンドを使った通信を行った際に、通信が異常に遅くなる(5秒以上かかる)ことがあります。

そこでここではRHEL互換のAlmaLinuxを例に、curlコマンドを使った通信が遅くなってしまう原因と対処方法を紹介します。

この記事は、以下の環境での動作結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
AlmaLinux9.4

cURLの通信が遅くなる原因

RHEL6系から名前解決において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そのものを無効化する方法も有効なようです。