坑爹的InetAddress.getLocalHost问题

/ JDK / 1 条评论 / 118浏览

记一次InetAddress.getLocalHost系统问题排查

背景

项目更新了一次代码之后发现查询巨慢,以为是其他问题。后面准备把新加的代码异步处理,因为本身这块代码解析了一些xxx,操作了redis。

排查过程

改完之后想想,加入的这块逻辑应该是很轻的操作,不应该很慢。于是通过jstack将栈的信息打印出来,看是否有一些发现。

jstack

看看是否有BLOCKED的线程

alt

果然,有BLOCKED的线程,而且好大概10个线程在等待锁。

初步定位出如下代码:

private String getServerIp() {
    try {
        InetAddress address = InetAddress.getLocalHost();
        if (address == null) {
            return "";
        }
        return address.getHostName();
    } catch (UnknownHostException e) {
        LOG.warn("获取服务器ip错误");
    }
    return "";
}

可是这块代码是用来获取当前服务器的host的,因为系统采用F5负载,为了记录当前请求落在哪个服务器上。这块代码不应该有问题,于是搜索InetAddress.getLocalHost很慢等相关问题。

终于,有了发现。

Java获取系统hosts时,如果本机hostname没有在hosts文件中,会解析xxx(不太懂),导致获取host很慢。 这样其他线程无法获取InetAddress中的一个内部对象锁,造成等待。

顿时虎躯一震,服务器上的hostname(服务器上叫crpprdtd04)好像真的没有添加到hosts文件中,于是拿一台服务器进行修改。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# 添加如下
10.252.165.153	crpprdtd04

改完后,点击查询,很快,问题解决。

总结

what,发生了什么。。

  1. czy

    这个博客很好看

    回复