Производительность HTTP-сервераJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Производительность HTTP-сервера

Сообщение Anonymous »

Почему первая реализация базового HTTP-сервера с однопоточной блокировкой имеет гораздо меньшее количество запросов в секунду, чем вторая реализация? Почему у него так много ошибок чтения?
Я тестирую это через wrk со следующими параметрами:

Код: Выделить всё

wrk -t4 -c100 -d10s http://localhost:8080
Кроме того, мне интересно, где я могу узнать больше о сетях сокетов и HTTP, а также о повышении производительности? У меня нет идей сделать его неблокирующим и использовать такие функции, как select() или epoll(), а затем, возможно, сделать его многопоточным.
Но, пожалуйста, укажите мне несколько хороших ресурсов, посвященных изучению TCP-сокетов и созданию HTTP-серверов, а также тому, как я могу увеличить пропускную способность и производительность. В частности, было бы неплохо на Java.
Мой текущий диагноз: возможно поддерживать живые соединения, но я не слишком много об этом знаю.
Первое внедрение:

Код: Выделить всё

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class SimpleHttpServer {
private static final byte[] RESPONSE = ("HTTP/1.1 200 OK\r\n" +
"Content-Type: text/plain\r\n" +
"Content-Length: 12\r\n" +
"Connection: keep-alive\r\n" +
"\r\n" +
"Hello World!").getBytes(StandardCharsets.US_ASCII);

public static void main(String[] args) throws IOException {
int port = 8080;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server listening on port " + port);

while (true) {
try (Socket clientSocket = serverSocket.accept()) {
handleClient(clientSocket);
} catch (IOException e) {
System.err.println("Error accepting client connection: " + e.getMessage());
}
}
}
}

private static void handleClient(Socket clientSocket) {
try (InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream()) {

byte[] buffer = new byte[8192];
int bytesRead = in.read(buffer);

out.write(RESPONSE);
out.flush();
} catch (IOException e) {
System.err.println("Error handling client: " + e.getMessage());
}
}
}

Код: Выделить всё

Running 10s test @ http://localhost:8080
4 threads and 100 connections
Thread Stats   Avg      Stdev     Max   +/- Stdev
Latency     3.23ms    5.33ms 112.16ms   99.63%
Req/Sec     2.65k     1.12k    3.66k    84.62%
13852 requests in 10.08s, 1.33MB read
Socket errors: connect 0, read 16674, write 0, timeout 0
Requests/sec:   1373.97
Transfer/sec:    135.52KB
Вторая реализация:

Код: Выделить всё

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class SimpleHttpServer {
private static final byte[] RESPONSE = ("HTTP/1.1 200 OK\r\n" +
"Content-Type: text/plain\r\n" +
"Content-Length: 12\r\n" +
"Connection: keep-alive\r\n" +
"\r\n" +
"Hello World!").getBytes(StandardCharsets.US_ASCII);

public static void main(String[] args) throws IOException {
int port = 8080;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server listening on port " + port);

while (true) {
try (Socket clientSocket = serverSocket.accept()) {
handleClient(clientSocket);
} catch (IOException e) {
System.err.println("Error accepting client connection: " + e.getMessage());
}
}
}
}

private static void handleClient(Socket clientSocket) {
try (InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream()) {

byte[] buffer = new byte[8192];
int bytesRead;

while ((bytesRead = in.read(buffer)) != -1) {
out.write(RESPONSE);
out.flush();
}

} catch (IOException e) {
System.err.println("Error handling client: " + e.getMessage());
}
}
}

Код: Выделить всё

Running 10s test @ http://localhost:8080
4 threads and 100 connections
Thread Stats   Avg      Stdev     Max   +/- Stdev
Latency    24.20us   13.95us   5.83ms   97.12%
Req/Sec    39.67k     2.53k   43.48k    69.31%
398573 requests in 10.10s, 38.39MB read
Socket errors: connect 0, read 83, write 0, timeout 0
Requests/sec:  39457.15
Transfer/sec:      3.80MB
Я пытался узнать больше о протоколе HTTP и остаться в живых.


Подробнее здесь: https://stackoverflow.com/questions/790 ... erformance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»