Bei einem Kundeneinsatz hatte ich die Aufgabe, die Performance einer Datenbank zu überprüfen. Die Benutzer beschwerten sich über sehr schlechte Reaktionszeiten beim Verbindungsaufbau – teilweise brachen Versuche mit einem “TNS-12535: TNS:operation timed out” Fehler ab. Mehrere Tests mit tnsping zeigten Antwortzeiten von 500 – 32000 ms. Der tnslsnr Prozess auf dem Linux-Server hatte eine CPU Auslastung von mehr als 50%.
Bei der Überprüfung des Listener Logs konnte ein massiver Anstieg an einkommenden Verbindungen festgestellt werden. Die Anzahl stieg von 70 auf 250 Anfragen pro Sekunde – zuviel für das System.
Dieser Blog Beitrag stellt das Connection Rate Limiter Feature des Listeners vor, das verwendet werden kann um die Last von “Logon Storms” zu minieren. Das Feature steht ab Oracle 9.2.0.8 zur Verfügung.
Table of Contents
Konfiguration
Anpassen der listener.ora
Die Konfiguration des Connection Rate Limiters wird über die listener.ora vorgenommen. Für die Konfiguration spielen die beiden Parameter CONNECTION_RATE_[Listener_Name] und RATE_LIMIT eine wichtige Rolle.
Parameter | Beschreibung |
CONNECTION_RATE_[Listener_Name] | Definiert die Anzahl an Anfragen pro Sekunde für einen bestimmten Listener. |
RATE_LIMIT | Dieser Parameter wird für jeden Listener Endpoint gesetzt, bei dem die eingehenden Anfragen limitiert werden sollen. Wenn dieser Parameter auf “yes” gesetzt wird, wird der Wert von CONNECTION_RATE_[Listener_Name] abgeleitet. Alternativ kann auch direkt die Anzahl angegeben werden. |
Die folgende listener.ora limitiert die Anzahl an Verbindungen auf 50 Stück für nur einen der beiden verfügbaren Listener Endpoints.
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = server1 )(PORT = 1521)(RATE_LIMIT = yes)) (ADDRESS = (PROTOCOL = TCP)(HOST = server1 )(PORT = 1522)) ) ) ADR_BASE_LISTENER = /u01/app/oracle CONNECTION_RATE_LISTENER=50
Neustart des Listener
Zum Abschluss der Konfiguration muss der Listener neu gestartet werden – ein Listener Reload ist in diesem Fall nicht ausreichend.
$> lsnrctl stop $> lsnrctl start
Wenn die Anzahl an Abfragen zu hoch ist, wird dies mit dem folgenden Fehler im listener.log protokolliert.
TNS-01158: Internal connection limit reached, preventing dispatcher from connection
Je nach konfigurierten Timeouts auf der Client-Seite, können die Verbindunganfragen mit einem “ORA-12535: TNS: operation timed out” Fehler abbrechen.
Fazit
Mit dem Connection Rate Limiter bietet der Listener eine gute Möglichkeit um bei einem hohen Aufkommen von eingehenden Verbindungsanfragen, die Last des Systems zu reduzieren.