crawler_JVM_DNS_在爬虫中的应用
DNS解析:即由域名 經(jīng)過(guò)dns解析,跳轉(zhuǎn)到真正服務(wù)器的地址,這個(gè)重復(fù)解析的耗時(shí)占請(qǐng)求很大比例。 在設(shè)計(jì)爬蟲時(shí)比較細(xì)粒度的控制下,需要考慮dns解析。 jdk從1.5往后對(duì)dns緩存有默認(rèn)設(shè)置,
詳見jdk源碼,不過(guò)有部分細(xì)節(jié)還是需要自己去處理的。
JAVA本身對(duì)DNS的緩存時(shí)間是多久?
對(duì)于爬蟲DNS解析耗時(shí)的疑問(wèn),第一反應(yīng)Google之,大致有兩種說(shuō)法:
第1種:默認(rèn)情況下networkaddress.cache.ttl=-1,代表永久緩存(配置文件路徑: JAVA_HOME/jre/lib/security/java.security),就是在應(yīng)用啟動(dòng)之后第一次DNS 解析成功的結(jié)果會(huì)一直cache到應(yīng)用停止。顯然在域名對(duì)應(yīng)的IP有變更的時(shí)候,如果不重啟應(yīng)用就會(huì)造成故障。有部分同事以前也做過(guò)相關(guān)測(cè)試,認(rèn)同這種說(shuō)法。
第2種:jdk1.5和1.5之前的版本默認(rèn)DNS 緩存時(shí)間是永久緩存,jdk 1.6以后與security manager策略有關(guān),如果沒有啟用security manager ,默認(rèn)DNS 緩存時(shí)間30秒。策略配置文件:JAVA_HOME/jre/lib/security/java.policy
測(cè)試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 // 當(dāng)緩存時(shí)間為 0時(shí),在一百次訪問(wèn)www.baidu.com 都有耗時(shí)情況【未考慮操作系統(tǒng)緩存】 25 // 當(dāng)緩存時(shí)間為 10時(shí),在一百次訪問(wèn)www.baidu.com ,只有第一次耗時(shí),后99次不消耗dns查找時(shí)間 26 // 如果不設(shè)置 networkaddress.cache.ttl,默認(rèn)為-1 27 // ,只有第一次耗時(shí),后99次不消耗dns查找時(shí)間【后多少次都不在耗時(shí),直至JVM重啟】 28 } 29 }默認(rèn)JVM會(huì)緩存每一次DNS的查詢結(jié)果,并且使緩存結(jié)果永遠(yuǎn)有效,直到你對(duì)該JVM重啟為止。有時(shí)候業(yè)務(wù)需要系統(tǒng)能對(duì)域名切換及時(shí)而自動(dòng)進(jìn)行切換。這時(shí)候你就需要禁用或調(diào)整JVM的DNS緩存機(jī)制。
在獨(dú)立運(yùn)行程序中(非容器環(huán)境),可以在應(yīng)用啟動(dòng)的時(shí)候通過(guò)以下代碼完成:
| ??? ???? //設(shè)置解析成功的域名記錄JVM中緩存的有效時(shí)間,JVM默認(rèn)是永遠(yuǎn)有效,這樣一來(lái)域名IP重定向必須重啟JVM,這里修改為3秒鐘有效,0表示禁止緩存,-1表示永遠(yuǎn)有效 ?? ??? ?Security.setProperty("networkaddress.cache.ttl", "3");
|
代碼中設(shè)置“networkaddress.cache.ttl”值的方式只適用于非容器環(huán)境,當(dāng)應(yīng)用部署與resin等容器中時(shí)該設(shè)置控制不了JVM的行為。可行的辦法是通過(guò)在容器的啟動(dòng)參數(shù)中設(shè)置JDK系統(tǒng)變量“sun.net.inetaddr.ttl“或“sun.net.inetaddr.negative.ttl”,該參數(shù)跟“networkaddress.cache.ttl”和“networkaddress.cache.negative.ttl”的值定義一樣,只是一個(gè)用于命令行,一個(gè)用于程序內(nèi)部。具體操作方法:
修改httpd.sh,在"args="選項(xiàng)添加參數(shù),如:-Dsun.net.inetaddr.ttl=0 如果非Resin容器的Java應(yīng)用中同時(shí)配置了命令參數(shù)“sun.net.inetaddr.ttl”和Security屬性“networkaddress.cache.ttl”,那么會(huì)以Security屬性的設(shè)置為準(zhǔn)。 結(jié)論: 方法一: 設(shè)置jvm參數(shù),制定緩存有效期 方法二:硬編碼 ,java.security.Security.setProperty("networkaddress.cache.ttl",cacheTime); 設(shè)置有效期。
一般情況下我們不需要完全取消JVM的DNS緩存,只需要調(diào)小有效時(shí)間,經(jīng)過(guò)一些測(cè)試發(fā)現(xiàn)一下結(jié)論:
1)1個(gè)域名對(duì)應(yīng)一個(gè)IP和一個(gè)域名對(duì)應(yīng)12個(gè)IP,DNS查詢響應(yīng)時(shí)間差別極少,后者占用cpu稍高一點(diǎn)點(diǎn);
2)在高并發(fā)時(shí),不做DNS緩存時(shí)的CPU耗用比做了3s緩存的CPU耗用要高3/4倍,實(shí)時(shí)DNS請(qǐng)求相當(dāng)耗用CPU;
3)3s和30s緩存有效時(shí)間對(duì)dns查詢響應(yīng)時(shí)間的影響差別不大,cpu內(nèi)存占用都比較接近;
4)建議使用3秒緩存,兼顧運(yùn)維和性能,對(duì)于不常改動(dòng)指向ip的域名,可以設(shè)置時(shí)間更長(zhǎng) ,以提高性能。
?
轉(zhuǎn)載于:https://www.cnblogs.com/cphmvp/p/3605580.html
總結(jié)
以上是生活随笔為你收集整理的crawler_JVM_DNS_在爬虫中的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c#学习路线应该靠谱
- 下一篇: JsonWriter使用