SSL Server schafft nicht mehr wie ~1000 Verbindungen

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
hssjc
Beiträge: 3
Registriert: 21.12.2015 21:55:48

SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von hssjc » 21.12.2015 22:16:55

Hallo Leute,
ich habe einen Server mit C++ und der BOOST ASIO Bibliothek geschrieben.
Der Server soll möglichst viele Verbindungen annehmen (läuft auf einer Debian Maschine) und als Gateway zwischen Client und Server fungieren, sprich pro verbundenem Client zwei offene Sockets. Das System hat nur ein Ehternet Interface.

Nun ist es so dass ab einer bestimmten Anzahl von offenen Verbindungen das ganze System sehr zäh wird, CPU Auslastung aber trotzdem nie mehr wie wie 10% beträgt.
Meistens dümpelt die Auslastung zwischen 0% und 5%. Bei ca. 800 - 1000 verbundenen Clients (netstat -apn | grep 443.*ESTABLISHED | wc -l) nimmt der Server nur nach mehreren Sekunden neue Verbindungen an.
Auch der locale Verbindungsaufbau mittels openssl s_client -connect localhost:443 dauert über 10 Sekunden.
Laut nload habe ich einen Durschnittlichen Traffic von 500 Kilobyte/s rein und raus.
Ich habe schon sämtliche Werte im System hochgeschraubt, allerdings bin ich mir nicht sicher wie ich das Bottleneck sicher bestimmen kann.

Wenn ich den SSL Server neustarte, klappt die Verbindung in einem Sekundenbruchteil. Unter /var/log/ konnte ich den Logfiles keine Fehler erkennen.


Hat jemand eine Idee ?

Folgende Änderungen habe ich an der /etc/sysctl.conf angehängt, welche schon eine Besserung gebracht haben.

Code: Alles auswählen

# Use the full range of ports.
net.ipv4.ip_local_port_range = 1024 65535
# Maximum number of remembered connection requests, which are still did not receive an acknowledgment from connecting client. The default value is 1024 for systems with more than 128Mb of memory
net.ipv4.tcp_max_syn_backlog = 8192
# Limit of socket listen() backlog, known in userspace as SOMAXCONN, default is 128
net.core.somaxconn=8192
# max receive buffer for all type of connection
net.core.rmem_max=16777216
# max send buffer for all type of connection
net.core.wmem_max=16777216
# default receive buffer size for all type of connection
net.core.rmem_default=65536
# default send buffer size for all type of connection
net.core.wmem_default=65536

#The tcp_mem variable defines how the TCP stack should behave when it comes to memory usage. ... 
#The first value specified in the tcp_mem variable tells the kernel the low threshold. Below this point, the TCP stack do not bother at all about putting any pressure on the memory usage by different TCP sockets. ...
#The second value tells the kernel at which point to start pressuring memory usage down. ...
#The final value tells the kernel how many memory pages it may use maximally. If this value is reached, TCP streams and packets start getting dropped until we reach a lower memory usage again. This value includes all TCP sockets currently in use."
net.ipv4.tcp_mem='16777216 16777216 16777216'

#The first value tells the kernel the minimum receive buffer for each TCP connection, and this buffer is always allocated to a TCP socket, even under high pressure on the system. ...
#The second value specified tells the kernel the default receive buffer allocated for each TCP socket. This value overrides the /proc/sys/net/core/rmem_default value used by other protocols. ...
#The third and last value specified in this variable specifies the maximum receive buffer that can be allocated for a TCP socket."
net.ipv4.tcp_rmem='4096 65536 16777216'

#This variable takes 3 different values which holds information on how much TCP sendbuffer memory space each TCP socket has to use. Every TCP socket has this much buffer space to use before the buffer is filled up. Each of the three values are used under different conditions. ...
#The first value in this variable tells the minimum TCP send buffer space available for a single TCP socket. ...
#The second value in the variable tells us the default buffer space allowed for a single TCP socket to use. ...
#The third value tells the kernel the maximum TCP send buffer space." 
net.ipv4.tcp_wmem='4096 65536 16777216'
Hier die Limits für den User unter dem der SSL Server läuft.

Code: Alles auswählen

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             15794                15794                processes
Max open files            65536                65536                files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       15794                15794                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
Gruß Till

DeletedUserReAsG

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von DeletedUserReAsG » 22.12.2015 06:25:09

Verfügbare Entropie? Konfiguration des Servers selbst? RAM-Belegung? Logs?

wanne
Moderator
Beiträge: 7625
Registriert: 24.05.2010 12:39:42

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von wanne » 22.12.2015 14:23:42

hssjc hat geschrieben:ich habe einen Server mit C++
Ohne Sourcen wird man da nicht viel sagen können,
hssjc hat geschrieben:BOOST ASIO Bibliothek
Dir sollte klar sein, dass die eher auf Portablität und Eleganz als auf Performance achten.
Trotzdem könnten da vielleicht mehr als 2k Verbindungen möglich sein. Vielleicht auch nicht.
hssjc hat geschrieben:CPU Auslastung aber trotzdem nie mehr wie wie 20% beträgt.
Messen von CPU Auslastung ist so eine Sache. Und Kontextwechsel mögen CPUs gar nicht. Wenn da viele Threads offen sind kommst du da je nach Messart nicht über 5-10%. Deswegen Haben alle besseren Server ihr eigenes Threadmanagement. Der Apache hat auch lange nicht mehr als ~10k handeln können. Da geht mit neueren Kerneln mehr aber prinzipiell ist das ein grundätlziches Problem. Ein Sicheres und Performantes Thread Management (Wie es der Linux Kernel hat) ist ein anderes als eines, dass ein paar k weitestgehend rechenarme Threads handeln soll. Wenn du einen Yaws hast, der auf dank erlang auf starke Parallelisierung ausgelegt ist, sind ein paar 10k Verbindungen kein Problem. Wenn du irgend was hast, das für jede Verbindung einen eigenen Prozess spornt (bozohttpd per default) Dann geht dir das schon bei 100 Verbindungen in die Knie.
hssjc hat geschrieben:Wenn ich den SSL Server neustarte, klappt die Verbindung in einem Sekundenbruchteil.
Klingt nach leaks. Insbesodnere zu viele offene FDs oder Threads.

Du kannst ja mal einen nginx oder so testen. Dann wirst du sehen, dass dein Performance-Problem nicht am System liegt. Du kannst wie die Apache Leute jahrelang suchen, wie du den Linux Kernel schneller tunest und da ein paar prozent rausholen. Oder eben was nutzen, dass darauf ausgelegt ist. Nginx...
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von ThorstenS » 22.12.2015 15:19:50

Für die Entropie würd ich das hier installieren: https://packages.debian.org/jessie/haveged

Im BIOS würd ich hyperthreading ausschalten (such mal nach pfsense und hyperthreading, da gibt es die Erklärung (unnötige context Wechsel))

Ausserdem sollte deine CPU die AES-NI Erweiterung haben, das beschleunigt - bei richtiger cipher Wahl - den Durchsatz ernorm.

hssjc
Beiträge: 3
Registriert: 21.12.2015 21:55:48

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von hssjc » 22.12.2015 16:41:50

Hallo Leute,
Danke für die Infos. Ich muss sagen dass ich mich zum ersten mal mit dem Thema Systemoptimierung beschäftige,
da ich bisher kein Programm geschrieben habe was so viele Verbindungen verarbeitet hat.

Das Programm läuft auf einem Stock 64 Bit Debian 8 (Jessie) ohne GUI.

Code: Alles auswählen

cat /proc/version
Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09)
Als Grundgerüst habe ich folgenden Code genommen.

Code: Alles auswählen

http://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/example/cpp03/ssl/server.cpp
Das Programm hat zwei Prozesse, wobei ein Prozess nur für das loggen zuständig ist, und eine Log Queue hat.
Im zweiten Prozess läuft dann die Handling der Clients in einem Thread.

Das Programm läuft in einer virtuellen Umgebung. Dem System stehen 4 Gigabyte Hauptspeicher zur Verfügung,
davon verwendet das Programm ca. 200 Megabyte, Virtual Memory ca. 400 Megabyte.

Ich hab mit folgendem Befehl die Entropie geprüft

Code: Alles auswählen

 cat /proc/sys/kernel/random/entropy_avail
Beim ersten mal hatte ich einen Wert unter 30, bei den darauffolgenden Aufrufen etwa ~ 300.
Daraufhin habe ich aus den Paketquellen haveged installiert.
Nun liegt die Entropie zwischen 1000 - 2500
Klingt nach leaks. Insbesodnere zu viele offene FDs oder Threads.
Wie kann ich mir das schnell Anzeigen lassen ?

Gibt es noch mehr Stellschrauben am System ?

Gruß Till

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von ThorstenS » 22.12.2015 18:21:19

installiere Debianinxi und schau dir inxi -v6 an. (tIpp von Heisenberg).
Was sagt cat /proc/cpuinfo.
Wie sieht es mit AES-NI aus? (Ich habe bei Proxmox meine CPU direkt durchgereicht, das hat mir beim Bareos-Backup den Durchsatz beim Verschlüsseln ordentlich erhöht).
Was sagt denn vnstat -l (aus Debianvnstat) während des Tests? Das Netzwerk ist nicht ausgelastet, oder?
Bremst das Logging? Was sagt der wa Wert, wenn du top aufrufst - steigt der an?

Ich bin kein Profi, was das debugging angeht, aber an den Stellen würde ich erstmal schauen.

Benutzeravatar
whisper
Beiträge: 3393
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von whisper » 22.12.2015 18:29:46

Entropie: Unterschied von Debian Wheezy zu Jessie enorm.
Siehe Screenshot
http://zockertown.de/s9y/index.php?/arc ... essie.html
Da fällt mir doch glatt auf, dass du gar nicht die Distribution erwähnt hast. Aber das kommt jetzt ja mit inxi (btw. ein richtig cooles tool, sollte Standard hier im Forum für Fragenbeantworter sein)
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

hssjc
Beiträge: 3
Registriert: 21.12.2015 21:55:48

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von hssjc » 22.12.2015 20:50:03

ThorstenS hat geschrieben:installiere Debianinxi und schau dir inxi -v6 an. (tIpp von Heisenberg).
Was sagt cat /proc/cpuinfo.
Wie sieht es mit AES-NI aus? (Ich habe bei Proxmox meine CPU direkt durchgereicht, das hat mir beim Bareos-Backup den Durchsatz beim Verschlüsseln ordentlich erhöht).
Was sagt denn vnstat -l (aus Debianvnstat) während des Tests? Das Netzwerk ist nicht ausgelastet, oder?
Bremst das Logging? Was sagt der wa Wert, wenn du top aufrufst - steigt der an?
.
Der WA Wert liegt zwischen 0.0 und 0,2 (nur kurz beim Starten von top)
Das Logging ist nicht blockedend, Log Messages werden in eine Queue geschrieben, und der Logger Prozess schreibt die Queue alle 3 Sekunden.
CPU Info sagt folgendes

Code: Alles auswählen

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
stepping        : 7
microcode       : 0x710
cpu MHz         : 2699.999
cache size      : 20480 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm
bogomips        : 5399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
stepping        : 7
microcode       : 0x710
cpu MHz         : 2699.999
cache size      : 20480 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm
bogomips        : 5399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:
Was sagt denn vnstat -l (aus Debianvnstat) während des Tests? Das Netzwerk ist nicht ausgelastet, oder?
Das Netzwerk ist bei weitem nicht ausgelastet, max 1 Mbit/s Up und Down.

Hier der inxi Output

Code: Alles auswählen

System:    Host: testserver Kernel: 3.16.0-4-amd64 x86_64 (64 bit gcc: 4.8.4) Console: tty 0
           Distro: Debian GNU/Linux 8
Machine:   System: VMware product: VMware Virtual Platform serial: VMware-42 0b 17 b6 9f fe 44 2c-f4 63 ff 79 5c b7 67 af
           Mobo: Intel model: 440BX Desktop Reference Platform Bios: Phoenix v: 6.00 date: 10/22/2013
           Chassis: No Enclosure type: 1
CPU:       Dual core Intel Xeon E5-2680 0 (-HT-MCP-) cache: 20480 KB
           flags: (lm nx sse sse2 sse3 sse4_1 sse4_2 ssse3) bmips: 10800
           Clock Speeds: 1: 2699 MHz 2: 2699 MHz
Graphics:  Card: VMware SVGA II Adapter bus-ID: 00:0f.0 chip-ID: 15ad:0405
           Display Server: N/A driver: N/A tty size: 140x40 Advanced Data: N/A for root out of X
Network:   Card: VMware VMXNET3 Ethernet Controller
           driver: vmxnet3 v: 1.2.0.0-k port: 4000 bus-ID: 03:00.0 chip-ID: 15ad:07b0
           IF: eth0 state: up speed: 10000 Mbps duplex: full mac: 00:20:56:a5:71:1e
Drives:    HDD Total Size: 8.6GB (84.6% used)
           ID-1: /dev/sda model: VMware_Virtual_I size: 8.6GB serial: 00000000000000000001 temp: 0C
           Optical: /dev/sr0 model: NECVMWar VMware IDE CDR10 rev: 1.00 dev-links: cdrom,cdrw,dvd
           Features: speed: 1x multisession: yes audio: yes dvd: yes rw: cd-r,cd-rw,dvd-r,dvd-ram state: running
Partition: ID-1: / size: 7.2G used: 6.4G (95%) fs: ext4 dev: /dev/dm-0
           label: N/A uuid: e2912b58-f0d9-4041-b232-8478f91cd179
           ID-2: /boot size: 236M used: 33M (15%) fs: ext2 dev: /dev/sda1
           label: N/A uuid: 5d95e465-2490-4555-a7cf-a3311904e707
           ID-3: swap-1 size: 0.39GB used: 0.00GB (0%) fs: swap dev: /dev/dm-1
           label: N/A uuid: 911e742c-6dee-4a1a-aa66-dbd84722ed64
Unmounted: ID-1: /dev/fd0 size: 0.00G label: N/A uuid: N/A
           ID-2: /dev/sda5 size: 8.33G label: N/A uuid: N/A
Sensors:   System Temperatures: cpu: 100.0C mobo: N/A
           Fan Speeds (in rpm): cpu: N/A
Info:      Processes: 81 Uptime: 1 day Memory: 247.4/3965.8MB Init: systemd v: 215 runlevel: 5 Gcc sys: N/A
           Client: Shell (bash 4.3.301 running in tty 0) inxi: 2.1.28
Da fällt mir doch glatt auf, dass du gar nicht die Distribution erwähnt hast.
Die Distribution ist Debian 8 Jessie

Gruß Till

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von ThorstenS » 23.12.2015 10:33:38

Zum einen fällt mir auf, dass dein / zu 95% voll ist, das solltest du mal überprüfen.

Zum anderen hier drei Leselektüren:
· http://www.slashroot.in/linux-network-t ... ing-sysctl
· https://blog.cloudflare.com/optimizing- ... e-web-per/
· http://unhandledexpression.com/2013/01/ ... erate-ssl/
Der letzte Link ist besonders interessant, da er auf die ciphers eingeht. AES wird von vMWARE zum Glück durchgereicht.

Laß dein benchmark mal hiermit laufen:

Code: Alles auswählen

sysctl -w net.ipv4.tcp_slow_start_after_idle=0
Desweiteren könntest du mal den Kernel 4.2 aus den backports probieren (habe ich per default auf allen jessie Seervern aktiv)

Code: Alles auswählen

 
echo "deb http://http.debian.net/debian jessie-backports main contrib non-free" > /etc/apt/sources.list/bpo.list
apt-get update
apt-get install -t  jessie-backports linux-image-amd64
reboot
Gruß
/thorsten

Edit: den sysctl Befehl angepaßt

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: SSL Server schafft nicht mehr wie ~1000 Verbindungen

Beitrag von ThorstenS » 09.01.2016 16:11:16

Hast du weitere Fortschritte machen können?

Antworten