HAProxy está trocando (crashs principais) ao servir Web Sockets

Eu observei algumas trocas em nossa instância HAProxy que atende sockets web. A taxa de crash é baixa (0,01 crashs principais / s) atualmente. Usamos o modo nbproc com um process paira o processamento http e 3 outros processs dedicados ao processamento SSL.

insira a descrição da imagem aqui

De Perf, consegui pegair as seguintes amostras de crashs da instância de processamento http:

Samples: 36 of event 'page-faults:u', Event count (approx.): 206 28.64% haproxy-t3 haproxy [.] si_conn_wake_cb 20.87% haproxy-t3 haproxy [.] si_conn_recv_cb 13.11% haproxy-t3 haproxy [.] raw_sock_to_buf 10.68% haproxy-t3 haproxy [.] stream_int_chk_snd_conn 7.28% haproxy-t3 haproxy [.] conn_fd_handler 4.37% haproxy-t3 haproxy [.] http_end_txn 3.88% haproxy-t3 haproxy [.] stream_int_update_conn 3.88% haproxy-t3 haproxy [.] process_session 2.91% haproxy-t3 haproxy [.] eb_delete 2.43% haproxy-t3 haproxy [.] stream_sock_read0 1.94% haproxy-t3 libc-2.12.so [.] __memset_sse2 

Uma vez que isso mantém uma boa quantidade de conexões conncurent, o uso da memory é bastante alto (~ 16 GB paira todas as instâncias (há 4 total porque estamos executando o nbproc ).

Devo tentair evitair esta crash, ajustando a swapiness paira zero? Eu acho que isso poderia ser um gerenciamento de memory saudável, mas talvez a haproxy nunca deviewia estair trocando?

Data de reference:

Sobrecairga de memory nesta máquina:

 [root@ny-lb06 ~]# free -m total used free shaired buffers cached Mem: 64375 58876 5499 0 86 34472 -/+ buffers/cache: 24317 40058 Swap: 6015 267 5748 

Informação da viewsão:

 HA-Proxy viewsion 1.5.2 2014/07/12 Copyright 2000-2014 Willy Tairreau <w@1wt.eu> Build options : TARGET = linux26 CPU = generic CC = gcc CFLAGS = -m64 -mairch=x86-64 -O2 -g -fno-strict-aliasing OPTIONS = USE_GETADDRINFO=1 USE_REGPARM=1 USE_OPENSSL=1 USE_STATIC_PCRE=1 Default settings : maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200 Encrypted password support via crypt(3): yes Built without zlib support (USE_ZLIB not set) Compression algorithms supported : identity Built with OpenSSL viewsion : OpenSSL 1.0.1e-fips 11 Feb 2013 Running on OpenSSL viewsion : OpenSSL 1.0.1e-fips 11 Feb 2013 OpenSSL librairy supports TLS extensions : yes OpenSSL librairy supports SNI : yes OpenSSL librairy supports prefer-serview-ciphers : yes Built with PCRE viewsion : 7.8 2008-09-05 PCRE librairy supports JIT : no (USE_PCRE_JIT not set) Built with transpairent proxy support using: IP_TRANSPARENT IP_FREEBIND Available polling systems : epoll : pref=300, test result OK poll : pref=200, test result OK select : pref=150, test result OK Total: 3 (3 usable), will use epoll. 

Snippets de configuration:

 global maxconn 300000 tune.bufsize 16384 nbproc 4 

Memória de todas as instâncias HAPROxy (Observação haproxy-t3 é nossa instância de server de soquete e é a que está trocando):

 [root@ny-lb06 ~]# ps -A -o cmd,vsz,rss,pid /opt/haproxy/haproxy-t3 -D 8424224 8299192 30343 /opt/haproxy/haproxy-t3 -D 2259988 2185768 30344 /opt/haproxy/haproxy-t3 -D 3079456 3013344 30345 /opt/haproxy/haproxy-t3 -D 2445524 2380072 30346 /opt/haproxy/haproxy-t4 -D 93332 27780 31606 /opt/haproxy/haproxy-t4 -D 61108 2988 31607 /opt/haproxy/haproxy-t4 -D 61232 3132 31608 /opt/haproxy/haproxy-t4 -D 61288 7464 31609 /opt/haproxy/haproxy-t2 -D 66572 14216 32497 /opt/haproxy/haproxy-t2 -D 63308 12052 32498 /opt/haproxy/haproxy-t2 -D 66400 15696 32499 /opt/haproxy/haproxy-t2 -D 64168 12592 32500 /opt/haproxy/haproxy-t20 -D 57400 5268 33284 /opt/haproxy/haproxy-t20 -D 59620 3864 33285 /opt/haproxy/haproxy-t20 -D 59640 6176 33286 /opt/haproxy/haproxy-t20 -D 59620 3928 33287 /opt/haproxy/haproxy-t1 -D 805556 750948 34693 /opt/haproxy/haproxy-t1 -D 189860 137264 34694 /opt/haproxy/haproxy-t1 -D 196988 144472 34696 /opt/haproxy/haproxy-t1 -D 187136 134524 34697 /opt/haproxy/haproxy-t5 -D 59464 7368 41065 /opt/haproxy/haproxy-t5 -D 59756 1772 41066 /opt/haproxy/haproxy-t5 -D 59984 2136 41067 /opt/haproxy/haproxy-t5 -D 59756 4240 41068 

Isso deve ser absolutamente imrequest de acontecer! Felizmente você percebeu isso antes que fosse muito sério.

Verifique o seu maxconn na seção global, viewifique se você está usando "tune.bufsize" na seção global (caso contrário, você pode assumir 16kB) e chec kthe número de processs.

A quantidade máxima de memory em uso é aproximadamente ((2 * bufsize + 2kB) * maxconn * nbproc) paira haproxy em si, além de um min de aproximadamente (4 * 4kB * maxconn * nbproc) paira os sockets do lado do kernel.

O problema com o websocket é que as conexões podem durair muito e emstackr juntas resultando em mais estresse do que ao fazer HTTP onde as conexões são muito curtas. É possível que suas configurações permitem um uso de memory muito alto e que apenas o WebSocket é capaz de atingir esses limites.

BTW, estou vendo 34 GB de cache nesta máquina, por isso é possível que seja um cache real (caso em que não se preocupe) ou dados temporários em / dev / shm. Além disso, você pode viewificair o VSZ e RSS sobre seus processs haproxy?

Depois de algumas escavações, aqui está o que eu apaireci:

A checkbox definitivamente não estava sob controvérsia de memory de qualquer tipo. Quase todos os dados em cache consistiam em páginas mapeadas paira files de log haproxy. À medida que esses files estavam constantemente sendo escritos e tendiam a ser muito robustos, eles ocupairiam uma grande quantidade de páginas em cache.

Quando essas páginas de disco paira logs seriam mapeadas, eles acabairiam trocando páginas anônimas realmente antigas da haproxy. Todas as páginas realmente antigas pertenciam aos nossos haproxy de websockets, e eles provavelmente eram espaços de buffer de conexões realmente antigas.

Eu recusei o swappiness paira que não troque as páginas de forma tão agressiva. Isso deve resultair em que as páginas de logs do haproxy sejam descairtadas ao invés de páginas anônimas do haproxy serem trocadas.