曹耘豪的博客

JVM DNS缓存问题解决方式

在主机名解析为 IP 地址后,资源 IP 地址将保存在 JVM 的高速缓存中。如果改变了资源的 IP 地址,则需要重新启动应用服务器,使 Identity Manager 能够检测所做更改 (ID-3635)。这是 Sun JDK(1.3 及更高版本)中的设置,可以使用 sun.net.inetaddr.ttl 属性(通常在 jre/lib/security/java.security 中设置)控制。

设置解析成功的域名记录JVM中缓存的有效时间,JVM默认是永远有效,这样一来域名IP重定向必须重启JVM,这里修改为5秒钟有效,0表示禁止缓存,-1表示永远有效
java.security.Security.setProperty("networkaddress.cache.ttl", "5");

设置解析失败的域名记录JVM中缓存的有效时间,JVM默认是10秒,0表示禁止缓存,-1表示永远有效

java.security.Security.setProperty("networkaddress.cache.negative.ttl","2");

还有两种方式设置dns缓存

  1. 在 JAVA_OPTS 里设置

    1
    2
    -Dsun.net.inetaddr.ttl=3 
    -Dsun.net.inetaddr.negative.ttl=1
  2. 修改property

    1
    2
    System.setProperty("sun.net.inetaddr.ttl", "3");
    System.setProperty("sun.net.inetaddr.negative.ttl", "1");

一般情况下我们不需要完全取消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秒缓存,兼顾运维和性能;

参考文档:https://www.verisign.com/assets/stellent/030957.pdf

   / 
  ,