Bug 25958 - Listener Performance in großen Umgebungen
Listener Performance in großen Umgebungen
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: Listener (univention-directory-listener)
UCS 3.0
Other Linux
: P5 normal (vote)
: UCS 3.0-1
Assigned To: Arvid Requate
Stefan Gohmann
:
Depends on:
Blocks: 26039 26040
  Show dependency treegraph
 
Reported: 2012-01-30 07:26 CET by Stefan Gohmann
Modified: 2012-03-04 14:34 CET (History)
2 users (show)

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional): UCS Performance
Max CVSS v3 score:


Attachments
Patch für listener/memberuid/skip und listener/uniquemember/skip checks (2.47 KB, patch)
2012-01-30 15:29 CET, Arvid Requate
Details | Diff
Patch zum effizienteren realloc bei vielen Attribut-Werten. (4.64 KB, patch)
2012-01-30 15:33 CET, Arvid Requate
Details | Diff
O2 und Protected Stack (777 bytes, patch)
2012-01-30 16:22 CET, Moritz Muehlenhoff
Details | Diff
D_FORTIFY_SRC (1.41 KB, patch)
2012-01-30 16:23 CET, Moritz Muehlenhoff
Details | Diff
Korrekter Aufruf von open(), nötig für D_FORTIFY (761 bytes, patch)
2012-01-30 16:23 CET, Moritz Muehlenhoff
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Stefan Gohmann univentionstaff 2012-01-30 07:26:12 CET
Ich baue gerade eine Umgebung mit 30.000 Benutzern auf, um die S4 Connector Performance zu testen. Alle Benutzer sind in der Domain Users Gruppe.

Die Benutzer wurden in einer Schleife angelegt, dadurch wird Domain Users sehr häufig aktualisiert. In der listener Log ist, auch bei Debug Level 4, zu sehen, dass der Listener knapp eine Sekunde bei "updating Domain Users" steht.

30.01.12 07:14:57.987  LISTENER    ( INFO    ) : notifier returned = id: 114736 dn: cn=Domain Users,cn=groups,dc=deadlock65,dc
=local    cmd: m
30.01.12 07:14:57.988  LISTENER    ( INFO    ) : updating cn=Domain Users,cn=groups,dc=deadlock65,dc=local
30.01.12 07:15:49.181  LISTENER    ( ALL     ) : blocking signals (was 0)
30.01.12 07:15:49.182  LISTENER    ( ALL     ) : unblocking signals (was 1)
30.01.12 07:15:49.182  LISTENER    ( ALL     ) : got 3069270 bytes for cn=domain users,cn=groups,dc=deadlock65,dc=local
Comment 1 Stefan Gohmann univentionstaff 2012-01-30 13:30:48 CET
Wir haben vorhin ein paar mögliche Optimierungen diskutiert:

- der Notifier könnte feststellen, dass der Listener die Änderung später nochmal bekommt und eine DN zurückliefern, die der Listener ignoriert

- der Listener könnte immer DNs im Block abfragen und dann beispielsweise immer 100 Änderungen abfragen und wenn DNs doppelt auftauchen, diese nur einmal betrachten
Comment 2 Arvid Requate univentionstaff 2012-01-30 15:29:27 CET
Created attachment 4122 [details]
Patch für listener/memberuid/skip und listener/uniquemember/skip checks

Die Performance lässt sich deutlich dadurch steigern, wenn man die duplicate-Member Checks deaktiviert. Mit dem angehängten Patch weerden diese nur noch dann durchgeführt, wenn die entsprechende UCR-Variable aktiviert ist und sonst nicht.
Comment 3 Arvid Requate univentionstaff 2012-01-30 15:33:48 CET
Created attachment 4123 [details]
Patch zum effizienteren realloc bei vielen Attribut-Werten.

Mit dem angehängten Patch wird nicht für jeden Attribut-Wert separat ein realloc durchgeführt, sondern einmal für die Anzahl der Werte. Zusätzlich wird der legacy strcpy-Code vollständig durch den generelleren memcpy-Code ersetzt, wodurch ein zusätzliches strlen pro Attributwert entfällt. An Performance bringt das nicht viel, macht den Code aber schlanker.
Comment 4 Moritz Muehlenhoff univentionstaff 2012-01-30 16:21:27 CET
Der angehängte Patch aktiviert Compiler-Optimierungen (-O2) für den Build, aktuell sind sie nicht aktiviert. Außerdem wird -fstack-protector --param=ssp-buffer-size=4 aktiviert, mit dem der Prozess bei einem Überlauf kontrolliert beendet wird. (flags.patch)

Außerdem sollten wir D_FORTIFY_SOURCE aktivieren; dadurch ersetzt der Compiler Speicherzugriffe mit konstanter Länge. fortify.patch, open.patch)
Comment 5 Moritz Muehlenhoff univentionstaff 2012-01-30 16:22:32 CET
Created attachment 4124 [details]
O2 und Protected Stack
Comment 6 Moritz Muehlenhoff univentionstaff 2012-01-30 16:23:00 CET
Created attachment 4125 [details]
D_FORTIFY_SRC
Comment 7 Moritz Muehlenhoff univentionstaff 2012-01-30 16:23:27 CET
Created attachment 4126 [details]
Korrekter Aufruf von open(), nötig für D_FORTIFY
Comment 8 Arvid Requate univentionstaff 2012-02-07 12:52:50 CET
Der Patch aus Comment 3 ist jetzt übernommen, alles weitere später, dafür gibt es jetzt Bug #26039. Der Performance Guide wird per Bug 26040 erweitert. Changelog ist angepasst.
Comment 9 Stefan Gohmann univentionstaff 2012-02-23 07:33:25 CET
Die Performance ist deutlich besser. Bei einer 20000 Benutzergruppe dauert es nur noch 1,2 Sekunden, anstatt 38 Sekunden.

Changelog OK.
Comment 10 Sönke Schwardt-Krummrich univentionstaff 2012-03-04 14:34:11 CET
UCS 3.0-1 wurde veröffentlicht. Sollte der hier beschriebene Bug mit einer
neueren Version von UCS erneut auftreten, so sollte dieser Bug dupliziert
werden: "Clone This Bug"