HttpsServer provoca carga de la CPU 100% con el enrollamiento

Matthias Braun:

He creado una aplicación mínima alrededor de Java HttpsServer.

He instalado una HttpHandlerque las respuestas a una solicitud con un mensaje corto de texto:

return exchange -> {
    try {
        OutputStream responseBodyStream = exchange.getResponseBody();

        byte[] response = "Trouble with HTTPS and curl\n"
                .getBytes(StandardCharsets.UTF_8);

        exchange.getResponseHeaders().set("Content-Type", "text/plain");

        exchange.sendResponseHeaders(200, response.length);

        responseBodyStream.write(response);

        responseBodyStream.close();

        // Note that exchange.close() also closes the exchange's input stream
        // and output stream

    } catch (Exception e) {
        log.warn("Could not handle request", e);
    }
};

Cuando se conecta al servidor con el enrollamiento, los responde servidor, pero el proceso de Java mantiene utilizando un núcleo completo, haciendo así que el servidor responde.

Es esta línea que desencadena el problema:

responseBodyStream.close();

Si eliminamos la línea, el servidor sigue funcionando.

A partir de los documentos :

Con el fin de terminar correctamente cada intercambio, el flujo de salida debe estar cerrada, incluso si no hay cuerpo de la respuesta está siendo enviado.

He creado un proyecto para reproducir el problema.

Algunas pistas posibles que he encontrado hasta ahora:

  • el uso intensivo de la CPU sólo se produce cuando se conecta al servidor con el enrollamiento. Al conectar con Firefox, uso de la CPU se mantiene baja
  • El problema no se produce con rizo cuando se utiliza un servidor HTTP normal sin TLS
  • Los datos recopilados mediante registradores de vuelo indican que SSLEngineImpl#writeRecorden el hilo HTTP-Dispatcherasigna una gran cantidad de objetos

Estoy en Arch Linux 5.1.7 usando OpenJDK 12.0.1 + 12. La versión de rizo es 7.65.1.

Es esto un error en el JDK? O estoy usando HttpsServerel camino equivocado?

apangin:

También podría reproducir el problema.
No es un bucle infinito en SSLStreams.doClosure- este es definitivamente un error de JDK.

HttpsServer bien trabajado en el JDK 10, pero se inicia en bucle en el JDK 11. Creo que el problema es que HttpsServer implementación no se ha adaptado a la política de medio cerca TLS v1.3 aparecido en el JDK 11.

Afortunadamente, hay una solución. Agregar -Djdk.tls.acknowledgeCloseNotify=trueopción de JVM. Con esta opción HttpsServer funcionará como se espera. Ver JDK-8208526 para más detalles.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=228160&siteId=1
Recomendado
Clasificación