У меня есть 1 машина, которую я пинговал с использованием ниже сценариев
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. . .");
}
}
Это дало мне результат, как (не беспокойтесь о знаке, его просто мой комментарий)
Затем я попытался выполнить ping с помощью инструментов ping для UNIX и получить
Это информация о удаленной машине:
** SunOS msgbkrpapp18 5.10 Generic_138888-03 sun4v sparc SUNW, SPARC-Enterprise-T5120
java-версия "1.6.0_26"
Java (TM) SE Runtime Environment (сборка 1.6.0_26-b03)
Java HotSpot (TM) Server VM (сборка 20.1-b02, смешанный режим) **
Почему у меня получается другой результат? какой из них более важен?
Порт 8000 используется моими приложениями обмена сообщениями, которые принимают соединение с внешнего IP-адреса, мой клиент жаловался, что приложения иногда не работают, он читает состояние системы, используя указанную выше java-программу.
Если я проверил на стороне приложений, никаких ненормальных условий не было, даже threadpool для соединения даже не соответствовал максимальному значению.
Любое предложение?? спасибо
Через несколько дней нам удалось найти виновника, как оказалось, атрибуты somaxconn на уровне ОС, все еще по умолчанию (128), учитывая наш массивный всплеск, мы предлагаем клиенту настроить число на 1000;
Теперь количество отказавшихся соединений упало на 98,15%, например, мы могли получить почти 400 раз отказ от соединений за 1 день, теперь он может упасть до 6-9 в день.
Пока мы все еще работаем над настройкой оптимальной настройки, я хотел бы поблагодарить всех вас за то, что вы дали мне несколько предложений :)
благодаря
Оба результата действительны, разница заключается в том, что Unix ping не нужно подключаться к определенному порту сервера. И похоже, что ваше приложение просто не посылает никакого ответа в течение заданного таймаута.
Ответ в вашем коде:
int socketTimeout = 1000;
...
kkSocket.connect(sAdress, socketTimeout);
Другая сторона не ответила через 1 секунду, поэтому вы получаете исключение SocketTimeoutException. Попытайтесь увеличить таймаут. Также иметь код для обработки исключения - например, увеличение счетчика для неустановленных пингов.
j
является локальной для второго циклаfor
. Но код использует его вне области видимости вint mark = i * j + 100
. Вы уверены, что это правильный компилируемый пример :-)