Menggunakan PERMESSAGE_DEFLATE menyebabkan kebocoran memori asli di JETTY9.3.11

Kami menggunakan jetty container versi 9.3.11 untuk menyebarkan aplikasi kami

kami menggunakan klien tyrus untuk menghubungkan klien ke server websocket yang telah kami terapkan.

ketika saya terhubung menggunakan kode berikut:

WebSocket ws = null;
        try {

            ws = new WebSocketFactory().createSocket(server)
                    .addListener(new NotifierAdapter(userId, channel))
                    .addExtension(WebSocketExtension.PERMESSAGE_DEFLATE).connect();

        } catch (WebSocketException we) {
            connect(server, userId, channel);
        }catch(Exception e)
        {
            e.printStackTrace();
        }return ws;

Sekitar 8000 koneksi, mesin saya menggunakan 40% Memori

Tetapi dengan melihat modifikasi kode (menghapus ekstensi deflate)

try {

            ws = new WebSocketFactory().createSocket(server)
                    .addListener(new NotifierAdapter(userId, channel))
                    .connect();

        } catch (WebSocketException we) {
            connect(server, userId, channel);
        }catch(Exception e)
        {
            e.printStackTrace();
        }return ws;

Mampu terhubung ke 15.000 koneksi hanya dengan 15% Memori Apakah ada kebocoran terkait deflator bahkan di server Jetty versi terbaru..

Apakah ada cara untuk menonaktifkan PERMESSAGE_DEFLATE di sisi server jetty.. Kami juga menggunakan strategi spring websocket yang meneruskan jettyrequestupgrade

Kode konfigurasi pegas adalah sebagai berikut:

@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@EnableWebSocket
public class WebMVCConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {


    private static final String NOTIFIER_ENDPOINT_URL = "/notificationHandler";

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(socketHandler(), NOTIFIER_ENDPOINT_URL).setAllowedOrigins("*");
    }

    @Bean
    public WebSocketHandler socketHandler() {
        return new NotificationSocketHandler();
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    public DefaultHandshakeHandler handshakeHandler() {

        WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
        policy.setInputBufferSize(8192);
        policy.setIdleTimeout(600000);
        WebSocketServerFactory ws=new WebSocketServerFactory(policy);
        ws.getExtensionFactory().unregister("permessage-deflate");
        return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(ws));
    }

}

Meskipun saya membatalkan pendaftaran permessage-deflate ketika saya terhubung dari browser di header respons, saya dapat melihat bahwa bendera masih diaktifkan, adakah perubahan lain yang harus dilakukan dalam wadah untuk ini??

Atau apakah ada masalah dengan konfigurasi websocket pegas:

Juga header responsnya adalah sebagai berikut:

Connection:Upgrade
Sec-WebSocket-Accept:xbbUnu7pDWs9Q0st4T1LzsIfqao=
Sec-WebSocket-Extensions:permessage-deflate
Upgrade:WebSocket

Saya rasa bug di bawah ini belum terselesaikan.

https://github.com/eclipse/jetty.project/issues/293

Apakah ada solusi untuk ini (Konfigurasi eksplisit di server jetty untuk menonaktifkan PERMESSAGE_DEFLATE di wadah server jetty atau konfigurasi pegas untuk Jetty

Setelah mencari saya tidak dapat menemukan solusi apa pun pada wadah server/konfigurasi kode dengan spring websocket tidak berfungsi ..

Sebagai solusinya saya menulis interseptor yang akan menghapus parameter entension Sec Websocket dari header..sehingga server akan mengirimkan respons tanpa ekstensi ini


person svs teja    schedule 16.09.2016    source sumber


Jawaban (1)


Alasan kebocoran memori adalah bug JVM dengan implementasi Deflate di JVM Classpath.

Menyiapkan ObjectPool hanya menunda hal yang tidak dapat dihindari, hanya akan memperlambat kebocoran memori.

Jika Anda memiliki akses ke WebSocketServletFactory maka ...

 factory.getExtensionFactory().unregister("permessage-deflate");

Jika Anda hanya memiliki akses melalui JSR-356, terapkan Configurator khusus dan hapus ekstensi permessage-deflate selama negosiasi ekstensi.

public class StripExtensionsConfigurator extends ServerEndpointConfig.Configurator
{
    @Override
    public List<Extension> getNegotiatedExtensions(List<Extension> installed, 
                                                   List<Extension> requested)
    {
        return Collections.emptyList();
    }
}
person Joakim Erdfelt    schedule 16.09.2016
comment
Saya telah membatalkan pendaftaran ekstensi itu WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER); kebijakan.setInputBufferSize(8192); kebijakan.setIdleTimeout(600000); WebSocketServerFactory ws=WebSocketServerFactory baru(kebijakan); ws.getExtensionFactory().batalkan pendaftaran(permessage-deflate); kembalikan DefaultHandshakeHandler baru(JettyRequestUpgradeStrategy(ws)); - person svs teja; 17.09.2016
comment
Saat kami melakukan pembatalan pendaftaran di websocketServerFactory, ia akan menonaktifkan deflate permessage tetapi dengan kode di atas yang ditentukan juga di browser chrome, saya masih dapat melihat Connection:Upgrade Sec-WebSocket-Accept:xbbUnu7pDWs9Q0st4T1LzsIfqao= Sec-WebSocket-Extensions:permessage-deflate. .bisakah Anda memberikan solusi penonaktifan di wadah server (konfigurasi server jetty) - person svs teja; 17.09.2016
comment
Juga apakah ada hal serupa dengan ini di wadah server jetty (bukan aplikasi) stackoverflow.com/questions/28894316/ - person svs teja; 17.09.2016
comment
Sebagai solusinya saya menulis interseptor yang akan menghapus parameter entension Sec Websocket dari header..sehingga server akan mengirimkan respons tanpa ekstensi ini - person svs teja; 18.09.2016