多负载环境,系统日志等场景为了方便明确具体应用增加了机器信息的记录,从网上搜到大量类似代码。但真正上生产环境后发现严重问题:随并发上升,该功能响应越来越慢,最后导致整个系统处于卡死状态。
分析发现,JDK内置的getLocalHost方法在信创等特定机器环境耗时较长,且该方法内有进程级的synchronized锁等待控制,导致生产环境随着并发请求增加,后续请求出现串行排队、响应时间放大的情况,甚至Tomcat容器http线程耗尽,所有web请求处于排队等待状态。
修改为缓存处理,设置启动后事件获取方式,避免影响业务用户的操作响应。
https://cloud.tencent.com/developer/article/1407559
https://blog.csdn.net/nianbingsihan/article/details/80265029
// 获取机器名 InetAddress.getLocalHost().getHostName() // 获取机器IP List<String> ips = new ArrayList<>(); Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces(); while (enumeration.hasMoreElements()) { NetworkInterface intf = enumeration.nextElement(); if (intf.isLoopback() || intf.isVirtual()) { continue; } Enumeration<InetAddress> inets = intf.getInetAddresses(); while (inets.hasMoreElements()) { InetAddress addr = inets.nextElement(); if (addr.isLoopbackAddress() || !addr.isSiteLocalAddress() || addr.isAnyLocalAddress()) { continue; } ips.add(addr.getHostAddress()); } }