Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial Internet of Things >> Internet of Things-technologie

Profilering van gedistribueerde applicaties met Perf

Ik ben, net als veel ontwikkelaars, in situaties geweest waarin ik een bestaande applicatie moest nemen en deze sneller moest maken - in feite door langzame code te verwijderen en deze te vervangen door snelle code. Ik weet nu dat ik één simpele regel moet volgen als het gaat om het optimaliseren van code:

De code waarvan ik denk dat deze de toepassing vertraagt, is waar ik als laatste moet kijken.

Profiling is een vak waarbij je heel snel de beperkingen van je intuïtie kunt accepteren. Ik realiseerde me al vroeg dat ik koude, harde metingen nodig had om me te vertellen welke delen van mijn code moesten worden geoptimaliseerd. Gelukkig is er een overvloed aan profileringstools beschikbaar die zo ongeveer alles kunnen meten dat te maken heeft met hoe uw code wordt uitgevoerd.

Tools maken profilering echter niet per se eenvoudig. Het interpreteren van metingen kan lastig zijn en variabelen moeten strikt worden gecontroleerd bij het uitvoeren van experimenten. Vooral multi-threaded en gedistribueerde applicaties zijn moeilijk te profileren.

Iedereen die ooit een race-conditie heeft moeten debuggen, weet hoe tijdgevoelig het gedrag van multi-threaded applicaties is. Het profileren van multi-threaded applicaties heeft vergelijkbare uitdagingen, aangezien timing een belangrijke factor wordt bij de meting.

Profilers zoals callgrind vertragen uw programma aanzienlijk en hebben daarom invloed op de timing. Een voorbeeld dat een beperking van dergelijke profilers laat zien, is mutex-conflict. Uw toepassing kan traag werken omdat een mutex intensief wordt gebruikt, waardoor uw code veel tijd besteedt aan vergrendelingsfuncties. Een tool als callgrind zou dit niet onthullen, omdat het instructies telt , geen tijd.

Er is een andere klasse van profilers die aan 'statistische profilering' doen. Met deze profilers kunt u uw programma uitvoeren zoals u dat normaal zou doen, terwijl u periodieke momentopnamen maakt van waar de toepassing zijn tijd doorbrengt. Deze profilers moeten enige tijd worden uitgevoerd om nauwkeurige resultaten te produceren, maar kunnen dit doen met een minimale impact op de timing. Dat maakt ze uitstekend geschikt voor het profileren van multithreaded en/of gedistribueerde applicaties!

Ik wilde een profileringsworkflow delen met behulp van de Linux-perf-tool, die ik bijzonder nuttig vond omdat ik hiermee snel prestatie-"hotspots" kan identificeren. Ik zal het voorbeeld c/hello_dynamic uit RTI Connext 5.3.0 gebruiken als doel voor het meten van prestaties.

Zorg er eerst voor dat perf op uw Linux-machine is geïnstalleerd. Op Ubuntu moest ik deze opdracht uitvoeren om perf op mijn machine te installeren:

sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic

Vervolgens moet je een GitHub-project downloaden dat de uitvoer van perf kan converteren naar wat een "FlameGraph" wordt genoemd, wat een visuele weergave is van de verzamelde profileringsgegevens. Voer deze opdracht uit vanaf een locatie die gemakkelijk toegankelijk is (zoals uw thuismap):

git-kloon https://github.com/brendangregg/FlameGraph

Navigeer nu naar het voorbeeld hello_dynamic in de map rti_workspace/examples/c. Bouw de code met deze opdrachten (zorg ervoor dat NDDSHOME is ingesteld op de RTI Connext-installatie):

export DEBUG=1 
make -f makefile_Hello_x64Linux3gcc4.8.2

Het platform in de naam van de makefile kan verschillen van uw platform. Merk op hoe we de omgevingsvariabele DEBUG instellen. We doen dit zodat het binaire bestand foutopsporingssymbolen heeft, waarmee we de namen van functies kunnen zien in de aanroepen die uitgevoerd worden.

We kunnen nu perf uitvoeren op onze code. Voer de volgende opdrachten uit:

objs/x64Linux3gcc4.8.2/Hallo sub &
sudo perf record -g objs/x64Linux3gcc4.8.2/Hallo pub

Druk na een tijdje op Ctrl-C om de uitgever te verlaten. Perf zal een bestand hebben geproduceerd met de naam "perf.out". We moeten dit bestand nu vertalen naar iets dat de FlameGraph-tool begrijpt, met behulp van een script uit de FlameGraph-repository:

perf-script -f | ~/FlameGraph/stackcollapse-perf.pl> out.perf-gevouwen

Vanaf hier kunnen we de FlameGraph-afbeelding genereren:

~/FlameGraph/flamegraph.pl out.perf-folded> perf.svg

Als je het perf.svg-bestand in een webbrowser opent, zou het er ongeveer zo uit moeten zien:


De horizontale as geeft de tijd weer die in een bepaalde functie is doorgebracht, terwijl de gestapelde balken de call-stack van uw toepassing vertegenwoordigen. U kunt op elke balk klikken om in te zoomen op die specifieke stapel.

Probeer de uitgever opnieuw uit te voeren, maar zonder een abonnee. Je zult merken dat het rechterdeel van de flamegraph zal verdwijnen, aangezien DDS geen data verstuurt als er geen abonnees zijn!

De perf-tool kan veel meer dan wat deze blog beschrijft. Als u andere instellingen of hulpmiddelen kent die uw profileringsleven gemakkelijker hebben gemaakt, laat het ons dan weten!

Veel plezier met profileren!


Internet of Things-technologie

  1. Zal Molybdeen Combineren Met Andere Elementen?
  2. Hybride Blockchain/Cloud-applicaties bouwen met Ethereum en Google
  3. Serverloze mobiele applicaties bouwen met React Native en AWS
  4. Eenvoudig naderingssensorcircuit en werken met applicaties
  5. Soorten analoge en digitale sensoren met toepassingen
  6. 4 ZigBee-applicaties die u misschien wilt bouwen met een ander protocol
  7. Microchip:schaal ruimtetoepassingen met COTS-naar-straling-tolerante Core MCU's
  8. Verhelp IT-knelpunten met eenvoud:Low-code platforms zijn de sleutel
  9. Ovo verbetert zijn spel met gedistribueerde energie met VCharge smart grid buy
  10. CNC-houtfrees - met verbluffende toepassingen
  11. 5 Real-World toepassingen van AI in de geneeskunde (met voorbeelden)