我有一台机器,我使用下面的脚本
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
class SimplePing
{
static void connectAndPing(String host, int port, int loop, int pingLoop, int socketTimeout){
if(loop>0){
SocketAddress sAdress;
Socket kkSocket;
for(int i=0;i<loop;i++){
sAdress = new InetSocketAddress(host, port);
for(int j=0;j<pingLoop;j++){
try {
kkSocket = new Socket();
kkSocket.connect(sAdress, socketTimeout);
kkSocket.close();
Thread.sleep(1000L);
} catch (Exception e) {
System.out.println(e);
}
System.out.print("!");
}
}
}
}
public static void main(String[] args)
{
String host = args[0];
int port = Integer.parseInt(args[1]);
int socketTimeout = Integer.parseInt(args[2]);
int loop = 100000;
int pingLoop = 100;
System.out.println("Begin ping. . .");
connectAndPing(host, port, loop, pingLoop, socketTimeout);
System.out.println("End ping. . .");
}
}
它给了我一些结果(不要打扰标记,只是我的评论)
然后我尝试使用UNIX ping工具ping,并获取
这是远程机器信息:
** SunOS msgbkrpapp18 5.10 Generic_138888-03 sun4v sparc SUNW,SPARC-Enterprise-T5120
java版本&#34; 1.6.0_26&#34;
Java(TM)SE运行时环境(版本1.6.0_26-b03)
Java HotSpot(TM)服务器VM(版本20.1-b02,混合模式)**
为什么我会得到不同的结果?哪一个更有效?
端口8000正在被我的消息传递应用程序使用,它接受来自外部IP的连接,我的客户抱怨应用程序有时会关闭,他使用上面的java程序读取系统运行状况。
如果我在应用程序方面检查,没有遇到任何异常情况,即使连接的线程池也没有达到最大值。
有什么建议吗? 谢谢
答案 0 :(得分:0)
答案在你的代码中:
int socketTimeout = 1000;
...
kkSocket.connect(sAdress, socketTimeout);
另一方在1秒内没有响应,所以你得到一个SocketTimeoutException。尝试增加超时。还有代码来处理异常 - 比如增加一个未应答ping的计数器。
答案 1 :(得分:0)
几天之后,我们设法找到了罪魁祸首,结果是操作系统级别的somaxconn属性,仍处于默认值(128),考虑到我们的大量爆发,我们建议客户端将数量配置为1000; < / p>
现在,拒绝连接的数量下降了98.15%,例如,我们可以在1天内得到近400次拒绝连接,现在,它可能会降到每天6-9次。
虽然我们仍在努力提供最佳的调整配置,但我想感谢各位给我一些建议:)
由于
答案 2 :(得分:-1)
这两个结果都是有效的,区别在于Unix ping不需要连接到服务器的特定端口。它看起来你的应用程序根本不会在给定的超时内发送任何响应。