Oscam Server mit Loadbalancer

Aus Zebradem WIKI
Zur Navigation springenZur Suche springen

Das Board mit Freiheiten

Oscam Server mit Loadbalancer

Hallo Oscamfangemeinde
Aus gegeben Anlass (Anfrage eines Users hier im Forum) ein kleiner Ausflug ins Reich von Oscam und sein Loadbalancer. Habe in folgendem Text, Faulheits bedingt, Loadbalancer durch LB abgekürzt.

Durch den LB ist es möglich die Lasten des Server, gerade zu Stoßzeiten, auf mehrere gleiche Karten zu verteilen. Damit man möglichst immer die schnellsten Antwortzeiten bekommt. Gerade wenn viele unterschiedliche Sender auf verschiedenen Transpondern genutzt werden, kann es zu sehr hohen Antwortzeiten des Server (Karte) kommen. Wenn man nun zwei mal die selbe Karte im Server hat, überprüft der LB die Antwortzeiten beider Karten und schickt die Anfragen an die Karte mit der niedrigsten Antwortzeit.

Man sollte aber wissen das der LB im Oscam global arbeitet. Es werden immer alle Reader einbezogen. Das heißt, wenn man Cline's von CCcam Servern eingebunden hat, werden auch diese mit einbezogen. Auch die Karten die der CCcam Server auf hop1/2/3 ... hat. Genauso werden auch newcamd und camd3 Reader vom LB mit benutzt.

LB Grundeinstellung

Die LB Einstellungen kommen im Oscam, in die oscam.conf unter [global]:
lb_mode = 1
lb_save = 100
lb_savepath = /tmp/.oscam/stat
Normal würde die erste Zeile "lb_mode" schon reichen, um LB zu aktivieren. Ich rate aber jedem "lb_save = 100" auch noch zu setzen.

lb_mode - Hiermit wird LB überhaupt aktiviert. Es gibt 5 Einstellmöglichkeiten unter lb_mode.

  • lb_mode = 0 damit ist LB deaktiviert (default)
  • lb_mode = 1 fastest reader first, hier wird immer der schnellste Reader (kleinste Antwortzeit) benutzt
  • lb_mode = 2 oldest reader first, kann ein bisschen verwirren wegen ältesten Reader zuerst. Ist aber eigentlich simple, denn hier werden die Anfragen abwechselnd an die Reader geschickt. Hat man zwei Karten geht Anfrage 1 an Karte 1. Anfrage zwei geht an die zweite Karte da sie nun am längsten nichts bekommen hat. Anfrage 3 geht wieder an die erste Karte da sie nun am längsten nicht geantwortet hat usw. Hat man 3 Karten gehen die Anfragen abwechselnd an Karte eins dann zwei dann drei, nun wieder 1;2;3.
  • lb_mode = 3 lowest usage level, hier wird eine Durchschnitts Antwortzeit aus 5 ecm's berechnet und der Reader mit der niedrigsten Auslastung wird genommen.
  • lb_mode = 10 logging only, der LB ist deaktiviert aber sammelt trotzdem Statistiken. Schaltet man irgend wann von z.b. lb_mode "10" auf "1", kennt der LB die aktuell schnellste Karte, da er ja im Hintergrund fleißig die Statistiken erstellt hat.

lb_save - Default (man setzt keine "lb_save" Zeile in die config) ist "lb_save" mit "0" deaktiviert. Durch "lb_save" werden die gesammelten Statistiken des LB's gespeichert. Damit er nach einem Neustart des Oscam Servers direkt wieder darauf zugreifen kann. Der LB überprüft die Antwortzeiten der Karten und mit lb_save werden diese Werte gespeichert. Nach einem Neustart von Oscam greift der LB nun auf diese gespeicherten Statistiken zurück und muß nicht erst neue Statistiken erstellen. Mit "lb_save = 100" werden jede 100 ecm's diese Antwortzeiten gespeichert. 100 ist Minimum. Man kann aber auch mehr setzen (200, 300 ....). Gerade bei sehr leistungsschwachen Geräten, auf denen Oscam läuft, sollte man vielleicht nicht allzu häufig speichern. Dann bietet sich ein Wert von z.b. 500 ecm's an.

lb_savepath = /tmp/.oscam/stat ist default. Hier kann man einstellen wohin der LB seine Statistiken speichert. Default Ordner ist eigentlich gut geeignet. Wenn man aber seinen Server (also das Gerät selber: PC, Dream oder was auch immer) öfter mal rebootet, ist /tmp nicht geeignet, da alles was in /tmp liegt beim reboot gelöscht wird.

Ich selber nutze lb_mode = 1, damit hab ich die beste Erfahrung gemacht. lb_mode = 2 würde ich nur Leuten empfehlen die keine externen Reader eingebunden haben, sondern nur Lokal Karten. lb_mode = 3 ist zwar :auch empfehlenswert aber hier kann ich meine Lokal Karten nicht bevorzugen. Es werden also selbst wenn man zwei gleiche Karten im Server hat sehr oft externe Karten benutzt, weil sie vielleicht gerade schneller sind. Nur weil meine Lokal Karten Beispielsweise gerade Antwortzeiten um die 1500ms haben und eine externe Karte eines Sharepartners nur 1000ms, möchte ich dennoch nicht das nun der LB die Karte des Sharepartners nutzt weil sie 500ms schneller ist. Im großen und ganzen gesehen ist das für den wo den Sender gerade anfragt zwar schön das er immer Sau niedrige ecm Zeiten hat, aber ich persönlich halte nichts davon wegen eine halben Sekunde Zeitersparnis die Karten meiner Sharepartner zu nutzen obwohl ich sie selber habe.Aber das muß jeder für sich selber wissen. Mode 3 empfehle ich nur wenn z.b. alle Sharepartner Oscam nutzen und alle LB Mode 3 nutzen und alle Bescheid wissen. Im LB Mode 2 sehe ich wie gesagt nur den Sinn drin wenn man keine externen Karten eingehängt hat da man hier meines Wissens auch keine Reader bevorzugen kann.

Reader für den LB bevorzugen

Mit lb_mode = 1 kann man bestimmte Reader bevorzugen (im normal Fall die Lokal Reader). Dies tut man in der oscam.server. Bei den Readern die bevorzugt werden sollen, kommt folgendes dazu:

lb_weight = X

Default steht "lb_weight" auf 100. Je höher der Wert ist, um so mehr wird dieser Reader bevorzugt. Ich habe bei allen Lokal Readern "lb_weight = 300" und alle externen Reader haben "lb_weight = 100". Mit lb_weight kann man quasi die ecm Zeiten der Reader verbessern oder verschlechtern (faken). Faken daher, da man dem LB bessere oder schlechtere Zeiten vorgaukelt. Man ändert also nicht wirklich die"original" ecm Zeiten der Reader. Je höher der "lb_weight" Wert ist, um so schneller werden die ecm Zeiten eines Readers. Um so niedriger der Wert, desto langsamer werden die ecm Zeiten eines Readers.

Wer schon ein bisschen Durchblick hat kann sich auch gerne eine Tabelle von Alno (stb) ansehen --> klick_mich <--. Damit kann man ganz genau einstellen um wieviel Millisekunden die bevorzugten Reader verbessert werden sollen. Die rote Spalte mit "100" ist default (0 Punkt) und spiegelt die "original" Zeiten wieder. Die Zeiten runterwärts sind die tatsächlichen Zeiten des Readers und rüberwärts sind die Werte für lb_value (die gefakten Zeiten). An dem Punkt wo sich die Spalten kreuzen, stehen dann die gefakten Zeiten, nach der Änderung mit lb_weight (abgesehen von der roten Spalte da das die echten Zeiten sind).

Um die Tabelle besser zu verdeutlichen, hatte Alno (stb) dazu ein gutes Beispiel genannt das ich hier 1 zu 1 Zitiere:

Zitat von Alno

Du hast 2 Reader die beide eine durchschnittliche Antwortzeit von 400ms haben. Nun möchtest Du aber einen Reader bevorzugen indem Du dem Loadbalancer 300ms vorgaukeln willst. Also suchst Du die Zeile die mit 400 beginnt und wanderst auf dieser Zeile nach rechts bis du bei ~300 (in der tabelle findest du nur 308) bist. Dann liest Du oben den Wert für lb_value (fake Zeit) ab den der Reader bekommt (130). Diesen trägst Du bei dem Reader ein und schon wird der Reader bevorzugt.

LB Fallback Einstellung

Sollte man noch Reader mit "fallback = 1" in der oscam.server haben, kann man das mit aktiven LB auch entfernen, da dies nun ignoriert wird. Der LB legt selber fest welcher Reader fallback wird. Die Fallback timeout in der oscam.conf unter [global] kann man allerdings weiterhin nutzen. Der LB fällt dann auf seinen selbst definierten Fallbackreader zurück, sobald die Fallbacktime überschritten wurde. Das heißt, liegt die Antwortzeit der Karte über der angegeben Zeit, z.b. 2,5 Sekunden, wechselt der LB auf eine andere Karte.

fallbacktimeout = 2600

Ich habe einen sehr hohen Wert drin, so bleibt er noch bis 2,6 Sekunden auf einer Karte bevor er zu nächsten wechselt. Die meisten nutzen einen Wert zwischen 2000ms und 2500ms.

Meine persönliche Empfehlung (optional):


oscam.conf

lb_mode = 1
lb_save = 100
lb_savepath = /usr/local/etc/.oscam/stat
fallbacktimeout = 2600

oscam.server (Reader)

lb_weight = 300 # für lokal Reader
lb_weight = 100 # für externe Reader

Experteneinstellung

Folgender Text ist nur für Leute die sich auskennen. Es gibt noch die Möglichkeit den LB ein Feintuning zu unterziehen. Da die default Werte (sind automatisch gesetzt wenn LB aktiv ist und keine weiteren LB Einstellungen eingetragen werden) eigentlich schon perfekt sind, sollte man auf jeden Fall die Finger von lassen, wenn man keinen wirklichen Grund hat diese Einstellungen zu ändern. Wer nicht weiß was er da tut sollte sowieso die Finger von lassen.

  • lb_nbest_readers = X Damit kann man festlegen wie viel beste Reader der LB wählt. Default ist 1.
  • lb_nbest_percaid = caid1:count1,caid2:count2,1702:2 Das gleiche wie "lb_nbest_readers", nur hier kann man es für einzelne CAIDs gesondert einstellen. "lb_nbest_readers" bleibt als Globaleinstellung und "lb_nbest_percaid" dient dann zum gezielten einstellen bestimmter CAID'.
  • lb_nfb_readers = X Wie viel Fallbackreader der LB wählt. Default 1.
  • lb_min_ecmcount = X Nach wie viel ecm's sich der LB auf einen Reader festlegt. Default ist 5
  • lb_max_ecmcount = X Nach wie viel ecm's der LB wieder überprüft ob es einen besseren (schnelleren) Reader gibt. Default sind 500.
  • lb_reopen_seconds = X Nach wie viel Sekunden, Reader die nicht geantwortet haben, erneut angefragt werden. Default ist 900.
  • lb_retrylimit = X (Wert ist in Millisekunden) hiermit kann man unterbinden das der LB nach einer Weile (lb_max_ecmcount) schaut ob es einen "besseren" Reader gibt. Wenn der Reader auf dem sich der LB festgelegt hatte, weiterhin unter 800ms antwortet, sucht er gar nicht erst nach einem "schnelleren" Reader. Nach default 500 ecm's würde der LB erst mal wieder an alle Reader mit der passenden CAID ecm's schicken, um zu sehen ob einer schneller ist. So lang der alte Reader aber weitehrin unter 800ms antwortet, bleibt der LB bei diesem. Default ist 800.
  • lb_retrylimits = CAID:time,1702:900 Das selbe wie bei retrylimit. Nur hier kann man noch Feintuning machen und für einzelne CAIDs eigene Zeiten angeben. Man kann also beide Optionen setzen, "retrylimit" allgemein und "retrylimits" für bestimmte CAIDs (spezifisch).
  • lb_stat_cleanup = hour Nach wieviel Stunden die Statistiken des LBs gelöscht werden. Default = 336.
  • lb_use_locking = 0|1 Beim aktivieren werden die ecm Anfragen synchronisiert. Die Anfragen werden nicht mehr gleichzeitig verarbeitetet. Das soll vor allem langsamen System helfen mit hoher Last.Denn die ECM requests kommen derart schnell und gleichzeitig rein, dass der Eintrag noch gar nicht im ECM cache ist, wenn der nächste schon bearbeitet wird. Somit verhindert das aktivieren dieser Option, das ECM's die im Cache sind, mehrfach zum Reader geschickt werden. Es kann aber unter Umständen, da Multithreading verhindert wird, zu höheren Antwortzeiten kommen. Default ist 0
  • lb_noproviderforcaid = CAID1,CAID2... Der LB legt automatisch für jede CAID und Provider Kombination die angefragt wird Statistiken an. Dies kann man hiermit für bestimmte CAIDs unterbinden. Der Sinn ist folgender: Bei HD+ 1830 zum Beispiel kamen von Camd3 (machen aber auch andere Emus) mal Anfragen über Provider "000000", mal über "003411" oder "008011". Gibt man nun bei dieser Funktion CAID 1830 an werden alle Anfragen über Provider "000000" abgewickelt und es gibt so auch nur Statistiken für 1830:000000:xxxx. So kann man seine Statistiken kleiner halten. Default ist hier nichts gesetzt.
  • lb_reopen_mode = 0|1 Hier legt man fest wie schnell vom LB geblockte Reader wieder freigegeben werden. Mit "0" werden die Reader nach der angegebenen Zeit (lb_reopen_seconds) wieder freigegeben. Stellt man auf "1" werden die geblockten Reader schneller wieder reaktiviert. Default = 0.
  • lb_max_readers = limit Wenn noch keine Statistiken vorhanden sind oder "lb_max_ecmcount" erreicht wurde, prüft der LB die verfügbaren Reader ob sie einen Sender öffnen können und wie schnell sie das können (ecm time). Dabei werden entweder an alle Reader mit der passenden CAID Anfragen gesendet, oder man setzt hier ein Limit wie viel Reader der LB höchstens "nerven" darf. Default = 0 (unbegrenzt).
  • lb_auto_betatunnel = 0|1 Aktiviert man diesen Parameter muß man sich nicht mehr um die Betatunnel Einträge bei den Usern kümmern. Der LB schickt bei den CAIDs 1834,1801 und 1835 auch eine Anfrage an 1722 beziehungsweise bei CAID 1833 an 1702. Die CAID wo dann zuerst Antwortet wird benutzt. Es werden also nicht nonstop doppelte Anfragen rausgeschickt. Man kann aber auch weiterhin einen eigenen Betatunnel setzen, dieser wird dann bevorzugt. Default ist diese Funktion aktiviert.

Alle Einstellungen kommen auch in die oscam.conf [global] Section.
Fehlen diese Einstellungen in der Config und der LB ist aktiviert, werden die Default Werte benutzt.



[ Zurück zu Hauptseite ]
[ Zurück zu OScam ]