Code-Beispiel
[LINUX] Laufwerks-Statisktik ermitteln
Um die Laufwerks-Statistiken zu ermitteln nutzen wir die Datei /proc/diskstas. Sie enthält alle Laufwerke (auch wirtuelle) und deren Zugriffe.
Im Sniplet wurde die RAM udn LOOP Devices auskommentiert, da sie selten genutzt werden, udn so gut wie nie in funktion sind. Wer dennoch Statistiken darüber möchte, kann sie einfach aus dem Select Case raus nehmen.
Genau Dokumentationen zu der Datei diskstats existieren nicht. jedoch kann man einen vergleich mit dem programm vmstat ziehen, der seine Informationen zum teil aus diskstats bezieht.
Type driveinfo
Device as String
Major as UByte
Minor as UByte
ReadTotal as ULongInt
ReadMerged as ULongInt
ReadSectors as ULongInt
ReadToNextMS as ULongInt
WriteTotal as ULongInt
WriteMerged as ULongInt
WriteSectors as ULongInt
WriteToNextMS as ULongInt
end type
Declare Function F_Usage_Drives(B_DD() as driveinfo, ByRef B_DC as UShort) as UByte
Function F_Usage_Drives(B_DD() as driveinfo, ByRef B_DC as UShort) as UByte
B_DC = 0
Dim XFID as Integer
Dim D as String
Dim DD() as String
Dim DC as Long
Dim X as Long
XFID = FreeFile
Open "/proc/diskstats" for input as #XFID
Do
Input #XFID, D
DC += 1: Redim Preserve DD(DC) as String: DD(DC) = D
If D = "" Then Exit do
Loop
Close #XFID
Dim T as String
Dim XPos as UShort
Dim TD() as String
Dim TC as Long
For X = 1 to DC
D = DD(X)
TC = 0
Do
XPos = InStr(1, D, " ")
If XPos > 0 Then
T = Trim(Mid(D, 1, XPos - 1)): D = Trim(Mid(D, XPos + 1))
Else: T = D: D = ""
End If
If T <> "" Then TC += 1: Redim Preserve TD(TC) as String: TD(TC) = T
If D = "" Then Exit Do
Loop
If TC >= 7 Then
Select case lcase(left(TD(3), 2))
case "", "ra", "lo"
case else
B_DC += 1
Redim Preserve B_DD(B_DC) as driveinfo
With B_DD(B_DC)
.Device = TD(3)
.Major = Val(TD(1))
.Minor = Val(TD(2))
.ReadTotal = ValLng(TD(4))
.ReadMerged = ValLng(TD(5))
.ReadSectors = ValLng(TD(6))
.ReadToNextMS = ValLng(TD(7))
If TC >= 11 Then
.WriteTotal = ValLng(TD(8))
.WriteMerged = ValLng(TD(9))
.WriteSectors = ValLng(TD(10))
.WriteToNextMS = ValLng(TD(11))
End If
End With
If B_DC = 255 Then Exit For
End select
End If
Next
Return 0
End Function
Wir das ganze dann aussieht, udn wie man es abfragt, kann man diesem Beispiel-Aufruf entnehmen.
Hierbei ist zu beachten, das die Totalen Werte ermittelt werden! Wer Zeitlich bedingte (Zugriff/sek.) haben möchte, muss mindestens 2 Aufrufe hintereinander durchführen, mit z.B. bei /sek. 1sek. abstand. Anschliessend subtrahiert man den ersten Wert vom zweiten, udn erhält so die aktuelle Zugriffslast.
Dim DD() as driveinfo
Dim DC as UShort
Dim X as UInteger
F_Usage_Drives(DD(), DC)
For X = 1 to DC
With DD(X)
Print "== " & .Device & " =="
Print "Major: " & .Major
Print "Minor: " & .Minor
Print "Read-Total: " & .ReadTotal
Print "Read-Merged: " & .ReadMerged
Print "Read-Sectors: " & .ReadSectors
Print "Read-ToNextMS: " & .ReadToNextMS
Print "Write-Total: " & .WriteTotal
Print "Write-Merged: " & .WriteMerged
Print "Write-Sectors: " & .WriteSectors
Print "Write-ToNextMS: " & .WriteToNextMS
Print ""
End With
Next
Zusätzliche Informationen und Funktionen |
|
|