Спасибо за совет Питера Лори, и мы использовали TCPDump, чтобы доказать, что данные передаются на наш сервер через несколько секунд после установления соединения.Вот почему серверная программа зафиксировала большую задержку.
Но затем мы выполняем некоторый нагрузочный тест с той же серверной программой, имея 4000 тестов GPS-устройств, отправляющих данные на нее каждые 5 минут, каждая из них составляет около 300 байт.
Мы попытались изменить код сервера, введя Threadpool для обработки извлечения данных TCP и надеясь, что это даст нам лучшую производительность.
Мы включили TCPDump и обнаружили, что на этот раз отклонение времени былонаходится между отметкой времени TCPDump и отметкой времени «START ...», записанной в программе Java.Отклонение составляло от нескольких секунд до менее 20 секунд ...
Есть какие-либо предложения по устранению проблемы?
Инициализация пула потоков:
blockingQueueForRetriveTCPMsg = new LinkedBlockingQueue<Runnable>(50);
threadPoolExecutorForRetriveTCPMsg = new ThreadPoolExecutor(
50,1200, 0, TimeUnit.SECONDS,
blockingQueueForRetriveTCPMsg,
new ThreadPoolExecutor.CallerRunsPolicy());
ServerSocket.accept ():
ServerSocket serverSocket = new ServerSocket(13811);
serverSocket.setReceiveBufferSize(receiveBufferSize);
Socket incomingSocket = serverSocket.accept();
RetrieveTcpMessage retrieveTcpMessage = new RetrieveTcpMessage(incomingSocket);
Thread retrieveTcpMessageThread = new Thread(retrieveTcpMessage);
threadPoolExecutorForRetriveTCPMsg.execute(retrieveTcpMessageThread);
Внутри RetrieveTcpMessage.run (), аналогично предыдущему:
InputStream stream = incomingSocket.getInputStream();
byte[] buffer = new byte[1000];
StringBuffer sb = new StringBuffer();
System.out.println("START getting message from TCP stream: " + dateFormat.format(Calendar.getInstance().getTime()));
while (stream.read(buffer) > 0)
{
sb.append(new String(buffer));
System.out.println(sb.toString());
}
System.out.println("[incomingMessage]: " + incomingMessage);
System.out.println("FINISHED getting message from TCP stream: " + dateFormat.format(Calendar.getInstance().getTime()));