IPv6の名前解決が遅い(ことがある)

はじめまして、モバイルソリューション事業部の望月です。Railsでモバイルアプリのバックエンド開発をやっています。

春になり出会いの季節ですね。名前を覚えるのが苦手な自分にはつらい季節です。ありがたいことに弊社弊部にも新人の入社があり、幸いにも覚えるのが苦ではない人数であったため何とかなりました。

今日はそんな名前解決(?)にまつわるエピソードです。

外部サービスのAPIが遅い


とある案件でモバイルアプリ用のAPIをRailsで開発していたときの話です。そのモバイルアプリではとあるサービスのSDKを利用していたのですが、そのSDKで度々エラーが発生していて主要な機能が利用できないといったことが起きていました。

事象としては、モバイルアプリ上で特定の操作を行った際にSDKがコールバック先のURLにリクエストを送り、5秒以内に応答がなくタイムアウトエラーになるというものです。

コールバックのリクエストをRailsで受けて外部サービスの提供するAPIからのレスポンスデータを使って応答を行っていましたが、Railsの処理はDBアクセスがあるものの薄い処理となっているため、③のAPIのレスポンスが遅いものと思い調査を始めました。

スクリーンショット 2018-04-20 12.40.58.png

実はIPv6の名前解決が遅かった


APIへのリクエストにはfaradayfaraday_middlewareを使っていたためドキュメントを参考にレスポンスタイム(前図の②と③)をログに出力してみましたが、いずれも数ms程度で応答されておりAPIが原因ではありませんでした

アプリケーションの実装で遅くなりそうな箇所がやはり思い当たらないため、リクエストの前提となる名前解決に問題があるのではと思いtcpdumpでログを出力してみました。するとIPv6の名前解決が遅くタイムアウトの末にリトライが行われていることが分かりました。

(AAAAレコードの取得がタイムアウトになり再度リクエストが行われているログ)

11:01:42.081559 IP 1.1.1.1.51266 > dummy.jp.domain: 64983+ A? api.service.com. (38)
11:01:42.082310 IP dummy.jp.domain > 1.1.1.1.51266: 64983 2/3/3 CNAME cname.api.service.com., A 2.2.2.2 (187)
11:01:42.082431 IP 1.1.1.1.33833 > dummy.jp.domain: 21547+ AAAA? api.service.com. (38)
11:01:47.085722 IP 1.1.1.1.33833 > dummy.jp.domain: 64983+ A? api.service.com. (38)
11:01:47.086453 IP dummy.jp.domain > 1.1.1.1.33833: 64983 2/3/3 CNAME cname.api.service.com., A 2.2.2.2 (187)
11:01:47.086582 IP 1.1.1.1.58653 > dummy.jp.domain: 21547+ AAAA? api.service.com. (38)
11:01:48.634999 IP dummy.jp.domain > 1.1.1.1.58653: 21547 1/0/0 CNAME cname.api.service.com. (69)

この環境は先方が契約しているクラウドベンダーの環境であったためこの件について問い合わせを行いましたが、IPv6を無効化を検討してくださいとの回答でした。

IPv6を無効にするも改善しない


IPv6を無効化の設定を施してサーバーを再起動してみますが、IPv6の名前解決のリクエストが依然行われている状態でした。アプリケーション以外(curlなど)で名前解決を行うとIPv4の名前解決のみ行われるため、アプリケーションもしくはRubyの問題であると予想されます。

Rubyを再ビルドしてみることも考えましたが、サービスが稼働中のなかで安全に行える環境ではなかったため他の手段を探しました。

faradayのアダプタを取り替える


faradayにはhttpリクエストを行うためのアダプタを選択できる機能があり、最終的にtyphoeusというライブラリが提供しているアダプタに置き換えることでこの問題を解決しました。

選定理由としてはtyphoeusはlibcurlのラップした実装なため、curlで期待する動作が確認できていたこともあり効果があると踏んだためです。

まとめ


「IPv6の名前解決が遅いのでIPv6を無効化した」という話は調べてみると沢山ありましたが、単純に無効化しただけではダメだったというケースとして今回記事にしてみました。

faradayのようにアダプタを選択できる実装になっていると、利用者は安定したインターフェースを利用しながら内部の実装を取り替えられるので嬉しいですね。

でもIPv6の名前解決が早くなって同じ問題に悩む人がいなくなる方がもっと嬉しいですね!


この記事へのコメント