Performance Probleme bei 400+ Usern - NC aber nicht ausgelastet

Hallo Community,

wir haben an diversen unserer Schulen eine NC in Version 20.0.4 am Laufen.
An einer Schule wird diese wirklich exzessiv genutzt und wir haben dort deutliche Latenzprobleme ab ca 400 gleichzeitiger Sessions auf der NC.

Ich weiß, dass die NC Vorgabe ein NC Cluster ist bei mehr als 150 Usern.
Allerdings schreiben andere NC Admins in div. Foren, dass Sie mit 400-600 User auch mit einer einzigen NC keine Probleme haben.

Wir haben sonst aber schon viel unternommen, bisher ohne den zündenden Erfolg.
Die VM ist auch überhaupt nicht ausgelastet von der Hardware her, die langweilt sich fast…

Nun aber mal zu den Fragen, die man beantworten sollte:

  • Bei welchen Anbieter? Was für ein Server? v-server, shared, root, usw. Oder Lokal?
    Lokaler Server an der Schule, mit VMware ESXi 6.7

  • Auf welcher Hardware? PC, Raspberry PI, Banana, NAS usw…
    Der Server hat 2x Intel Xeon E5-2620 v4 mit je 8 Kernen und 16 Threads.
    RAM: 128GB
    Als Platten haben wir 6x Intel DC 4510 SATA-3 SSD mit je 1.8TB im RAID-6
    Die NextCloud läuft auf einer PCIe NVMe SSD “Samsung PM1735”.

Auf dem VMware Server laufen im Moment 8 virtuelle Server.
Das sind 4 Windows Server (AD + Schüler-Fileserver, KMS, Exchange 2019 und ein Lehrer-Fileserver).
Außerdem kommen noch eine Firewall, die Backup-VM und ein WLAN Controller dazu.

  • Betriebssystem sowie Version ALLER beteiligten Systeme
    VMware ESXi 6.7 Update 3 ist auf dem Server installiert
    Die NC läuft auf einem Ubuntu 18.04 LTS.

  • Nextcloud Version?
    20.0.4

  • PHP Version?
    7.4 FPM

  • Welche Datenbank? MySql,Engine X (Nginx),MariaDB usw…
    Postgres v10

  • Apache version, usw.
    Apache v2.4.29

  • Läuft NC in Docker,Snap oder VM
    Kein Docker und kein Snap.
    NC läuft direkt auf der VMware VM.
    Die Installation wurde mit dem Skript von “Hansson IT” gemacht.
    Siehe Link: Documize

  • Netzwerk Aufgliederung:
    Die NC hängt im internen Netz und alle Anfragen von extern via Port 443 werden über die Firewall zur NC einfach stumpf weitergeleitet.
    Wenn die NC aber langsam ist dann ist diese auch von intern langsam (Test über eine der weiteren VMs).
    Als Internetanschluss haben wir einen 1000/200 MBit/s Anschluss, der etwa bei 80 MBit/s steht von der Auslastung her.

  • Wurden vor kurzem Server Updates gemacht? Wenn ja von was?
    Klar wurden Updates gemacht, die NC VM ist vom Linux her auf dem aktuellen Stand.
    Das ist aber nicht die Ursache, die Probleme gab es davor schon.

  • Habt ihr die Logs angesehen von Nextcloud und von System?
    In der NC sind diverse Fehlermeldungen im Log (leider), allerdings keine, die ich jetzt zu diesem Problem zuordnen würde.

Folgende Meldungen hab ich im Log:
Module ‘igbinary’ already loaded at Unknown#0
“External storage not available: Storage unauthorized. Invalid request for / (ForbiddenException)”

  • Bei was für einer Aktion ist der Fehler aufgetreten?
    So bald wir mehr als 400 User gleichzeitig auf der NC haben.

An folgenden Config Files hab ich überall dran gedreht…

Wir haben in der /etc/php/7.4/fpm/php.ini folgende Anpassungen gemacht:
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
max_execution_time = 3600
max_input_time = 3600
memory_limit = 2048M
upload_max_filesize = 10240M

Zusätzlich habe ich obige Änderungen auch in die /etc/php/7.4/cli/php.ini so eingetragen.

in der /etc/postgresql/10/main/postgres.conf
max_connections = 1500

in der /etc/apache2/apache2.conf
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted

Protocols h2 h2c http/1.1

in der /var/www/nextcloud/config/config.php
memcache.local’ => ‘\OC\Memcache\APCu’,
filelocking.enabled’ => true,
memcache.distributed’ => ‘\OC\Memcache\Redis’,
memcache.locking’ => ‘\OC\Memcache\Redis’,
redis’ =>
array (
host’ => ‘/var/run/redis/redis-server.sock’,
port’ => 0,
timeout’ => 0.5,
dbindex’ => 0,
password’ => ‘----------------------------’,
),
quota_include_external_storage’ => false,

==> der Redis Server ist ebenfalls installiert

Zusätzlich haben wir folgende zwei Files angepasst:

in der /etc/php/7.4/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 360
pm.start_servers = 50
pm.min_spare_servers = 50
pm.max_spare_servers = 100

in der /etc/php/7.4/fpm/pool.d/nextcloud.conf
pm = dynamic
pm.max_children = 360
pm.start_servers = 50
pm.min_spare_servers = 50
pm.max_spare_servers = 100

==>
Was mich da aber wundert, egal was ich da einstelle an “Spare Servers”, die Last der NextCloud geht nicht nach oben. Überall liest man, dass die Last dann steil nach oben geht wenn man an den Werten in diesen beiden Files dreht.
Bei uns ist da, auch nach einem Serverreboot keine Verbesserung zu sehen…
Ich habe eine Auslastung von maximal 8 Kernen und 5 GB RAM, also bis zu den 16 Kernen und 16 GB RAM noch “etwas” Luft nach oben. Ich komm einfach nicht dahinter wo es da klemmt oder besser gesagt der Limiter sitzt…

Vielleicht hat ja eine/r eine Idee?

Mit Postgresql kenne ich mich nicht aus. Die mySQL oder mariaDB kann man relativ viel durch Cache-Einstellungen erreichen, da ein kleiner Cache schnell zu Engpässen in der i/o-Performance führt. Dort gibt es Tuning-Scripte, die den Bedarf anhand der Laufzeitdaten abschätzen. Ich würde mal schauen, ob i/o ein Limit ist und ggf. nach ähnlichen Tools suchen.

Andere Idee: Wenn du zu wenige Verbinungen/php-Prozesse/DB-Abfragen zulässt. Zahl der Verbindungen müsstest du direkt schauen und ausprobieren, php-Prozesse solltest du auch schauen können wir ausgelastet sind, falls zu wenig DB-Connections möglich sind, wäre da idealerweise was in den Logs.

Vielen Dank tflidd für deine Message.
Ich selbst hab von Datenbanken auch leider wenig Ahnung, wenn mir da also jemand nen Tipp hätte wäre ich sehr dankbar.

Habe nun mal testweise in der postgres.conf noch folgendes geändert:
shared_buffers von 128MB --> 256 MB erhöht
max_files_per_process aktiviert und auf 1000 gesetzt.

Es hat sich aber leider nichts verändert.
Das Webinterface geht weiterhin in die Knie (im Moment sind 513 User parallel online) und der Server ist immer noch nicht ausgelastet (5 CPUs und 4.5GB RAM gefüllt von 16CPU/16GB-RAM).

Hallo,

unter Volllast wäre es interessant was über die Leitung geht, ggf. mal mit iftop schauen ob die Upload Bandbreite vielleicht schon unzureichend ist.
Wie sehen denn die Settings im Apache aus?
mpm_event.conf

Viele Grüße

Wurden der VM 16 logische Kerne vom Hostsystem zugewiesen? Das kann zu Problemen führen, da für diese VM der esx alle Kerne die eingestellt sind zur Verfügung stellen muss. Selbst wenn diese in der VM nicht ausgelastet sind. Das ist besonders schlecht, wenn die Kerne über zwei Sockel verteilt sind. Am besten läuft die VM wenn sie lokal in einer CPU ausgeführt werden kann.

danke pseudex.

Den Tipp hab ich mal beherzigt und der VM nur noch 10 Kerne gegeben (nachdem die VM heute bis auf 8 Kerne ausgelastet war).

Die Apache Settings schau ich mir morgen mal genauer an.
Danke schonmal bis hierhin :slight_smile:

Würde ich mir anschauen, falls die Meldung häufiger auftritt. Ggf. hat der Fileserver auch ein Connection Limit.

Der Fileserver ist ein Windows Server 2019, dieser hat im Moment 16384 gleichzeitige Dateizugriffe (Standardeinstellung) bei maximal 16 mio Usern (wir haben aber nur ca 1500 User).

Also bei im Moment 350 Usern sagt der Fileserver, dass seine LAN Schnittstelle eine maximale Auslastung von 0,06-0,4% hatte (was maximal 40 Mbit/s entsprechen würde). Der Server hängt per 10G am vSwitch.

iftop sagt bei den “rates” eine Auslastung von max. 4 Mb.

iotop sagt bei den WRITES ein max. von 300k/s.

Alles in allem würde ich sagen, dass die Kiste noch weit weg von ausgelastet ist…

Dort scheint noch der Default gesetzt zu sein:

*’<'IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
‘<’/IfModule>

dazu müsstest mal die Apache Error Logs ansehen, obs dazu Meldungen gibt, ggf. reichen die Worker nicht aus um die Last zu verarbeiten.

ich sehe gerae, dass die NC das mpm_Event gar nicht nutzt.
Bei den “mods-enabled” ist nur mpm_prefork eingetragen.

Und im Log finde ich das hier:
[Fri Feb 12 06:25:08.248194 2021] [http2:warn] [pid 1578] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.

Sollte ich auf mpm_event umstellen?

in der mpm_prefork.conf steht das hier:

'<'IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
‘<’/IfModule>

davon seh ich im Log nix, da sind keine Meldungen dazu drin…
Ich habe nun aber trotzdem die Werte in der mpm_prefork mal erhöht auf 25/25/50/350.
Mal sehen ob sich was ändert…

dann nutzt ihr bisher kein php-fpm?
die umstellung auf fpm und mpm_event sollte noch einiges an performance bringen.

doch php-fpm ist aktiviert und läuft auch. Das sieht man unter htop, alles voll damit … :smiley:

Hast du mir da vllt eine Anleitung, wie ich da am Besten vorgehen könnte, um auf mpm_event umzustellen?

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event

sudo service apache2 restart

Am besten machst Dir vorher nen Snapshot.

Kurze Info noch zum Problem:
Wir haben nun auf NGINX umgestellt, der soll perfomanter sein als der Apache.

Außerdem haben wir nochmals an den PHP settings gedreht und werden nun mal schauen ob das hilft. Wenn ja dann werde ich die Settings hier veröffentlichen.