Tips en Trucs 2012

Toezicht schijfruimte en CPU

Vandaag twee tips voor de prijs van één. De eerste tip toont hoe je kunt nagaan hoe de harde schijfruimte gebruikt wordt. Waardoor je bij het vollopen van de hard schijf op tijd kunt opruimen. De tweede tip bespioneert een uur lang uw processen (programma's) waardoor je kunt zien welke proces de processor het meest belast. Daarmee kan je aan de slag om cpu veelvraten die je zelden gebruikt uit te schakelen, waardoor andere processen intensiever gebruik kunnen maken van de CPU en dus sneller werken.

Gebruik harde schijf

De harde schijf ruimte is gelimiteerd. Daarom is het handig om nu en dan te controleren hoeveel harde schijfruimte nog beschikbaar is. Bij een schaarste aan harde schijfruimte moeten we op zoek naar grote bestanden die we kunnen verwijderen of verplaatsen om ruimte vrij te maken.

Inleiding

De meest gebruikte opdrachten in linux om de schijfruimte te controleren zijn df (disk free) en du (disk usage).

Aan de slag

Om de schijfruimte gebruikt door een bestand (of bestanden) op te zoeken, gebruik je
du tekst.txt
4       tekst.txt
Standaard wordt de gebruikte schijfruimte uitgedrukt in kilobytes. Om de gebruikte schijfruimte van alle bestanden afzonderlijk in een map op te zoeken, gebruik je
du -a test
4       test/pcpu.sh
4       test/uitvoer.txt
4       test/process_log.sh
4       test/teksten/tekst.txt
8       test/teksten
24      test
-a zorgt ervoor dat alle bestanden in de opgegeven map en zijn submappen recursief onderzocht worden. Zonder -a wordt enkel de schijfruimte ingenomen door de map en zijn submappen weergegeven.
du test
8       test/teksten
24      test

En er is nog meer...

Standaard wordt de gebruikte schijfruimte in kilobytes uitgedrukt. Een menselijker manier om gebruikte schijfruimte weer te geven is het eveneens weergeven van de gebruikte eenheid (KB, MB of GB). Daarvoor kun je je gebruik maken van het argument -h (human-readable):
du -h test/pcpu.sh
4,0K    test/pcpu.sh
du -h test
8,0K    test/teksten
24K     test
Het opzoeken van grote bestanden is een veel voorkomende bezigheid. Je moet ze namelijk regelmatig verwijderen of verplaatsen. Samen met de sort opdracht kunnen we deze eenvoudig opsporen met:
du -ak /home/dany/ | sort -nrk 1 | head
36445496        /home/dany/
989680  /home/dany/HoN
942436  /home/dany/HoN/game
680164  /home/dany/HoN/game/resources0.s2z
572548  /home/dany/.mozilla
572540  /home/dany/.mozilla/firefox
572504  /home/dany/.mozilla/firefox/htosgwab.default
503320  /home/dany/.mozilla/firefox/htosgwab.default/Cache
253812  /home/dany/.local
253808  /home/dany/.local/share

De -a zorgt ervoor dat alle mappen en bestanden in /home/dany en al zijn submappen weergegeven worden. De eerste kolom van de uitvoer bevat de grootte in kilobytes (-k argument) en de tweede kolom bevat de naam van het bestand of de map.

De opdracht sort wordt gebruikt om de eerste kolom (k 1) numeriek (-n) in aflopende volgorde (r)(reverse) te sorteren. De opdracht head wordt gebruikt om enkel de eerste 10 regels van de uitvoer weer te geven, m.a.w. de 10 grootste bestanden en mappen.

Een tekortkoming van de bovenstaande opdrachtregel is dat er ook mappen worden weergegeven. Als je enkel de grootste bestanden wilt opzoeken, kun je gebruik maken van de volgende aangepaste opdrachtregel
find . -type f -exec du -k {} \; | sort -nrk 1 | head -n 40
680164  ./HoN/game/resources0.s2z
231540  ./HoN/game/textures.s2z
98308   ./.kde4/share/apps/nepomuk/repository/main/data/virtuosobackend/soprano-virtuoso.db
65952   ./.thunderbird/zhfgduop.default/ImapMail/zimbra.snt-1.be/INBOX
65536   ./.local/share/akonadi/db_data/ib_logfile1
65536   ./.local/share/akonadi/db_data/ib_logfile0
46084   ./.mozilla/firefox/htosgwab.default/urlclassifier3.sqlite
43640   ./.mozilla/firefox/htosgwab.default/Cache/7/B7/B6299d01
35492   ./.mozilla/firefox/htosgwab.default/Cache/5/89/7DB52d01
32776   ./.mozilla/firefox/htosgwab.default/Cache/_CACHE_003_
We gebruiken hier de opdracht find om alle bestanden af te zonderen en door te spelen aan du.

Lijst van de meest CPU belastende processen in het afgelopen uur

De processor is één van de belangrijkste systeembronnen van onze computer. Het is dus interessant om de processen die veel tijd van de CPU opeisen te kennen. Het recept om dit te achterhalen is het in het oog houden (monitoring) van de door de processen opgeëiste CPU tijd. Dit moet gebeuren terwijl het systeem normaal gebruikt en belast wordt. In onze tip starten we daarvoor een script die één uur lang de door de processen opgeëiste CPU tijd in een bestand opslaat (loggen).

Inleiding

De opdracht ps wordt gebruikt om details van lopende processen op een systeem op te vragen. Je kunt er de CPU tijd, geheugengebruik, status van een proces, enz. mee opvragen. Wij gaan de door de processen gebruikte CPU tijd gedurende één uur opslaan en een top 10 opmaken door met tekstverwerking de opgeslagen gegevens te verwerken.

Aan de slag

Het volgende script zorgt voor het opslaan en het verwerken van de in één uur verzamelde gegevens (CPU gebruik):
#!/bin/bash
#Name: pcpu_usage.sh
#Description: Script to calculate cpu usage by processes for 1 hour
#             Berekent het processorgebruik door processen gedurende 1 uur
SECS=3600
#Change the SECS to total seconds for which monitoring is to be performed.
#SECS bepaalt hoelang het toezicht duurt 
UNIT_TIME=60
#UNIT_TIME is the interval in seconds between each sampling
#UNIT_TIME bepaalt in seconden hoeveel tijd tussen elke bemonstering 
STEPS=$(( $SECS / $UNIT_TIME ))
#echo Watching CPU usage... ;
echo Toezicht op het CPU gebruik... ;
for((i=0;i<STEPS;i++))
do
  ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
  sleep $UNIT_TIME
done
echo
#echo CPU eaters :
echo CPU veelvraten:
cat /tmp/cpu_usage.$$ | \
awk '
{ process[$1]+=$2; }
END{ 
  for(i in process)
  {
    printf("%-20s %s\n",i, process[i]) ;
  }
   }' | sort -nrk 2 | head
rm /tmp/cpu_usage.$$
#Remove the temporary log file 
#Verwijderen van het log bestand 
Bij het uitvoeren van dit script krijg je na één uur de volgende resultaten:
./pcpu_usage.sh 
Toezicht op het CPU gebruik...

CPU veelvraten:
Xorg                 1296.4
fiberlamp            276.5
kwin                 17.5
kscreenlocker        2.6
plasma-desktop       1.9
xbindkeys            0
watchdog/3           0
watchdog/2           0
watchdog/1           0
watchdog/0           0

Deze resultaten komen van een computer die één uur lang niet gebruikt werd. Zo merk je dat de grafische omgeving (Xorg) de grootste slokop is, nu begrijp je waarom men op servers geen grafische omgeving installeert of start. Daarnaast werd een schermbeveiliging (fiberlamp) actief, schermbeveiligingen op computers op batterijen gebruik je dus best niet (minder CPU belasting betekent immers minder stroomverbruik).

Hoe werkt het?

In het bovenstaande script worden de gegevens verzameld door de opdracht ps -eo comm,pcpu waarbij ps de opdrachtnaam (comm) en het CPU gebruik in percent (pcpu) van de processen opvraagt. Deze opdracht herhalen we regelmatig (elke minuut) gedurende één uur en slaan de verzamelde gegevens op in het bestand /tmp/cpu_usage.$$. Tussen elke meting wacht het script met de opdracht sleep 60 één minuut.

De opdracht tail -n +2 wordt gebruikt om de hoofding in de uitvoer van de ps opdracht te verwijderen, waardoor enkel de gegevens overblijven.

De $$ tekens in de bestandsnaam cpu_usage.$$ worden tijdens het uitvoeren van het script vervangen door het proces ID (PID) van het script. Dit PID is een cijfer waaraan je kunt zien hoeveel processen voordien reeds werden opgestart. Aangezien dit logbestand een tijdelijk bestand is wordt het in de map /tmp opgeslagen.

Het logbestand wordt na één uur ingelezen en bevat 60 metingen (een uur lang elke minuut een meting). Daarna wordt awk gebruik om van elk proces alle CPU belastingen samen te tellen. Daarbij wordt gebruik gemaakt van een associatieve array, waarbij de naam van het proces als array sleutel (index) wordt gebruikt. Uiteindelijk worden de resultaten in aflopende volgorde numeriek gesorteerd en worden de eerste 10 regels weergegeven. Deze regels bevatten de processen die in het afgelopen uur de processor het zwaarst hebben belast.

Het spreekt voor zich dat je het script kunt aanpassen om andere meetwaarden te verzamelen en te verwerken.