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");

         //设置解析失败的域名记录JVM中缓存的有效时间,JVM默认是10秒,0表示禁止缓存,-1表示永远有效
        Security.setProperty("networkaddress.cache.negative.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_在爬虫中的应用相关推荐

  1. 浅谈网络爬虫中广度优先算法和代码实现

    前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...

  2. python爬虫用urllib还是reques,python爬虫中urllib.request和requests有什么区别?

    在学习python爬虫,想要检索request相关内容时,往往会出现urllib.request和requests这两个词,urllib.request和requests都是python爬虫的模块,其 ...

  3. 爬虫中之Requests 模块的进阶

    requests进阶内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三" ...

  4. python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例

    生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开.同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令.但是鉴于我们实际运 ...

  5. 四、爬虫中的urllib库使用

    这篇介绍如何使用爬虫中的urllib库 小试牛刀 怎样扒网页呢? 其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HT ...

  6. python使用get和post方法_python爬虫中get和post方法介绍以及cookie作用

    首先确定你要爬取的目标网站的表单提交方式,可以通过开发者工具看到.这里推荐使用chrome. 这里我用163邮箱为例 打开工具后再Network中,在Name选中想要了解的网站,右侧headers里的 ...

  7. python爬虫多线程是什么意思_python爬虫中多线程的使用详解

    queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...

  8. python队列来做什么_python分布式爬虫中的消息队列是什么?

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  9. python爬虫框架怎么安装_celery如何在python爬虫中安装?

    在我们学习了不少关于celery框架的知识后,很多小伙伴已经想要正式使用celery了.这里小编也不知道大家安装好了celery没有~为了照顾一下动手能力不太强的python小白,小编把celery框 ...

最新文章

  1. Java文件删除操作File#delete()
  2. 传统配置形式存在的问题
  3. python 文件处理软件_Python —— 文件处理
  4. 谋求“同股不同权”,旷视赴港上市渐近
  5. SQL水平测试题目(一)
  6. php7 生成.so,centos8 php7 生成 openssl.so 文件执行make时报错:【已解决】
  7. Semantic Role Labeling (SRL)
  8. Linux系统zip压缩命令
  9. android配置jni cmake,Android JNI之青春期 Cmake(android studio)
  10. 网工解惑,子网掩码是什么以及子网掩码有哪些?
  11. 电子科技大学公开课:数字信号处理
  12. Symbol - 看似平凡的Symbol其实我们每天都在用 - 对象操作
  13. Precision, Recall, BLEU and ROUGE
  14. 网络安全笔记第四天day4(kali基本操作)
  15. 开源软件 | 一款深度学习抠图算法,图像精细分割利器
  16. U盘数据不见了怎么恢复?
  17. 2022年安全员-B证考试题及安全员-B证证考试
  18. 如何查看Linux磁盘类型
  19. javaweb应用的MVC分层,开发太方便了!!!
  20. Ubuntu应用---强制退出应用方法(kill 进程 或者 退出窗口)

热门文章

  1. 传输参数【JAX-WS入门系列】第06章_使用MTOM处理二进制文件
  2. uml -- unified modeling language 同一建模语言
  3. [转载] 杜拉拉升职记——20 两位同僚
  4. mongodb与mysql命令对比 (前人笔记+自己添加)
  5. overridePendingTransition
  6. Android---Activity 生命周期(三)Stopping Activity Restarting Activity
  7. 接口自动化测试系列(三):深入分析HTTP状态码400
  8. spring中bean的两种注入方式
  9. 这是一篇Markdown手册
  10. 2019年美国大学生数学建模竞赛(MCM/ICM) E题解题思路