Univention Bugzilla – Bug 25958
Listener Performance in großen Umgebungen
Last modified: 2012-03-04 14:34:11 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
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
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.
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.
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)
Created attachment 4124 [details] O2 und Protected Stack
Created attachment 4125 [details] D_FORTIFY_SRC
Created attachment 4126 [details] Korrekter Aufruf von open(), nötig für D_FORTIFY
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.
Die Performance ist deutlich besser. Bei einer 20000 Benutzergruppe dauert es nur noch 1,2 Sekunden, anstatt 38 Sekunden. Changelog OK.
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"