TestAutomatisering & PerformanceTesten

APACHE MPM (op *nix servers)

Benieuwd naar de impact van het wijzigen van Apache MPM Prefork naar Worker? Lees dan door! Bij één van onze klanten heb ik dit onderzocht. Omdat dit ook interessant kan zijn voor anderen, deel ik mijn resultaten en ervaringen graag. Het is misschien wat technisch allemaal, maar voor performancetesters, de doelgroep, is het vast goed te begrijpen!

Ik zal beginnen met een korte uitleg van wat Apache MPM is en welke gangbare smaakjes er zijn voor *nix systemen. Hierna sta ik even stil bij de testen die ik hiervoor heb uitgevoerd en deel ik de conclusie.

Bij de web server Apache kan je kiezen op welke manier de httpd processen ingezet worden. Dit kan door een bepaalde MPM (Multi-Processing Module) te kiezen. MPM luistert naar (bind met) een netwerkpoort en ontvangt requests en laat zijn children de requests afhandelen.

Je hebt de volgende MPM’s:

  • Prefork
  • Worker
  • Event

Welke MPM je moet kiezen, hangt af van thread support en thread-safe polling. Als het systeem het gebruik van threads niet ondersteunt, gebruik je prefork. Anders kijk je nog naar ondersteuning van thread-safe polling. Als dat mogelijk is, kom je uit bij event en anders bij worker. Hieronder worden de verschillende MPM’s kort uitgelegd.

Prefork

Er is 1 parent proces die verantwoordelijk is voor de child processen. De child processen “luisteren” naar nieuwe connecties en handelen deze af. Het parent proces beheert de server pool (de pool met child processen) volgens configuratie.

Worker

Er is 1 parent proces die verantwoordelijk is voor het beheren van de server pool. De server pool bestaat uit child processen en elk child proces heeft zelf ook weer een soort pool van 1 listener thread en meerdere server threads. De listener thread “luistert” naar connecties en verdeelt deze over de server threads die de verzoeken van die connectie afhandelt.

Event

Bij Worker zijn er problemen met keep-alive. De connectie kan worden opengehouden vanaf clientzijde. Hierdoor kan de server thread niet ingezet worden terwijl deze niets aan het doen is (behalve dan wachten). Event MPM lost dit probleem op.

Event MPM is qua opzet gelijk aan de Worker MPM met het verschil dat bij Event de listener thread ook wat processing werk moet doen waaronder de connecties afhandelen van de sockets in keep alive status. Het werk wordt door de server threads op een shared queue gezet.

Event is bij versie 2.2 geïntroduceerd en wordt betiteld als experimenteel. Dit label verdwijnt bij versie 2.4 (op moment van schrijven is een versie 2.5 beschikbaar). Voor Linux wordt een 2.6 kernel geadviseerd.

Het is mogelijk dat Event niet werkt door connection filters die niet compatible zijn. In dat geval wordt automatisch Worker MPM in werking gesteld.

Uitgevoerde testen

Op mijn opdracht heb ik wat testen gedaan met verschillende MPM’s. Dit was voor een test op 1 applicatie waarbij ik bovengenoemde MPM’s heb geprobeerd. Ik heb 2 transacties gebruikt om load op het systeem te zetten. Ik heb het een en ander in een tabel gezet.

MPM Voor de test Tijdens de test Na de test
Httpd processen Prefork 9 118 9
Worker 2 7-8 7
Established connecties Prefork 0 108 0
Worker 0 109-111 0
Transactie 1 average Prefork 0,08
Worker 0,08
Transactie 1

99 percentiel

Prefork 0,12
Worker 0,13
Transactie 2 average Prefork 0,09
Worker 0,09
Transactie 2

99 percentiel

Prefork 0,14
Worker 0,15
CPU Prefork 52-68%
Worker 58-68%

De oplettende lezer heeft mogelijk al gezien dat in bovenstaande tabel MPM Event ontbreekt. Op de omgeving waarin ik testte, draaide Apache 2.2. Dit maakt de MPM Event experimenteel en het uitvoeren van testen en het vergelijken van de resultaten is hierdoor niet betrouwbaar.

Als we kijken naar de resultaten voor Prefork en Worker zien we het (grote) verschil voornamelijk in het aantal httpd processen tijdens de test (118 versus 7-8). Voor Prefork wordt voor elke connectie een httpd proces in gebruik genomen zoals ook verwacht. En bij Worker is dit dus aanzienlijk lager doordat worker httpd processen een pool met meerdere threads bevatten om het werk af te handelen. Met minder processen zou je ook minder CPU gebruik verwachten. Dat zien we niet terug in bovenstaande tabel. Dit komt doordat het aantal gebruikte threads niet heel anders zal zijn dan bij prefork. Dit konden we helaas niet controleren.

De testen wezen uit dat een overgang van Prefork naar Worker geen problemen oplevert.

Ik ben heel benieuwd naar andere ervaringen en bevindingen met MPM testen. Dus reageer vooral!

Dit bericht is geplaatst in Performancetesten en getagd in *nix Apache Prefork Worker

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Nieuws

Blijf op de hoogte

APACHE MPM (op *nix servers)

07/11/2017

Benieuwd naar de impact van het wijzigen van Apache MPM Prefork naar Worker? Lees dan door! Bij één van onze klanten heb ik dit onderzocht. Omdat dit ook interessant kan zijn voor anderen, deel ik mijn resultaten en ervaringen graag. Het is misschien wat technisch allemaal, maar voor performancetesters, de doelgroep, is het vast goed […]

Performancetesten en CI/CD, gaat dat samen?

13/10/2017

De afgelopen najaarseditie van Testnet stond onder het thema Continuous Everything vooral stil bij CI/CD en natuurlijk testen. Gezien DevOps en CI/CD ook grote invloed hebben op het vakgebied performance (testen), zijn wij blij dat we vanuit PerformanceArchitecten een bijdrage mochten leveren door middel van het delen van onze visie hierop. Onze collega René Meijboom […]

Een eerste indruk van Gauge

08/09/2017

Tijdens één van onze kennismiddagen hebben we gekeken naar het testtool Gauge. Doel van de sessie was om een beeld te krijgen wat de toegevoegde waarde van Gauge is voor een tester. Benieuwd naar onze ervaringen? Lees dan snel verder! Gauge is een open source project, gesponsord door ThoughtWorks en belooft in het kort het […]

Test Automation Framework BDD

16/06/2017

De afgelopen tijd heb ik in een opdracht collega’s mogen adviseren over de positieve impact van het Test Automation Framework BDD rondom het thema Agile. In een vorige blog ‘Transformation’ is te lezen wat BDD voor mij betekent en hoe BDD voor synergie zorgt tussen verschillende disciplines binnen Agile-teams met als doel het leveren van kwalitatief hoogwaardig […]

Creëer meer eenheid in je SpecFlow steps met Step Argument Transformations

11/04/2017

Laatst kreeg ik de vraag, “Hoe maak je in je testdata onderscheid tussen een regular expression en een gewone tekst”. Oftewel: Hoe beheer je verschillende soorten steps als ze alleen verschillen in de manier waarop data vergeleken wordt. Je hebt een veld en je wilt controleren of er een bepaalde waarde in staat, maar soms […]

SSL/TLS versie en cipher in HP LoadRunner

29/03/2017

In deze blog wil ik even stilstaan bij de resultaten van een performance test die niet overeenkwamen met de verwachtingen die wij als team hadden. Een aantal transacties gingen in responstijd omhoog en het CPU gebruik nam flink toe. Omdat het ons veel tijd heeft gekost, deel ik dit graag met jullie zodat wij performance […]

Regular Expressions en Testautomatisering, twee problemen of juist een oplossing?

25/03/2017

Bij geautomatiseerde checks wil je regelmatig een verwachte waarde controleren tegen een actuele waarde. Vroeg of laat kom je dan in aanraking met wildcards: Je wilt bijvoorbeeld weten of de tekst “Er zijn 42 resultaten gevonden” voorkomt, maar het aantal, hier 42, kan variabel zijn. Van 42 wil je dan een wildcard maken. De meest […]

Automated Approval Testing with Dynamic Data Sets

21/02/2017

For some tests, you’ll need to check if files or documents are the same as they were before, or that they comply with a certain format. When something differs, you need to “reject” or “approve“ them, or even make them the new baseline if you are welcoming the changes. We call this Approval Testing. For more […]

Transformation

20/01/2017

Inmiddels hebben veel organisaties de overstap gemaakt van de traditionele waterval methode naar een iteratieve ontwikkelmethode als Agile/Scrum. Een aantal organisaties zijn in hun werkwijze een stap verder gegaan en hebben DevOps geïntroduceerd. Waar de methodiek Agile vooral focust op het tevredenstellen van de klant, richt DevOps zich daarnaast op het dichten van de kloof […]

Cucumber, Selenium en het gebruik van het Page Object Pattern

14/12/2016

Als je Selenium gebruikt om je testen aan te sturen, kan je gebruik maken van het Page Object Pattern om een laag van abstractie aan te maken: Het maakt een model van je pagina zodat het makkelijker is om acties op die pagina uit te voeren. Dit heeft grote voordelen: Zodra er een wijziging op de […]

SpecFlow Extensies voor Dummies

21/11/2016

TechTalk heeft voor SpecFlow natuurlijk al een handige set aan extensies uitgebracht die vooral het gebruik van eigen datatypes in combinatie met SpecFlow steps mogelijk maken. Dit is slimme, maar vrij geavanceerde set waarbij je best wel wat ervaring moet hebben met zowel het gebruik van SpecFlow als C#. De beginnende gebruiker zal eerder behoefte […]

SpecFlow Extensies voor Dummies, de code

21/11/2016

Hieronder vind je de code die behoort bij het artikel SpecFlow Extensies voor Dummies  Feature File: Feature: Table Transformations In order to have convenient datatypes As a SpecFlow user I want to transform tables into dictionaries or datatables Scenario: Transform a vertical table into a dictionary Given I have the following table: | Movie | […]