Hi all,

haproxy is used for http and https load balancing with TLS termination
on haproxy side.

I'm using openbsd -stable on this box. I got CPU saturated with
250Mbps traffic in/out summary on frontend NICs and 3000 ESTABLISHED
connections on frontent interface to haproxy.

# all connections to haproxy
lsof -ni | grep -i haproxy  | wc -l
    3683

# established connections on frontend bind IP address
lsof -ni | grep -i haproxy  | grep ESTABLISHED | grep xxx.xxx.xxx |  wc -l
    3041

It was 99% cpu usage when I've used SP kernel (single CPU) and no
nbproc in config, so I've switched to MP (multiprocessor) kernel and
enabled nbproc 4.

>From top output memory usage is quite low, but there is 57% CPU
interrupt on CPU0:

$ top

load averages:  4.01,  3.95,  3.82

29 processes: 1 running, 24 idle, 4 on processor
CPU0 states: 16.8% user,  0.0% nice,  8.4% system, 57.3% interrupt, 17.6% idle
CPU1 states: 29.0% user,  0.0% nice, 35.6% system,  0.6% interrupt, 34.8% idle
CPU2 states: 30.9% user,  0.0% nice, 32.9% system,  0.6% interrupt, 35.5% idle
CPU3 states: 23.8% user,  0.0% nice, 36.3% system,  0.6% interrupt, 39.3% idle
Memory: Real: 773M/1389M act/tot Free: 14G Cache: 81M Swap: 0K/16G

  PID USERNAME PRI NICE  SIZE   RES STATE     WAIT      TIME    CPU COMMAND
 8147 _haproxy  61    0  240M   83M run       -         8:12 69.38% haproxy
19935 _haproxy  61    0  241M   85M onproc    -         7:53 69.19% haproxy
22974 _haproxy  60    0  235M   78M onproc    -         6:38 64.55% haproxy
10729 _haproxy  61    0  228M   71M onproc    -         6:50 61.67% haproxy



Current CPU - E5-2609 v2 - 4 core.

cpu0: Intel(R) Xeon(R) CPU E5-2609 v2 @ 2.50GHz, 2500.38 MHz
cpu0: 
FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,PCID,DCA,SSE4.1,SSE4.2,x2APIC,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,LONG,LAHF,PERF,ITSC,FSGSBASE,SMEP,ERMS

I've built haproxy from source as in openbsd's packages there is only
1.4 available.

As you can see haproxy -vv show it's built with no PCRE JIT support,
but I've also tried to use complied version with PCRE JIT support
enabled - I didn't noticed any imporvements during testing.


$ haproxy -vv
HA-Proxy version 1.5.11-7 2015/03/17
Copyright 2000-2015 Willy Tarreau <[email protected]>

Build options :
  TARGET  = openbsd
  CPU     = generic
  CC      = gcc
  CFLAGS  = -m64 -march=x86-64 -O2 -g -fno-strict-aliasing
  OPTIONS = USE_ZLIB=1 USE_OPENSSL=1 USE_STATIC_PCRE=1 USE_PCRE_JIT=1

Default settings :
  maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200

Encrypted password support via crypt(3): no
Built with zlib version : 1.2.3
Compression algorithms supported : identity, deflate, gzip
Built with OpenSSL version : LibreSSL 2.0
Running on OpenSSL version : LibreSSL 2.0
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 8.35 2014-04-04
PCRE library supports JIT : no (libpcre build without JIT?)
Built with transparent proxy support using: SO_BINDANY

Available polling systems :
     kqueue : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 3 (3 usable), will use kqueue.

$ cat /etc/haproxy/haproxy.cfg

global
        log loghost
        maxconn 600000
        chroot /var/haproxy
        uid 604
        gid 604
        daemon
        #debug
        nbproc 4
        #quiet
        pidfile /var/run/haproxy.pid
        ssl-default-bind-options no-sslv3 no-tls-tickets
        ssl-default-bind-ciphers
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
        tune.ssl.cachesize 200000
        tune.ssl.lifetime  7200
        tune.ssl.default-dh-param 1024
        tune.bufsize 16384
        tune.maxrewrite 1024

defaults
        log     global
        mode    http
        option  httplog
        option  forwardfor
        option http-server-close
        option  dontlognull
        option  redispatch
        retries 2
        maxconn 300000
        stats enable
        stats uri /haproxy?stats
        stats auth admin:mysecurepassword
        timeout connect 5s
        timeout client 5s
        timeout server 120s
        timeout queue 60s
        timeout http-request 10s
        timeout http-keep-alive 1s

        default-server inter 5s fall 8 rise 2 slowstart 5s

frontend ft-https
        bind xxxxxx:443 ssl crt /etc/ssl/haproxy/domain1.com crt
/etc/ssl/haproxy/domain2.com crt /etc/ssl/haproxy/domain3.com
        reqadd X-Forwarded-Proto:\ https
        compression algo gzip
        compression type text/html text/plain

        acl static_content path_end .jpg .gif .png .ico .otf .woff
.eot .ttf .css .js
        acl varnish_available nbsrv(bk-varnish) ge 1

        acl acl-domain1 hdr(Host) -i domain1.com
        acl acl-domain2 hdr(Host) -i domain2.com
        acl acl-domain2 hdr(Host) -i domain3.com

        use_backend bk-varnish if varnish_available static_content
        use_backend bk-domain1-https if acl-domain1
        use_backend bk-domain2-https if acl-domain2

        default_backend bk-domain3-https

frontend ft-http
        bind xxxxxx:80
        reqadd X-Forwarded-Proto:\ http
        compression algo gzip
        compression type text/html text/plain

        acl static_content path_end .jpg .gif .png .ico .otf .woff
.eot .ttf .css .js
        acl varnish_available nbsrv(bk-varnish) ge 1

        acl acl-domain1 hdr(Host) -i domain1.com
        acl acl-domain2 hdr(Host) -i domain2.com
        acl acl-domain2 hdr(Host) -i domain3.com

        use_backend bk-varnish if varnish_available static_content
        use_backend bk-domain1-http if acl-domain1
        use_backend bk-domain2-http if acl-domain2

        default_backend bk-domain3-http

backend bk-varnish
        balance roundrobin
        option  httpchk HEAD  /varnishcheck
        http-check expect status 200
        server cache0 192.168.0.101:6081 check inter 2s fall 2 rise 2
slowstart 1s
        server cache1 192.168.0.102:6081 check inter 2s fall 2 rise 2
slowstart 1s

backend bk-domain1-http
        option  httpchk HEAD /
        cookie  MYSESSID prefix
        option httpchk HEAD / HTTP/1.1\r\nHost:\ www.domain1.com
        http-check expect status 200
        balance source
        hash-type consistent
        server  server1 192.168.0.71:80 check
        server  server2 192.168.0.72:80 check
        server  server3 192.168.0.73:80 check

backend bk-domain1-https
        option  httpchk HEAD /
        cookie  MYSESSID prefix
        option httpchk HEAD / HTTP/1.1\r\nHost:\ www.domain1.com
        http-check expect status 200
        balance source
        hash-type consistent
        server  server1 192.168.0.71:443 check ssl verify none
        server  server2 192.168.0.72:443 check ssl verify none
        server  server3 192.168.0.73:443 check ssl verify none

backend bk-domain2-http
        option  httpchk HEAD /
        cookie  MYSESSID prefix
        option httpchk HEAD / HTTP/1.1\r\nHost:\ www.domain2.com
        http-check expect status 200
        balance source
        hash-type consistent
        server  server4 192.168.0.74:80 check
        server  server5 192.168.0.75:80 check
        server  server6 192.168.0.76:80 check

backend bk-domain2-https
        option  httpchk HEAD /
        cookie  MYSESSID prefix
        option httpchk HEAD / HTTP/1.1\r\nHost:\ www.domain2.com
        http-check expect status 200
        balance source
        hash-type consistent
        server  server4 192.168.0.74:443 check ssl verify none
        server  server5 192.168.0.75:443 check ssl verify none
        server  server6 192.168.0.76:443 check ssl verify none

backend bk-domain3-http
        option  httpchk HEAD /
        cookie  MYSESSID prefix
        option httpchk HEAD / HTTP/1.1\r\nHost:\ www.domain3.com
        http-check expect status 200
        balance source
        hash-type consistent
        server  server4 192.168.0.74:80 check
        server  server5 192.168.0.75:80 check
        server  server6 192.168.0.76:80 check

backend bk-domain3-https
        option  httpchk HEAD /
        cookie  MYSESSID prefix
        option httpchk HEAD / HTTP/1.1\r\nHost:\ www.domain3.com
        http-check expect status 200
        balance source
        hash-type consistent
        server  server4 192.168.0.74:443 check ssl verify none
        server  server5 192.168.0.75:443 check ssl verify none
        server  server6 192.168.0.76:443 check ssl verify none

Let me kindl ask how to find why haproxy causing, so high CPU usage.

-- 
--
With regards,
Eugene Sudyr

Reply via email to