solrcloud环境下,本地solrj调试solr查询,发现查询速度特别慢,查1w条数据,耗时12389毫秒;
对比mysql数据库,查1w条数据,耗时2847毫秒;
solr竟然慢了近10秒!!!
追踪solr源代码,
Environment.logEnv("Client environment:", LOG);
这一行在zookeeper初始化的时候执行了,跟踪后发现这一行代码好使特别长,继续向下走,
org.apache.zookeeper.Environment这个类里面红色框里标识了耗时最大的代码。
问题出在了:InetAddress.getLocalHost().getCanonicalHostName(),
查询相关资料,并没有发现此方法执行特别慢的解决方法,而且这个方法并不是什么至关重要的地方(可能是自己功力不够),
先来个main方法,演示下此处耗时:
public static void outHostName(InetAddress address, String s) {
System.out.println("通过" + s + "创建InetAddress对象");
System.out.println("b:"+CusDateUtils.toDateTimeString());
System.out.println("主 机 名:" + address.getCanonicalHostName());
System.out.println("c:"+CusDateUtils.toDateTimeString());
System.out.println("主机别名:" + address.getHostName());
System.out.println("d:"+CusDateUtils.toDateTimeString());
}
public static void main(String[] args) throws Exception {
System.out.println("a:"+CusDateUtils.toDateTimeString());
outHostName(InetAddress.getLocalHost(), "getLocalHost方法");
// outHostName(InetAddress.getByName("www.ibm.com"), "www.ibm.com");
// outHostName(InetAddress.getByName("www.126.com"), "www.126.com");
// outHostName(InetAddress.getByName("202.108.9.77"), "202.108.9.77");
// outHostName(InetAddress.getByName("211.100.26.121"), "211.100.26.121");
}
执行结果如下:
a:2019-09-06 17:19:35
通过getLocalHost方法创建InetAddress对象
b:2019-09-06 17:19:35
主 机 名:DESKTOP-0AC74II
c:2019-09-06 17:19:44
主机别名:DESKTOP-0AC74II
d:2019-09-06 17:19:44
发现木有,getCanonicalHostName方法耗时近9秒!!!!
问题找到,用getHostName替换掉getCanonicalHostName方法,
拷贝Environment类到工程目录,进行重写。
public static List<Entry> list() {
ArrayList<Entry> l = new ArrayList<Entry>();
put(l, "zookeeper.version", Version.getFullVersion());
try {
put(l, "host.name",
InetAddress.getLocalHost().getHostName());
// InetAddress.getLocalHost().getCanonicalHostName());
} catch (UnknownHostException e) {
put(l, "host.name", "<NA>");
}
略。。。。
}
重新测试solr查询的速度,查1w条数据,耗时2951毫秒;比之前的12389毫秒有了很大提升!!
备注:网上说改hosts表的方法,我试过了,没什么效果。
把getCanonicalHostName的main方法放在server2012和centos上测试,都执行很快,只是本地win10慢!
另,zookeeper是个比较成熟的工具了,但网上也米有别人提出此类问题,应该不是我第一个发现这种问题,可能是自己功力不够吧!