Slow-DNS-Lookup問題:預設啟用了 ipv6-dns-lookup 以至於必須等待逾時

來源:互聯網
上載者:User
@鄭昀匯總

 

一. 現象:Java HttpClient 從主站機房發起對××××的 open.×××.com 網域名稱下 WebService 介面的 HTTP 要求,極其緩慢。經排查: 1.1. wget 實測結果不指定 IP協議,wget 訪問它的介面,時間為 4.163 秒,基本浪費在解析主機的過程上。如指定 wget 的 IP協議為IPV4,wget 測試則僅需 0.096 秒。 1.2. wget  對比測試:不指定IP協議,wget 訪問另一個電商的介面,時間為 0.798 秒。 1.3. dig  解析  open.×××.com 發現在解析 open.×××.com 的時候,會 CNAME 到一個全域變數中,再由這個全域變數選擇最優的線路提供訪問。  二. 有可能導致 Slow-DNS-Resolution 的原因:1) 瀏覽器對××××的介面瀏覽快,不能證明什麼。譬如Firefox預設禁用了 ipv6 dns lookup: 2)Ubuntu 從 10.4 開始引入一個問題:作業系統預設啟用了 ipv6,導致一些應用程式發出 HTTP 要求時,在 ipv4 介入之前,總是先等待 ipv6 DNS lookup 逾時(常有人報告需約30秒),這也是一個 DNS lookup 過程緩慢的常見原因。 3)也有人報告:『某一天營運部宣告公司網路已經全部 enable IPv6 了,在此之後在使用 php 的 curl 函數或使用 Linux 下的 wget 訪問一個內部網域名稱時,均發現需要等待大概 5 秒才能得到結果。原因是,沒有為這個網域名稱綁定一個 IPv6 的地址,wget 時必須等 ipv6 DNS lookup 逾時。現在很多伺服器都開啟了 IPv6 卻沒有路由,無法真正工作,反而導致一些不可預料的問題。』 總之,此事應該與 ipv6-dns-lookup 有關。  三. 原因:××××在網路接入裝置上做了調整,解決了問題。原因:1)××××使用了 F5 的 GTM 裝置(GSLB,全域負載平衡),即我們常說的智能DNS。2)它把  需要讓不同地區使用者訪問不同IDC節點的網域名稱 通過 F5 的 GTM 來做解析。3)可能它的裝置預設啟用了 ipv6,但對於不同網域名稱卻又沒有配置 ipv6 地址。  四. ipv6-dns-lookup 背景知識: 4.1. Java 平台下 ipv6 是如何工作的?並非所有作業系統都支援 ipv6 協議,即使 Java networking stack 優先嘗試檢測它,並在發現可用時透明地使用它,也還可以利用系統屬性禁用它。在 ipv6 不可用或被顯式禁用的情況下,Inet6Address 對大多數網路連接操作都不再是有效參數。引自 javase 的 ipv6 guide 文檔:『第一步, Java networking stack 先確認底層作業系統是否支援 ipv6。如果支援 ipv6 ,Java 將嘗試使用  ipv6 stack。第二步,在 雙堆棧(dual-stack,指ipv4 stack+ipv6 stack)系統上,將建立一個 ipv6 socket。在  separate-stack 系統上,事情要複雜得多,Java 將建立兩個 socket,一個給 ipv4 一個給 ipv6。第三步,對於用戶端 TCP 應用,一旦 socket 連上了,那   internet-protocol family type 就固定了,多餘的那個 socket 就關閉了。對於伺服器端 TCP 應用,由於不知道下一個用戶端請求用什麼 ip family type,所以這兩個 sockets 將繼續保留。對於 UDP 應用,這兩個 sockets 始終都需要保留。』  4.2. ipv6 相關的系統參數系統有兩個參數:1)首選的 協議棧:ipv4還是ipv6;2)首選的 地址族(address family type):inet4 還是 inet6。 4.2.1. 協議棧由於在一個雙堆棧系統上, ipv6 socket 能與 ipv4 和 ipv6 對端互動,所以  ipv6 stack 是預設喜好設定。你可以通過如下系統參數修改配置: java.net.preferIPv4Stack=<true|false>對應的 java 代碼是:java.lang.System.setProperty("java.net.preferIPv4Stack", "true"); 4.2.2. 地址族預設我們首選 ipv4 地址族。你可以通過如下系統參數修改配置: java.net.preferIPv6Addresses=<true|false>對應的 java 代碼是:java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");  4.3. Linux 上禁用 ipv6 的辦法:

Edit /etc/sysconfig/network. (A reboot will be required)
# vi /etc/sysconfig/network

Change:
NETWORKING_IPV6=yes

To:
NETWORKING_IPV6=no
Disable IPv6 Protocol Stack for Kernel
禁止IPV6的核心模組

Edit /etc/modprobe.conf.
# vi/etc/modprobe.conf

Add the following 2 lines: (A reboot will be required)
alias net-pf-10 off
alias ipv6 off

 

4.4. F5 上 ipv6 相關設定:據說,通過如下命令可以設定 BIG-IP 禁用 ipv6 :bigpipe db Ipv6.Enabled falsebigpipe save all BIG-IP 與 ipv6 有關的參數預設值如下所示:Ipv6.Enabled = true
Ipv6.Nbr.DelayTime = 1
Ipv6.Nbr.IncompleteTimeout = 5
Ipv6.Nbr.MaxEntries = 2048
Ipv6.Nbr.ReachableTimeout = 30
Ipv6.Nbr.ReapTimeout = 3600
Ipv6.Nbr.Retries = 2  附錄A:wget 的 IPV4和IPV6輸入選項:‘-4’‘--inet4-only’‘-6’‘--inet6-only’Force connecting to IPv4 or IPv6 addresses. With ‘--inet4-only’ or ‘-4’, Wget will only connect to IPv4 hosts, ignoring AAAA records in DNS, and refusing to connect to IPv6 addresses specified in URLs. Conversely, with ‘--inet6-only’ or ‘-6’, Wget will only connect to IPv6 hosts and ignore A records and IPv4 addresses.        
參考資源:1)2012,curl_exec和wget執行太慢,IPv6惹的禍

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.