BenBE's humble thoughts Thoughts the world doesn't need yet …

22.11.2012

Schlimmer als Debian

Filed under: Software — Schlagwörter: , , , , , — BenBE @ 07:17:05

Dass ich nun nicht gerade über die Aktualität von Debian erstaunt bin, dürfte relativ gut bekannt sein – egal ob wir von über die Geschmacksrichtung Veraltet, Instabil oder Kaputt reden. Aber dennoch eignet sich Debian als gutes Beispiel um eine neue Metrik einzuführen, die die Aktualität (oder Inaktualität) von Software beschreibt, da Software die in Debian enthalten ist zumindest soweit ausgereift ist, dass man sie produktiv einsetzen kann.

Inaktualität ist an sich zwar nichts Schlechtes – zumindest bei der bereits genannten Distribution kommt damit ein recht solides Werk raus, aber ab irgendeiner Stelle sollte man klar sagen, so alt und nicht älter. Im Folgenden möchte ich diese Grenze als „Debian-Grenze“ bezeichnen. (more…)

Flattr this!

26.08.2012

Threads und Fibers

Filed under: Software — Schlagwörter: , , , — BenBE @ 01:40:34

Für ein Projekt, welches ich bereits seit etwas längerer Zeit vorbereite, benötige ich eine sehr flexible IO-Schicht, mit der ich eine Reihe verschiedener Tätigkeiten wie IO und anderer Events möglichst flexibel parallelisieren kann. Nun gibt es für solche Aufgaben zwar üblicherweise Threads, aber da die Aufgaben zum einen sehr kurzweilig sind, andererseits aber unter gewissen Umständen blockieren können, funktioniert der Ansatz über Thread Pools nur bedingt. Eine vollständige asynchrone Bearbeitung der Ereignisse scheided auf Grund der Komplexität aber auch aus, da das System leicht erweiterbar bleiben muss. Was also benötigt wurde, ist ein Mittelweg aus beiden Ansätzen.

Ein Ansatz für einen solchen Mittelweg bieten Fibers, die analog zu POSIX Threads dem Programm erlauben, mehrere Ausführungsstränge zu erzeugen und damit die Abläufe in der Anwendung zu parallelisieren. Fibers fungieren dabei vollständig im User Mode und sind dadurch gegenüber PThreads oder gar geforkten Prozessen wesentlich leichtgewichtiger beim Wechseln des Zustands. (more…)

Flattr this!

15.08.2012

Kurz notiert und abgehakt

Filed under: Allgemein,Software — Schlagwörter: , , — BenBE @ 21:47:15

Da ich gerade am Vorbereiten des Releases von GeSHi arbeite, durchsuchte ich routinemäßig den Bugtracker, um zu schauen, was so an Fehlern gemeldet wurde. Dabei stieß ich unter anderem auch auf einen Fehler, der das Variablen-Highlighting betraf. Soweit unspektakulär. (more…)

Flattr this!

23.06.2012

RRDTool für PHP 5.4

Filed under: Software — Schlagwörter: , , , , , , , — BenBE @ 22:58:54

Nach dem letztens endlich das Packaging für die von mir etwas für aktuellere PHP-Versionen gepflegte RRDTool-Extension abgeschlossen war, dachte ich eigentlich, dass das soweit auch für PHP 5.4 funktionieren sollte. Da ich wegen dem ausstehenden Support für den Suhosin-Patch aber noch nicht upgraden wollte, gab es natürlich wenig Chancen, das selber zu überprüfen.

Vor knapp 4 Wochen habe ich mich dann aber doch hingesetzt, um meinen Server auf PHP 5.4 zu aktualisieren. Nachdem das Update selbst recht unproblematisch verlief und bis auf wenige Extensions, die einen expliziten Arschtritt zum Compilen haben wollten, alles lief, war die RRDTool-Extension dran. Und (Grüße an Murphy) es wollte nicht compilieren. Aber glücklicherweise waren das nur ein paar Kleinigkeiten, die sich im Wesentlichen darauf beschränkten, den Typ pval durch zval beim Abfragen von Parametern auszutauschen.

Sobald das durch war, funktionierte das auch mit dem Compilieren und alle Scripte mit der Extension liefen wieder wie immer.

Die neu, nun mit Support für PHP 5.4, gepackagedte Version gibt es ab sofort; nach dem ich nach einer stressigen Zeit dazu gekommen bin, das alles zusammenzupacken. Außer der oben genannten Änderung ist nix an Features hinzugekommen. Wird also PHP 5.4 nicht benötigt, reicht auch die alte Version. Die neue RRDTool-Extension für PHP 5.4 (Version 0.2) gibt unter dem genannten Link.

Flattr this!

26.03.2012

RRDTool mit PHP nutzen

Filed under: Software — Schlagwörter: , , , , , — BenBE @ 00:03:40

Wer meinen Blog bereits ein wenig verfolgt hat, wird mitbekommen haben, dass manchmal Graphen auftauchen, die mit RRDTool erzeugt wurden. Nun habe ich ja bereits einmal zu RRDTool etwas geschrieben, aber den von mir geschriebenen Wrapper, sowie den aktuellen Code-Stand (nach angewendetem Patch) hatte ich bisher noch nicht weiter veröffentlicht. Das werde ich hier jetzt einfach mal nachholen, damit sich keine weiter beschweren kann, dass RRDTool mit PHP so kompliziert zu nutzen geht.

Das Projekt besteht hierbei aus zwei Teilen: Neben der PHP-Extension, die sich um die Anbindung an librrd4 kümmert, zusätzlich aus einem Userland-Teil, der einen Wrapper um die API bildet und eine ganze Menge der Operationen in OOP kapselt. Die API dazu ist zwar nicht die schönste, aber für meine Projekte hatte das bisher immer vollkommen gereicht und die wichtigsten Funktionen sind leicht nutzbar. Zusätzlich hab ich einen Log-Parser basierend auf meinem Wrapper als eine kleine Demo-Anwendung eingebaut, so dass man sich die Funktionsweise etwas anschauen kann. (more…)

Flattr this!

30.09.2011

Thread Pools

Filed under: Software — Schlagwörter: , , — BenBE @ 10:38:24

Neuere Prozessoren bieten immer mehr Leistung durch immer mehr parallele Kerne bei aber seit längerem nahezu gleich gebliebener Taktrate. Somit bleibt einem ohne Anpassung seiner Programme diese zusätzliche Leistung verwehrt. Nur in dem man sein Programm in mehrere Teile spaltet, die parallel ablaufen können, kann man sein Programm auch auf heutigen Prozessoren in optimaler Geschwindigkeit ausführen.

Für die Parallelisierung gibt es hierbei je nach Betriebssystem verschiedene Mittel. Die wohl bekanntesten Mittel stellen hierbei Threads unter Windows, bzw. das Forken unter Linux dar. Aber auch etwas exotischere Mittel wie PThreads oder Fibers bieten gute Möglichkeiten, um ein Programm auf mehrere CPUs zu verteilen.

Die verschiedenen Ansätze haben dabei gemeinsam, dass für verschiedene Aufgaben jeweils mehr oder weniger Umfangreiche Objekte erzeugt werden müssen, die für jede Aufgabe einen Zwischenstand enthalten, den sogenannten Kontext. Dieser ist bei Fibers (Windows) sehr klein, bei Multitasking mittels Prozessen aber durchaus sehr groß. Je größer dabei solch ein Kontext wird, desto langsamer wird das Umschalten zwischen mehreren Aufgaben. Außerdem steigt mit der Größe des Kontext oftmals auch der Aufwand für die Erzeugung eines neuen Kontextes, was insbesondere, wenn man viele kleinere Aufgaben parallelisieren möchte von großer Bedeutung ist.

Eine relativ gute Einführung (leider hinter einer via BugMeNot umgehbaren Paywall *sigh*) gibt es beim Linux Magazine. Auch die beiden Videos mit der Erklärung kann ich wärmstens ans Herz legen.

Nach diesem kurzen Abstecher nun wieder zurück zum eigentlichen Thema dieses Beitrages, denn wie auch im verlinkten Beitrag, sowie den beiden darin enthaltenen Videos erklärt, möchte man in aller Regel den Setup-Aufwand für viele kleine Aufgaben möglichst gering halten. Zu diesem Zweck bietet Windows sogenannte Threadpools. Etwas ähnliches bietet Linux nicht von Haus aus; doch das lässt sich recht einfach ändern.

Für ein eigenes Projekt unter Linux war ich nämlich selber auf der Suche und wurde nach etwas Suchen auch bereits fündig. Die gefundene Implementation ist zwar funktional und minimalistisch gehalten, hat jedoch ein paar kleinere Ecken und Kanten, weshalb ich sie für meine Zwecke noch einmal überarbeitet habe.

Da der Source somit eh einmal komplett bearbeitet wurde, nutze ich die Chance (insbesondere auf Grund des vielfachen Wunsches eines einzelnen Herren), um die Funktionsweise einmal direkt am Source des Thread Pools zu erklären. Eine Vorwarnung möchte ich aber bereits jetzt geben: Das wird etwas technisch 😉 (more…)

Flattr this!

28.09.2011

Überblick über Projektaktivität gewinnen

Filed under: Software — Schlagwörter: , , , , — BenBE @ 22:13:15

Manchmal hat man ein Projekt, von dem man gerne wissen möchte, ob noch aktiv an diesem entwickelt wird. Aber nicht immer sind entsprechende Grafiken mit aussagekräftigen Zahlen verfügbar. Eine recht einfache Möglichkeit, dennoch einen Überblick zu bekommen, ist ein Blick in die Commit Logs des Projektes. Wenn diese viel Aktivität zeigen, ist ein Projekt mit sehr hoher Wahrscheinlichkeit noch aktiv. Aber stupide Datumswerte sind oftmals recht schwer zu überblicken. Etwas mehr Grafik wäre hier wünschenswert. Und genau hier kann man mit etwas Bash Magic und ein wenig RRDTool nachhelfen. (more…)

Flattr this!

15.09.2011

Automatisches Link Quality Management für OLSR+Tinc

Filed under: Software — Schlagwörter: , , , , , — BenBE @ 20:26:07

Möchte man mehrere dezentrale Standpunkte in einem Mesh-Network miteinander verbinden, so bieten sich in der Regel Lösungen mittels eines VPN an. Diese sind oftmals auch mit wenig Aufwand eingerichtet, können aber mitunter gewisse Nachteile mit sich bringen. Einer dieser Nachteile betrifft zum Beispiel den Aufbau der Routing-Tabelle, wenn sich das VPN nicht vollständig wie der physikalische Counterpart verhält. Dies ist bei Tinc, einer sehr einfach nutzbaren VPN-Software der Fall, die bei Nutzung des Switch-Modus das gesamte VPN als eine Broadcast-Domäne betrachtet. Da in der Regel aber nicht wirklich jeder VPN-Client mit jedem anderen kommuniziert, führt dies zum Verlust von Struktur-Informationen bei Mesh-Netzwerken, die mittels Broadcast versuchen, die Netzwerk-Struktur zu erkunden. Einer der bekanntesten Vertreter ist hierbei OLSR, was auf Grund dieses Verhaltens haufenweise „virtuelle“ Verbindungen zwischen den VPN-Clients sieht, die real nicht existieren, was mitunter zu ungünstigen Verhaltensweisen beim Aufbau der Routingtabelle führt. (more…)

Flattr this!

24.08.2011

Schleifchen erwartet

Filed under: Software — Schlagwörter: , , , — BenBE @ 12:30:50

Unter der Kategorie Kuriositäten kann man glaube folgenden GCC-Bug abhandeln, der bei mir mit folgendem Source auftrat:

        // Run the job we've taken
        if(cleanup_func) {
            pthread_cleanup_push(cleanup_func, cleanup_arg);
        }

        job_func(job_arg);

        if(cleanup_func) {
            pthread_cleanup_pop(1);
        }

Wobei job_func ein normaler Callback-Typ der Form

typedef void (* dispatch_func_t)(void *);

ist, also einen Pointer entgegen nimmt und nix zurückliefert. Nunja. Versucht man obigen Source (im Zusammenhang mit etwas mehr Source eines Thread-Pools zu compilieren, erhält man recht überraschend eine Fehlermeldung vom GCC (4.6.1-4):

gcc -g -Wall -Werror -std=c99 -I./src -O9 -o ./obj/threadpool.o -c ./src/threadpool.c
./src/threadpool.c: In Funktion »_threadpool_dowork«:
./src/threadpool.c:120:9: Fehler: expected »while« before »job_func«

Und ja: Der will da wirklich ne While-Schleife haben! Geben wir sie ihm also:

        // Run the job we've taken
        if(cleanup_func) {
            pthread_cleanup_push(cleanup_func, cleanup_arg);
        }

        //GCC fails if I DON'T write a while loop here. Let's make it happy!
        while(0);

        job_func(job_arg);

        if(cleanup_func) {
            pthread_cleanup_pop(1);
        }

Und der GCC ist zufrieden.

Flattr this!

12.07.2011

Es funktioniert doch!

Filed under: Software — Schlagwörter: , , , , , , , — BenBE @ 15:31:26

Eine der schlimmsten Krankenheiten, wenn nicht gar Geschwüre unter Programmierern ist der Satz „Aber es funktioniert doch!“, wenn man sie darauf hinweist, dass ihre Software fehlerhaft implementiert ist. Unabhängig davon, was wirklich falsch ist, oder wie groß die nötige Änderung ist. So aus Prinzip halt. (more…)

Flattr this!

« Newer PostsOlder Posts »

Powered by WordPress