Bakgrund. Inför projektet. Mätningar av existerande läge

Relevanta dokument
1 Kravspecifikation Snake App

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Diskprestanda Tester

Opponenter: Erik Hansen Mats Almgren Respondent: Martin Landälv ioftpd-verktyg

Pipelining i Intel Pentium II

Filöverföring i Windowsmiljö

Objektorienterad programmering

IBM POWER4, den första flerkärniga processorn och dess pipelines.

Projektuppgift.

PARALLELLISERING AV ALGORITMER PROCESSORER FÖR FLERKÄRNIGA

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Högskolan i Gävle. Introduktion till att skapa appar för Android VT Eat App! Jacob Gavin

Användarmanual: Ansökan och rapportering i E-kanalen för Energikartläggningsstödet

CDC en jämförelse mellan superskalära processorer. EDT621 Campus Helsingborg av: Marcus Karlsson IDA

Datorsystem 2 CPU. Förra gången: Datorns historia Denna gång: Byggstenar i en dators arkitektur. Visning av Akka (för de som är intresserade)

Prestandapåverkan på databashanterare av flertrådiga processorer. Jesper Dahlgren

Prestandatest Förberedelser & Faktainsamling. LIGHTS IN LINE AB Tegnérgatan STOCKHOLM info@lightsinline.se

Projektuppgift- Mashup- Applikation

Reagera på WoW-event Att använda OnUpdate Introduktion Att kapa funktioner Automatisering och AI

Agenda. Syfte med datorbygge Datorns delar. Datorbygge. Moderkort Processor Minne och hårddisk Instickskort Övrigt

Skicka och hämta filer med automatik till och från Försäkringskassan

TDTS04: Ett chattsystem i java baserat på corba

Proj-Iteration1. Arkitektur alt. 1

Multi-ported cache En rapport om några lösningar till att få flera minnesaccesser simultant.

Introduktion till programmering och Python Grundkurs i programmering med Python

1. Starta om din Mac. 2. Kontrollera din Internetuppkoppling

- Effektiv prestandatestning, teknisk verifiering, tuning, verifiera krav, förvalta prestanda

Decentraliserad administration av gästkonton vid Karlstads universitet

Skärmbilden i Netscape Navigator

Cacheprobe: programbibliotek för extrahering av cacheminnesparametrar

Välkommen! SA S PSA S Im I puls s Mobilite t t e 8 1

1ME323 Webbteknik 3 Lektion 6 API. Rune Körnefors. Medieteknik Rune Körnefors

RFC 6106-stöd i Router Advertisment-klienten radns. Michael Cardell Widerkrantz mc@hack.org

Att använda accelerationssensorn i en smarttelefon/surfplatta för att göra mätningar

Hidden Camera App. Realtidsprogrammering EDA040. Joakim Svensson (dt05js8) Torbjörn Lundberg (dt05tl3) Henrik Andersson (dt05ha1)

Datorteknik 2 (AVR 2)

Agenda. Introducera det individuella projekt Multipla C-filer H-filer Introducera uppgifterna

Bakom kulisserna. SMHI webservices. Infrastruktur och säkerhetslösningar Demonstration av webservices

IBM FlashSystem (och lite SSD)

WWW. Exempel på klientsidan. Överföring av en html-fil. Snyggare variant. Verkligt format. Meddelandeformat för begäran HTTP

Fraktjakt erbjuder en fraktmodul till e-handelssystem byggt på oscommerce som förenklar vardagen för webbutiksadministratören.

Release notes för RemoteX Applications Windowsklient version 4.4

Godkännande av kundapplikationer

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Författare: Juha Söderqvist IT-GUI. Version 1.0. Datum

Webforum. Nytt i Senast uppdaterad:

Publicera ett MSD-dokument istället för MXD-dokument

Manuell import till Lime Pro

Hur det går att minska effektutvecklingen i en processor genom att ändra pipeline

Multithreading in Intel Pentium 4 - Hyperthreading

web: fax: tel: kontor , Toby Edmundsson mobil: , Jan

1. Mekanisk svängningsrörelse

Att använda DVD-RAM-skivor

Kriswebb och Krisserver ur ett tekniskt perspektiv

Teoretisk del. Facit Tentamen TDDC (6)

Gränssnitt för FakeGranska. Lars Mattsson

Webbtjänster med API er

Swedbank Mobile Loadtesting. LoadRunner Mobile App protocol

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Repetition DK2 Middleware, P2P, Multimediatransport. Stefan Alfredsson 18 Mars 2005

IP-baserade program. Telnet

Filsystem. Varför? Hur? För att kunna lagra data mer permanent än i RAM. Vettig organisation Vettiga namn

Lunds Tekniska Högskola Datorarkitektur med operativsystem EITF60. Superscalar vs VLIW. Cornelia Kloth IDA2. Inlämningsdatum:

Vilket moln passar dig bäst?

Digitala projekt rapport

HI1024 Programmering, grundkurs TEN

3.2 1H[W*HQHUDWLRQ6HFXULW\ Användarmanual

Anujan Balasingam IDA14 NAND flashminnen

Vektorkartor för mobila terminaler

Tekis-FB Systemkrav

WLTP. Worldwide harmonised Light vehicles Test Procedure

Tentamen, Distribuerade System/Programvaruarkitektur

Slutrapport för SquareShooter

Snake App Rapport - Snake App Rapport Utskriven/PDF Export: Copyright Version 1.2 Sidan 1 av 9.

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Datakom II (MNP) ht 1998 Bengt Ahlgren 1. Vad är speciellt med implementering av kommunikationsprotokoll?

RELEASE Release 14.1 kommer finnas tillgänglig för er måndagen den 10 mars Allmänt

Insamlingsverktyg - teknisk beskrivning av metadataformuläret

Traffic Management i praktiken

Projektet. TNMK30 - Elektronisk publicering

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Trust-IT Cloud Services

Systemkrav WinServ II Edition Release 2 (R2)

Webbteknik II. Föreläsning 4. Watching the river flow. John Häggerud, 2011

D/A- och A/D-omvandlarmodul MOD687-31

(7) Neptune Version release information. Copyright Visma. Med ensamrätt.

Praktiska tillämpningar av QoS-teknologi

ÖVERVAKNING AV SQL SERVER

Random Access Memory. Amare Reda Jenny Holmberg Henrik Kreipke Gaylord Kaya

Bonus Rapport Kommersiell Design KTH

JavaScript in SharePoint and not just for Apps. Wictor Wilén

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

JavaScript del 9 Dynamik och animeringar

TDDIU81. Processer och trådar. Andreas Dahlberg, Jonathan Doherty, Tony Magnusson, Patrik Ottosson, Rasmus Siljedahl

IT för personligt arbete F2

Skriftlig tentamen i kursen TDTS04 Datornät och distribuerade system kl. 8 12

Paraplyprojekt Events

Objektorienterad programmering, Java, 5p TDBA63

Palo Alto Networks. 10 saker din brandvägg måste klara av (För annars är det inte en riktig brandvägg)

Kortfattad instruktion för installation och användning av streckodsapplikationer

Transkript:

Slutrapport, Projekt Hiper. Oktober 2006 Bakgrund libcurl är ett utvecklingsbibliotek för filöverföringar som stöder HTTP, HTTPS, FTP, FTPS, FILE, TELNET, DICT m.fl. Följande rapport är skriven utan att alltför mycket förkunskaper om libcurl måste finnas hos läsaren, men då libcurl är ett väletablerat och gammalt projekt (startades 1998) så kan jag inte beskriva samtliga detaljer här. Grundfakta kan inhämtas från libcurls webbsajt: http://curl.haxx.se/. Inför projektet Den 24:e oktober 2005 tog Daniel emot ett diplom och det officiella beskedet om det beviljade ekonomiska stödet från II Stiftelsen, under Internetdagarna 2005. Projektet fick namnet Hiper av Daniel, som en förkortning av High Performance projektet syftar till att optimera libcurls prestanda vid väldigt många samtidiga överföringar. I projektet lade Daniel till en punkt (nr 3) som inte fanns med i hans ansökan, så att de blev tre till antalet: 1. nytt API för att undvika select() relaterade problem 2. support för HTTP pipelining 3. ett zero copy interface Redan innan detta bidrag beviljades hade projektet efter många och långa diskussioner en ide om hur API:t skulle utformas för att bli så bra som möjligt, men under projektets gång kom det ändå att omformas och justeras på flera sätt flera gånger. Min plan fick en extrapunkt (zero copy interface) i ett infall av ambition som jag hade precis i början, men jag gjorde under projektets tid bedömningen att detta inte är en speciellt viktig förändring eller någon som efterfrågas på något sätt, så för att spara tid och verkligen komma i mål snyggt så strök jag denna punkt igen och lämnar den till att implementeras i framtiden istället. Mätningar av existerande läge (De mätningar och tider som refereras till i följande rapport är gjorda på en 2083 Mhz AMD Athlon XP 2800+ körandes Linux 2.6. Testerna har gjorts utan att swap använts, allting har fått plats i RAM.) Projektet började med ganska detaljerade mätningar på det existerande gränssnittet och exakt hur lång 1 av 5

(extra ) tid det tar pga den select() centrerade designen. Problemen med select() är i korthet: 1. stöder endast ett (compile time) begränsat antal sockets 2. när man får veta att en eller flera sockets har trafik, kan man inte enkelt får reda på vilken det är utan man måste iterera över allihopa för att ta redan på vilken eller vilka det var 3. långsamt ju fler sockets man lägger till ju längre tar varje anrop till select() 4. det är också ett problem i sig att vi är låsta till att applikationen måste använda select() eftersom det inte passar alla Det existerande gränssnittet krävde att applikationen först gjorde ett anrop till curl_multi_fdset() för att sedan kunna göra select() för att vänta på trafik. När trafik noterats, eller timeout inträffat, skall curl_multi_perform() anropas. Då går libcurl igenom samtliga koppel och gör vad som skall göras, vilket inkluderar läsning och skrivning av de koppel som är redo. Mätningarna visade att vid 9000 koppel utan trafik och en med konstant trafik, så tog enbart select() 8ms per anrop och curl_multi_perform() 32 ms (libcurl var då patchad att endast läsa max 1 byte per anrop). Vi såg också att tiden dessa anrop tar är direkt proportionell med antalet sockets/koppel. 20000 Illustration 1: tidsåtgång per funktionsanrop koppel skulle alltså ta totalt 89 ms per anrop! Det gör förstås att vi maximalt gör recv() anrop med en frekvens på cirka 11Hz, vilket vid full datahastighet på det enda kopplet med trafik (och 16KB läsbuffrar som libcurl använder) endast ger 180KB/sekund. Design av curl_multi_socket() För att undvika att select() måste användas så måste libcurl exponera exakt de sockets som den använder, och huruvida applikationen ska vänta på att socket blir skrivbar, läsbar eller både och. Vi vill heller inte att applikationen ska behöva plocka fram alla sockets i stil med curl_multi_fdset() då det ju också blir en massa jobb att utföra repetetivt. Slutsatsen blev att den nya funktionaliteten vi gör, måste informera applikationen om socket förändringar 2 av 5

med hjälp av en callback. Då endast förändringar rapporteras kan applikationen hela tiden hålla kvar information de sockets den redan fått info om, och se till att vänta på trafik på dem enligt samma info. Vi måste också tillåta att applikationen berättar för libcurl exakt vilket socket som den har noterat trafik på, och då skall libcurl kunna använda den direkt utan att behöva leta igenom tusentals andra. Alternativ till select() Vi har svängt in på och fokuserat ganska mycket på att se till att vi har ett API som är lätt att använda tillsammans med libevent 1. Men genom att göra så, gör vi det också det enkelt att använda andra eventbaserade system i samma anda. Helt enkelt system som kan vänta på trafik på en eller flera sockets och berätta exakt vilken som hade trafik (typ kqueue, epoll och liknande). På libevents webbsajt ser vi en graf över hur libevent skalar i jämförelse med select. Det framgå r inte exakt på vilken typ av maskin som tiderna är uppmätta, men det finns anledningar att tro att det är en långsammare maskin än den jag använt. Siffrorna där visar en konstant användning av 50 mikrosekunder för det enda aktiva kopplet, hur många samtidiga tysta koppel man än lagt till. Jag beslöt mig för att inte försöka upprepa libevents mätningar utan tror på dem, mest för att jag inte är insatt i dess interna funktionalitet och det därmed är lite svårt att göra bra Illustration 2: prestanda graf från libevents webbsajt mätningar. Test av curl_multi_socket() Då vi räknade med att undvika select() (genom t.ex libevent), byggde jag en applikation som trots allt var baserad på select() men endast för utvecklingsfasen. Sedan såg jag till att mäta tiden curl_multi_socket() tog på sig att hantera det enda koppel som hade trafik. Resultatet var mycket inspirerande: det tog i genomsnitt 7 mikrosekunder (fortfarande patchad att endast läsa en byte). De första testerna var dock fortfarande rätt simpla och implementerade inte hela API:et på rätt sätt. För att det skulle fungera rätt så var jag tvungen att implementera en hash uppslagning för socket => intern struct plus att jag stoppade in en hantering av timeout (med hjälp av splay träd) så att applikationen kan fråga 1 http://www.monkey.org/~provos/libevent/ 3 av 5

libcurl hur länge den bör vänta som längst innan den anropar libcurl (för intern timeout och omförsökshantering etc). Denna extra hantering, samt att vi är tvungna att kontrollera och hantera eventuella timeouter i varje anrop till curl_multi_socket() lade på några mikro mer anrop. Jämförelse av curl_multi_perform och curl_multi_socket Med ett aktiv koppel och ett stort antal koppel så ligger vi nu nästan konstant på totalt mindre än 60 mikrosekunder (när vi läser en enda byte) per event, tiden växer lite långsamt pga hashtabellsuppslagningen. För 10000 koppel var vi alltså fortfarande under 10 mikrosekunder per curl_multi_socket anrop. I ett extremfall med 20000 tysta koppel och ett som är aktivt, och räknat på att läsningen av data går lika fort för 16KB som för 1 byte (vilket ju inte är fallet i verkligheten, men skillnaden kan ignoreras för tillfället) så når vi en anropsfrekvens på 16666 Hz, vilket motsvarar en datahastighet på 260MB/sekund. Skillnaden i hastighet mellan det gamla gränssnittet och det nya är alltså uppemot faktor 1:1500! HTTP Pipelining När prestandan på socket nivå förbättrats gick jag vidare till nätverks nivån och implementerade stöd för HTTP Pipelining. Pipelining betyder här i korthet att man skickar flera förfrågningar på en gång, utan att invänta svaret, och sedan tar man emot flera svar när de väl kommer. Den stora fördelen kommer förstås när man vill hämta många små filer från servrar med lång fördröjning (latency). HTTP Pipelining introducerades med HTTP 1.1 och skall stödjas av alla HTTP servrar som implementerar 1.1, vilket i dagens läge är i princip alla. För att möjliggöra pipelining fick jag först se till att ett multi handle (dvs det objekt som används när man använder libcurls mult interface, oavsett om man använder det gamla curl_multi_perform eller den nya curl_multi_socket) fick en gemensam koppel cache. Detta för att möjliggöra att man lägger till nya förfrågningar som ska kunna koppla på sig på en redan existerande för att bilda kedjor pipelines. Resultat I och med curl releasen 7.16.0 (släppt 30 oktober 2006) är både curl_multi_socket() och Pipelining supportat. Därmed är projekt Hiper i mål! Idag, den 25 november 2006 skickar jag slutrapporten. 4 av 5

Användning av tillfördelade medel Daniel har under det gångna året fått totalt 150000 SEK, fördelat på tre stycken utbetalningar, från II Stiftelsen för genomförandet av detta projekt. Pengarna har används till att köpa RAM minne till utvecklingsdatorn samt till den allra största delen ersätta arbetstid för att möjliggöra att Daniel arbetat deltid med projekt Hiper under praktiskt taget ett helt år. Tack! Jag hade självklart inte kunnat genomföra detta utan II Stiftelsens generösa gåva. Jag har även haft stor hjälp och input från följande individer: Ravi Pratap, Jamie Lokier, Sun Yi Ming, Jeff Pohlmeyer, Alexander Lazic 5 av 5