OProfile is een prestatieprofiel voor Linux. In dit artikel zullen we onderzoeken wat het doet, hoe het te installeren en configureren, en hoe de verzamelde gegevens te gebruiken.
Je vraagt je misschien af waarom je zo'n tool nodig zou hebben, aangezien er op de meeste Linux-distributies standaard tal van goede tools voor prestatieanalyse beschikbaar zijn. Elke installatie bevat tools zoals top en vmstat, en traceringshulpprogramma's zoals strace zijn meestal slechts een apt-get away. Waar past OProfile in??
De eerder genoemde tools zijn uitstekend in het verkrijgen van een momentopname van een Linux-systeem in realtime. Tools zoals top of htop tonen alle lopende processen, hun huidige geheugenverbruik en processorgebruik. Maar weten welke processen en systeemaanroepen de meeste bronnen verbruiken, wordt problematisch.
Dat is waar OProfile om de hoek komt kijken. Deze hulpprogrammasuite voert zijn analyse niet alleen op een dieper niveau uit, maar slaat ook gegevens op en stelt u in staat prestatierapporten te produceren die een schat aan informatie bieden die u kan helpen zelfs het meest ongrijpbare prestatieprobleem op te lossen.
OProfile is niet alleen voor ontwikkelaars. In een desktopomgeving kan OProfile u helpen bij het opsporen van CPU-intensieve achtergrondtaken of I/O-aanroepen die u vertragen en die niet meteen duidelijk zijn. In een druk systeem met wisselende procesprioriteiten kan het moeilijk zijn om deze gegevens te verzamelen, laat staan te interpreteren. Het multi-proceskarakter van een serveromgeving maakt deze taak nog moeilijker met traditionele tools.
Dat gezegd hebbende, zullen ontwikkelaars ongetwijfeld het meeste uit OProfile halen. De informatie die ik zal presenteren, behandelt de basisprincipes van beide use-cases, zodat u zich kunt verdiepen in de prestatiestatistieken van elk Linux-programma.
Installatie
Er is een zeer belangrijke opmerking die moet worden gemaakt voordat u diep in OProfile duikt - u kunt het mogelijk niet in een gevirtualiseerde omgeving installeren. Als u Linux gebruikt in een VirtualBox, VMWare of vergelijkbare VM-omgeving, heeft OProfile mogelijk geen toegang tot de benodigde prestatiemeteritems om gegevens te verzamelen. Bovendien, zelfs als u het in een virtuele omgeving kunt gebruiken, kan de precieze timing enigszins worden vervormd op basis van de belasting van het hostsysteem, dus houd hier rekening mee als u niet op native hardware draait.
Verschillende Linux-distributies hebben OProfile in hun pakketbeheersystemen, wat de installatie eenvoudig maakt:
- Debian / Ubuntu / Linux Mint - sudo apt-get install oprofile
- Fedora / CentOS - sudo yum install oprofile
- Arch - sudo pacman -S oprofile
Een eenvoudig voorbeeld
Zodra het programma is geïnstalleerd, laten we onze voeten nat maken met een triviaal maar nuttig voorbeeld. Het programma "ls" is een commando dat je waarschijnlijk altijd gebruikt. Het toont eenvoudig een lijst met bestanden en mappen in de huidige map. Laten we de uitvoer ervan traceren:
sudo operf ls
U ziet iets dat lijkt op de bovenstaande schermafbeelding. Zodra de profiler klaar is, zal het "Profiling done" aankondigen."Het heeft zijn gegevens opgeslagen in een map met de naam oprofile_data die kan worden gebruikt om een rapport te genereren.
Het uitvoeren van de opdracht opreport (in dit geval zonder sudo) produceert een rapport dat er ongeveer zo uitziet:
In dit voorbeeld toont het standaardrapport het aantal monsters wanneer de CPU niet in een HALT-status was (met andere woorden, actief iets aan het doen was). Kallsyms biedt het opzoeken van symbolen gebruikt door de profiler, en de ld.zo en libc.maken dus deel uit van het glibc-pakket, een gemeenschappelijke bibliotheek die is gekoppeld aan bijna alle uitvoerbare Linux-bestanden die basisfunctionaliteit biedt die ontwikkelaars kunnen gebruiken om te voorkomen dat ze het wiel opnieuw uitvinden en om een generiek niveau van compatibiliteit tussen verschillende systemen te bieden. U kunt zien dat het eigenlijke programma ls had veel minder niet-HALT-tijd - het grootste deel van het zware werk werd gedaan door de standaardbibliotheken.
Als we klaar zijn met het rapport, is het een goed idee om de gegevensmap te verwijderen of op te slaan voor toekomstige analyse. In dit voorbeeld zullen we het gewoon verwijderen omdat we voorbeeldoefeningen uitvoeren. Omdat we de opdracht met sudo hebben uitgevoerd, moeten we de map met sudo verwijderen remove. Doe voorzichtig!
sudo rm -Rf oprofile_data
Een complexer voorbeeld
In dit volgende voorbeeld zullen we een programma uitvoeren dat eigenlijk iets ingewikkelders doet dan alleen bestanden in de huidige map weergeven. Laten we WordPress downloaden met wget.
sudo operf wget http://wordpress.org/laatste.teer.gz
Na dit voorbeeld kunnen we een rapport genereren met de opdracht “opreport”:
Je zult hierna veel meer activiteit zien. Het wget-commando moest achter de schermen veel werk verzetten om het nieuwste exemplaar van WordPress te verkrijgen. Hoewel het niet nodig is om elk item te onderzoeken, zijn de interessante aandachtspunten:
- ath9k en ath9k_hw - Deze modules zijn verantwoordelijk voor de wifi-verbinding op deze laptop.
- mac80211 en cfg80211 - Deze bibliotheken waren behulpzaam bij het uitvoeren van de netwerkverbinding vereist door wget.
- libnss_dns en libresolv werden gebruikt bij het oplossen van de wordpress.org-domein in een IP-adres zodat wget een HTTP-verbinding kan maken.
- libcrypto en libssl - Deze bibliotheken maken deel uit van de OpenSSL-bibliotheek. Dit voerde het werk uit om de ontvangen gegevens van de https:// url . te decoderen. Merk op dat hoewel we een URL hebben opgegeven met http://, de WordPress-server ons heeft doorgestuurd naar https:// en wget deze omleiding heeft gevolgd.
- libpthread - Deze bibliotheek voert threading-bewerkingen uit waardoor programma's meerdere dingen tegelijk kunnen doen. In dit geval heeft wget een thread gestart om het programma te downloaden en ook een ASCII-gebaseerde downloadvoortgangsindicator op het scherm te geven.
Dit soort gegevens kan een ontwikkelaar een schat aan informatie opleveren. Maar hoe belangrijk is dit voor een systeembeheerder van een server of een hoofdgebruiker op een desktop?? Door te weten welke delen van een programma de meeste CPU-tijd in beslag nemen, kunnen we erachter komen wat optimalisatie nodig heeft of waar de vertraging optreedt, waardoor we betere beslissingen kunnen nemen over hoe we ons systeem kunnen optimaliseren.
In dit voorbeeld werd de meeste CPU-tijd ingenomen door de crypto/SSL-routines. Dit is begrijpelijk omdat cryptografie een tijdrovende taak is. Had de wordpress.org-website heeft ons niet doorgestuurd naar https:// deze bibliotheek zou niet zijn gebruikt, wat ons CPU-tijd bespaart saving. De netwerklaag zou nog steeds zijn gebruikt, maar het gebruik van een bekabelde verbinding in plaats van een draadloze verbinding zou waarschijnlijk minder belastend zijn geweest. Het uitschakelen van de voortgangsindicator op het wget-programma (via de -nv-schakelaar) zou CPU-tijd hebben bespaard bij het weergeven van de downloadvoortgang.
Graven in symbolen
Hoewel het standaardrapport waardevolle en nuttige informatie biedt, kunnen we verder graven. Door dit uit te voeren:
opreport --demangle=smart --symbols
We kunnen precies achterhalen hoeveel CPU-tijdfuncties in de gebruikte bibliotheken:
In dit voorbeeld heb ik de opdracht wget hierboven gebruikt, maar een http://-URL gebruikt (een die niet doorverwijst naar https://) en je kunt de afwezigheid van OpenSSL-bibliotheken in de trace zien. In plaats van alleen de bibliotheeknaam hebben we nu echter een volledige lijst van de betrokken functies. Zoals u kunt zien, verbruikte de netwerklaag het grootste deel van de CPU-non-HALT-tijd.
Het naar het volgende niveau brengen
In de vorige voorbeelden hebben we OProfile gebruikt om één programma tegelijk te bekijken. U kunt uw hele systeem in één keer bekijken met behulp van de -systeembrede schakelaar:
sudo operf --systeembreed
Met deze techniek verzamelt OProfile statistieken op dezelfde manier en stopt wanneer u op CTRL+C . drukt. Daarna kunt u de opdracht opreport uitvoeren. Aangezien de profiler waarschijnlijk veel meer gegevens zal genereren (vooral op een desktop of drukke server).
melden > verslag doen van.tekst
Het rapport is nu zichtbaar in een bestand met de naam rapport.tekst
Lage overhead
Het is belangrijk op te merken dat, hoewel OProfile de werking van uw programma's niet mag verstoren, het een beetje overhead zal veroorzaken en dus de uitvoering zal vertragen. In onze eenvoudige voorbeelden hierboven creëerde het geen probleem, maar in een programma met lange uitvoering en uitgebreide functieaanroepen zul je waarschijnlijk een verschil merken. Daarom raad ik het gebruik van dit programma niet aan in een productieserveromgeving, tenzij u wordt geconfronteerd met een kritiek prestatieprobleem dat moet worden opgelost met live-gebruik. Zelfs dan zou ik het net lang genoeg gebruiken om het probleem te vinden.
Conclusie
OProfile is een krachtige tool voor prestatieprofilering. Het maakt gebruik van het laagste niveau dat beschikbaar is in Linux om prestatiemeteritems en -statistieken te verkrijgen die u waardevolle informatie over uw programma's geven.
Voorbij zijn de dagen van giswerk bij het debuggen van prestaties - u hebt nu de kracht om precies te weten wat uw systeem doet en hoe u het kunt verbeteren. Door de rapporten te bestuderen die door OProfile worden gegenereerd, kunt u weloverwogen, gegevensgestuurde beslissingen nemen over het optimaliseren van uw systeem.