crawler_JVM_DNS_在爬虫中的应用
生活随笔
收集整理的這篇文章主要介紹了
crawler_JVM_DNS_在爬虫中的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DNS解析:即由域名 經過dns解析,跳轉到真正服務器的地址,這個重復解析的耗時占請求很大比例。 在設計爬蟲時比較細粒度的控制下,需要考慮dns解析。 jdk從1.5往后對dns緩存有默認設置,
詳見jdk源碼,不過有部分細節還是需要自己去處理的。
JAVA本身對DNS的緩存時間是多久?
對于爬蟲DNS解析耗時的疑問,第一反應Google之,大致有兩種說法:
第1種:默認情況下networkaddress.cache.ttl=-1,代表永久緩存(配置文件路徑: JAVA_HOME/jre/lib/security/java.security),就是在應用啟動之后第一次DNS 解析成功的結果會一直cache到應用停止。顯然在域名對應的IP有變更的時候,如果不重啟應用就會造成故障。有部分同事以前也做過相關測試,認同這種說法。
第2種:jdk1.5和1.5之前的版本默認DNS 緩存時間是永久緩存,jdk 1.6以后與security manager策略有關,如果沒有啟用security manager ,默認DNS 緩存時間30秒。策略配置文件:JAVA_HOME/jre/lib/security/java.policy
測試code
1 import java.net.InetAddress; 2 3 /** 4 * @declare: DNS緩存研究 <br> 5 * @author: cphmvp 6 * @version: 1.0 7 * @date: 2014-3-17下午5:37:07 8 */ 9 public class MyDNS { 10 // jvm dns緩存研究 11 public static void main(String[] args) throws Exception { 12 String hostName = "www.baidu.com"; 13 String cacheTime = "10"; 14 java.security.Security.setProperty("networkaddress.cache.ttl", 15 cacheTime); 16 for (int i = 0; i < 100; i++) { 17 long time = System.currentTimeMillis(); 18 InetAddress addresses1[] = InetAddress.getAllByName(hostName); 19 System.out.println("addresses1: " 20 + String.valueOf(System.currentTimeMillis() - time) + "毫秒"); 21 for (InetAddress address : addresses1) 22 System.out.println(address); 23 } 24 // 當緩存時間為 0時,在一百次訪問www.baidu.com 都有耗時情況【未考慮操作系統緩存】 25 // 當緩存時間為 10時,在一百次訪問www.baidu.com ,只有第一次耗時,后99次不消耗dns查找時間 26 // 如果不設置 networkaddress.cache.ttl,默認為-1 27 // ,只有第一次耗時,后99次不消耗dns查找時間【后多少次都不在耗時,直至JVM重啟】 28 } 29 }默認JVM會緩存每一次DNS的查詢結果,并且使緩存結果永遠有效,直到你對該JVM重啟為止。有時候業務需要系統能對域名切換及時而自動進行切換。這時候你就需要禁用或調整JVM的DNS緩存機制。
在獨立運行程序中(非容器環境),可以在應用啟動的時候通過以下代碼完成:
| ??? ???? //設置解析成功的域名記錄JVM中緩存的有效時間,JVM默認是永遠有效,這樣一來域名IP重定向必須重啟JVM,這里修改為3秒鐘有效,0表示禁止緩存,-1表示永遠有效 ?? ??? ?Security.setProperty("networkaddress.cache.ttl", "3");
|
代碼中設置“networkaddress.cache.ttl”值的方式只適用于非容器環境,當應用部署與resin等容器中時該設置控制不了JVM的行為。可行的辦法是通過在容器的啟動參數中設置JDK系統變量“sun.net.inetaddr.ttl“或“sun.net.inetaddr.negative.ttl”,該參數跟“networkaddress.cache.ttl”和“networkaddress.cache.negative.ttl”的值定義一樣,只是一個用于命令行,一個用于程序內部。具體操作方法:
修改httpd.sh,在"args="選項添加參數,如:-Dsun.net.inetaddr.ttl=0 如果非Resin容器的Java應用中同時配置了命令參數“sun.net.inetaddr.ttl”和Security屬性“networkaddress.cache.ttl”,那么會以Security屬性的設置為準。 結論: 方法一: 設置jvm參數,制定緩存有效期 方法二:硬編碼 ,java.security.Security.setProperty("networkaddress.cache.ttl",cacheTime); 設置有效期。
一般情況下我們不需要完全取消JVM的DNS緩存,只需要調小有效時間,經過一些測試發現一下結論:
1)1個域名對應一個IP和一個域名對應12個IP,DNS查詢響應時間差別極少,后者占用cpu稍高一點點;
2)在高并發時,不做DNS緩存時的CPU耗用比做了3s緩存的CPU耗用要高3/4倍,實時DNS請求相當耗用CPU;
3)3s和30s緩存有效時間對dns查詢響應時間的影響差別不大,cpu內存占用都比較接近;
4)建議使用3秒緩存,兼顧運維和性能,對于不常改動指向ip的域名,可以設置時間更長 ,以提高性能。
?
轉載于:https://www.cnblogs.com/cphmvp/p/3605580.html
總結
以上是生活随笔為你收集整理的crawler_JVM_DNS_在爬虫中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#学习路线应该靠谱
- 下一篇: JsonWriter使用