D & FlashPolleD

Door StM op dinsdag 27 december 2011 00:40 - Reageren is niet meer mogelijk
CategorieŽn: D, Linux, Research, Views: 2.468

Het is al weer even geleden dat ik hier wat gepost had. En in de tussentijd is er redelijk wat gebeurd. Bestaande projecten zijn groter geworden en nieuwe projecten zijn ontstaan. Hierdoor kunnen ook de requirements drastisch veranderen. Prototypes die in gebruik zijn genomen en populair zijn geworden, maar ook scripts die niet langer de vereiste performance halen.

C of C++ is dan al gauw een logische keus, hoewel ik ook al enige tijd aan het kijken ben naar een relatief onbekende taal: D. Sinds enige tijd is er een 2e versie van de taal uit en er is nu ook een D compiler in de GCC suite: GDC.

Nu ben ik sinds een paar dagen aan het spelen met D en ik moet zeggen, ik ben impressed. Een taal die er mogelijk qua idee nog het dichtst bij komt is Go, van Google. Het doel van D is een taal die het beste van bestaande talen pakt, dicht bij C++ blijft maar niet de valkuilen overneemt. Naast veel extra mogelijkheden in de taal zelf is ook de standaard bijbehorende library (Phobos) relatief high level.

Dit is een klein voorbeeldje:

D:
1
2
3
4
5
6
7
8
9
10
11
12
import std.stdio;

void main() {
    ulong lines = 0;
    double sumLength = 0;
    foreach (line; stdin.byLine()) {
        ++lines;
        sumLength += line.length;
    }
    writeln("Average line length: ",
        lines ? sumLength / lines : 0);
}



Nu is dit vergeleken met een taal als Java, C# of een scriptingtaal niet heel bijzonder, maar de echte kracht zit er in dat je ook vrijwel alle lowlevel features hebt van C zoals pointers en inline assembler. Daarnaast is er een 100% compatibiliteit met de C ABI en deels met C++. Hierdoor kan je gebruik maken van alle bestaande C libraries wat een groot voordeel is boven andere talen waarbij vaak bestaande libraries of eerst geport moeten worden, of er een bridge moet worden geschreven (bv JNI van Java). De enigste beperking is dat de header omgezet moet worden, wat (deels) geautomatiseerd kan gebeuren.

Daarnaast wordt D naar een native binairy gecompiled ipv in een VM gedraaid. Nu zal de high level library het niet snel winnen van goed geschreven C code, maar de vraag is of dat nodig is. High level talen hebben recent meer en meer de voorkeur en juist in D heb je de mogelijkheid om indien nodig van iets een assembly implementatie te maken.

Naast de DMD reference compiler is er ook een GDC compiler en bij een snelle test met een stukje C code dat ik omgezet heb naar D wat puur pointerwerk deed en kwa snelheid niet onderdeed voor de C versie. Hoewel dat uiteraard geen representatieve benchmark is ;)

Goed en dan is het nu tijd om D eens toe gaan passen. Bij 1 van mijn projecten maken we gebruik van Flash als chatclient. Nu is het sinds Flash 9 noodzakelijk dat er op de server waar je naar toe wilt connecten een policy server draait. Deze geeft niet anders als een XML file terug waar in staat met welke poorten je mag verbinden. Veel van de bestaande policy servers zijn van relatief lage kwaliteit en we hebben dan ook al regelmatig gehad dat een policy server stopte met antwoorden. Bij een hoge belasting was het zelfs vaak om de paar minuten raak. En nu werkt een cron die hem iedere 5 minuten killed ook wel maar ideaal is het niet ;) En hoewel er best betere policy servers zijn, gaat de voorkeur gewoon uit naar een native daemon ipv de zoveelste runtime moeten installeren en ze 1 voor 1 gaan proberen.

Nu was ik toen ik een paar dagen terug met D begon te spelen gelijk begonnen met het bouwen van een simpele event based webserver. Aangezien we deze week weer een forse piek op de policy servers verwachten, was de stap van een webserver naar een policy server niet heel groot meer.

Het resultaat is FlashPolleD! Hoewel dit een project is van iets meer als een dag lijkt hij het beter te doen als alle eerdere policy servers. Ik heb hem in een dev vps (op een recente Xeon) gebenchmarked op meer dan 20.000 policy requests per seconde. Na vele miljoenen requests zonder crashes of enige vorm van van memoryleaks vonden wij hem gezien de huidige problemen goed genoeg om in productie te nemen. De ervaringen tot nu toe zijn zeer positief en response tijden van een fractie van een seconde ipv richting een seconde.

Woensdag zal in ieder geval de echte vuurdoop zijn ;)

De benodigde libaries en compilers zijn nog niet te vinden in de meeste stable versies van de verschillende Linux distributies. De buildscripts gaan uit van mijn dev omgeving met de laatste versie van GDC en libev. Iemand met enige kennis van het compileren onder linux moet er wel uit kunnen komen. Voor een simpel hobbyprojectje vindt ik het niet waard om er meer moeite in te steken. Mocht er serieus vraag naar komen kan het altijd nog. Op Debian testing zou apt-get install gdc-4.6 libphobos2-4.6-dev libev-dev en daarna het aanpassen van het buildscript naar gdc-4.6 voldoende moeten zijn.

Daarnaast heb ik ook 32 en 64 bit intel binairies voorgecompileerd liggen maar als je dit niet vertrouwd kan ik dat goed begrijpen.