Тайм-аут соединения с сокетом Java для сокета, но хорошо с помощью инструментов ping UNIX

1

У меня есть 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. . .");
    }
}

Это дало мне результат, как (не беспокойтесь о знаке, его просто мой комментарий) Изображение 174551

Затем я попытался выполнить ping с помощью инструментов ping для UNIX и получить

Изображение 174551

Это информация о удаленной машине:

** 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 для соединения даже не соответствовал максимальному значению.

Любое предложение?? спасибо

  • 0
    Но приведенный выше код не может быть запущен, поскольку переменная j является локальной для второго цикла for . Но код использует его вне области видимости в int mark = i * j + 100 . Вы уверены, что это правильный компилируемый пример :-)
  • 0
    Вы правы, я отредактировал свой пост :),
Теги:
networking

3 ответа

0
Лучший ответ

Через несколько дней нам удалось найти виновника, как оказалось, атрибуты somaxconn на уровне ОС, все еще по умолчанию (128), учитывая наш массивный всплеск, мы предлагаем клиенту настроить число на 1000;

Теперь количество отказавшихся соединений упало на 98,15%, например, мы могли получить почти 400 раз отказ от соединений за 1 день, теперь он может упасть до 6-9 в день.

Пока мы все еще работаем над настройкой оптимальной настройки, я хотел бы поблагодарить всех вас за то, что вы дали мне несколько предложений :)

благодаря

0

Оба результата действительны, разница заключается в том, что Unix ping не нужно подключаться к определенному порту сервера. И похоже, что ваше приложение просто не посылает никакого ответа в течение заданного таймаута.

  • 0
    Нет, похоже, что брандмауэр сервера сбрасывает запрос на подключение.
  • 0
    Как ты можешь быть уверен в этом? Особенно учитывая такой короткий перерыв.
Показать ещё 5 комментариев
0

Ответ в вашем коде:

int socketTimeout = 1000;
...
kkSocket.connect(sAdress, socketTimeout);

Другая сторона не ответила через 1 секунду, поэтому вы получаете исключение SocketTimeoutException. Попытайтесь увеличить таймаут. Также иметь код для обработки исключения - например, увеличение счетчика для неустановленных пингов.

  • 0
    Хотя это правда, я хочу знать виновника этого :)
  • 0
    Хорошо пинг использует протокол ICMP, а не TCP. Вы пытаетесь подключиться к TCP-порту 8000. Возможно, есть брандмауэр. Или что-то другое. Я имею в виду - вы не имитируете пинг ICMP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню