OProfile är en prestandaprofiler för Linux. I den här artikeln kommer vi att undersöka vad den gör, hur man installerar och konfigurerar den och hur man använder data som den samlar ihop.
Du kanske undrar varför du behöver ett verktyg som det här eftersom det finns gott om bra prestandaanalysverktyg tillgängliga som standard på de flesta Linux-distributioner. Varje installation innehåller verktyg som topp och vmstat, och spårningsverktyg som strace är vanligtvis bara en apt-get away. Var passar OProfile in?
Verktygen som tidigare nämnts är utmärkta för att få en ögonblicksbild av ett Linux-system i realtid. Verktyg som top eller htop visar alla pågående processer, deras nuvarande minnesförbrukning och processoranvändning. Men att veta vilka processer och systemanrop som förbrukar mest resurser blir problematiskt.
Det är där OProfile kommer in. Denna verktygssvit utför inte bara sin analys på en djupare nivå utan sparar också data och låter dig producera prestandarapporter som erbjuder en mängd information som kan hjälpa dig att felsöka även den mest svårfångade prestandafrågan.
OProfile är inte bara för utvecklare. I en skrivbordsmiljö kan OProfile hjälpa dig att spåra CPU-intensiva bakgrundsuppgifter eller I / O-samtal som saktar ner dig och inte är omedelbart uppenbara. På ett upptaget system med skiftande processprioriteringar kan dessa uppgifter vara svåra att samla in, än mindre att tolka. Servermiljön med flera processer gör denna uppgift ännu svårare med traditionella verktyg.
Med detta sagt kommer utvecklare utan tvekan att få mest nytta av OProfile. Den information som jag kommer att presentera kommer att täcka grunderna i båda användningsfallet så att du kan gräva i prestandamätvärdena för alla Linux-program.
Installation
Det finns en mycket viktig anmärkning som måste göras innan du dyker djupt in i OProfile - du kanske inte kan installera den i en virtualiserad miljö. Om du kör Linux i en VirtualBox-, VMWare- eller liknande VM-miljö kanske OProfile inte kommer åt de nödvändiga prestandaräknarna för att samla in data. Dessutom, även om du kan använda den i en virtuell miljö, kan den exakta tidpunkten vara något förvrängd baserat på värdsystemets belastning, så kom ihåg detta om du inte kör på inbyggd hårdvara.
Flera Linux-distributioner har OProfile i sina pakethanteringssystem, vilket gör installationen enkel:
- Debian / Ubuntu / Linux Mint - sudo apt-get install oprofile
- Fedora / CentOS - sudo yum installera oprofil
- Arch - sudo pacman -S oprofile
Ett enkelt exempel
När programmet är installerat, låt oss få fötterna våta med ett trivialt men ändå användbart exempel. Programmet “ls” är ett kommando som du antagligen använder hela tiden. Den visar helt enkelt en lista med filer och mappar i den aktuella katalogen. Låt oss spåra dess produktion:
sudo operf ls
Du ser något som liknar ovanstående skärmdump. När profilen är klar kommer den att meddela “Profiling done.”Det har sparat sina data i en mapp som heter oprofile_data som kan användas för att generera en rapport.
Att köra kommandopreporten (utan sudo i det här fallet) ger en rapport som liknar den här:
I det här exemplet visar standardrapporten antalet prover när processorn inte var i HALT-tillstånd (med andra ord aktivt gjorde något). Kallsyms tillhandahåller symboluppslagning som används av profilen och ld.så och libc.så är en del av glibc-paketet, ett gemensamt bibliotek kopplat till nästan alla Linux-körbara filer som ger grundläggande funktionalitet som utvecklare kan använda för att undvika att återuppfinna hjulet och ge en generell nivå av kompatibilitet mellan olika system. Du kan se att det faktiska programmet ls hade mycket mindre icke-HALT-tid - huvuddelen av tunga lyft gjordes av standardbiblioteken.
När vi är klara med rapporten är det en bra idé att antingen ta bort datamappen eller spara den för framtida analys. I det här exemplet tar vi bara bort det eftersom vi kör exempelövningar. Eftersom vi körde kommandot med sudo måste vi ta bort mappen med sudo. Var försiktig!
sudo rm -Rf oprofile_data
Ett mer komplicerat exempel
I det här nästa exemplet kör vi ett program som faktiskt gör något mer komplicerat än att bara lista filer i den aktuella mappen. Låt oss ladda ner WordPress med wget.
sudo operf wget http: // wordpress.org / senaste.tjära.gz
Efter detta exempel kan vi generera en rapport med kommandot “opreport”:
Du kommer att se mycket mer aktivitet efter den här. Wget-kommandot var tvungen att göra mycket arbete bakom kulisserna för att få den senaste kopian av WordPress. Även om det inte är nödvändigt att undersöka varje objekt, är de intressanta sevärdheterna:
- ath9k och ath9k_hw - Dessa moduler ansvarar för WiFi-anslutningen på den här bärbara datorn.
- mac80211 och cfg80211 - Dessa bibliotek hjälpte till att utföra den nätverksanslutning som krävs av wget.
- libnss_dns och libresolv användes för att lösa wordpress.org-domän till en IP-adress så att wget kan skapa en HTTP-anslutning.
- libcrypto och libssl - Dessa bibliotek är en del av OpenSSL-biblioteket. Detta utförde arbetet med att avkoda mottagna data från https: // url. Observera att även om vi angav en URL med http: // omdirigerade WordPress-servern oss till https: // och wget följde denna omdirigering.
- libpthread - Detta bibliotek utför trådåtgärder som gör det möjligt för program att göra flera saker samtidigt. I det här fallet startade wget en tråd för att ladda ner programmet och tillhandahålla också en ASCII-baserad nedladdningsindikator på skärmen.
Denna typ av data kan ge en mängd information för en utvecklare. Men hur är detta viktigt för en systemadministratör på en server eller en kraftanvändare på ett skrivbord?? Genom att veta vilka delar av ett program som tar mest CPU-tid kan vi ta reda på vad som behöver optimeras eller var avmattningen sker, så att vi kan fatta bättre beslut om hur vi kan optimera vårt system.
I det här exemplet tog mest CPU-tid av krypto / SSL-rutinerna. Detta är förståeligt eftersom kryptografi är en tidskrävande uppgift. Hade wordpress.org-webbplats omdirigerade oss inte till https: // detta bibliotek skulle inte ha använts, vilket sparar oss CPU-tid. Nätverksskiktet skulle fortfarande ha använts, men att använda en trådbunden anslutning istället för en trådlös anslutning skulle sannolikt ha varit mindre beskattande. Inaktivera framstegsindikatorn i wget-programmet (via -nv-omkopplaren) skulle ha sparat CPU-tid när nedladdningsförloppet visas.
Gräva i symboler
Även om standardrapporten ger värdefull och användbar information kan vi gräva vidare. Genom att köra detta:
opreport --demangle = smarta - symboler
Vi kan ta reda på exakt hur mycket CPU-tid som fungerar i biblioteken som förbrukas:
I det här exemplet använde jag kommandot wget ovan men använde en http: // URL (en som inte omdirigerar till https: //) och du kan se frånvaron av OpenSSL-bibliotek i spåret. I stället för bara biblioteksnamnet har vi nu en fullständig lista över de inblandade funktionerna. Som du kan se förbrukade nätverksskiktet större delen av CPU-tiden som inte var HALT.
Tar det till nästa nivå
I de tidigare exemplen har vi använt OProfile för att titta på ett program i taget. Du kan undersöka hela ditt system på en gång med hjälp av -systemomkopplaren:
sudo operf - hela systemet
Med den här tekniken samlar OProfile statistik på samma sätt och stoppar när du trycker på CTRL + C. Därefter kan du köra kommandot opreport. Eftersom profilen sannolikt kommer att generera mycket mer data (särskilt på en stationär eller upptagen server).
opreport & gt; Rapportera.Text
Rapporten kan nu visas i en fil som heter rapport.Text
Låg overhead
Det är viktigt att notera att medan OProfile inte borde störa driften av dina program, kommer det att skapa lite overhead och därmed sakta ner körningen. I våra enkla exempel ovan skapade det inte ett problem, men på ett program med lång körning och omfattande funktionssamtal kommer du sannolikt att märka en skillnad. På grund av detta skulle jag inte rekommendera att använda detta program i en produktionsservermiljö såvida det inte ställs inför ett kritiskt prestandaproblem som måste lösas med live-användning. Även då skulle jag använda den precis tillräckligt länge för att hitta problemet.
Slutsats
OProfile är ett kraftfullt profileringsverktyg för prestanda. Det tappar till den lägsta nivån som finns i Linux för att få prestandaräknare och mätvärden som ger dig värdefull information om dina program.
Borta är dagarna med gissningar i prestandafelsökning - du har nu makten att veta exakt vad ditt system gör och hur du kan förbättra det. Genom att studera de rapporter som genereras av OProfile kan du fatta informerade, datadrivna beslut om hur du optimerar ditt system.