Utilizzando la classe System.Diagnostics.PerformanceCounter
, collegarsi al contatore PhysicalDisk relativo all'unità che si sta indicizzando.
Di seguito è riportato un codice per illustrare, sebbene sia attualmente codificato nel disco "C:". Dovrai cambiare "C:" a seconda del tuo processo di scansione. (Questo è un codice di esempio approssimativo solo per illustrare l'esistenza di contatori delle prestazioni - non utilizzarlo come fornire informazioni accurate - deve sempre essere utilizzato solo come guida. Modifica per i propri scopi)
Rispettare il tempo di inattività % Contatore che indica quanto spesso l'unità sta facendo qualcosa. 0% inattivo significa che il disco è occupato, ma non significa necessariamente che è flat-out e non può trasferire più dati.
combinare il tempo di inattività % con corrente coda del disco Lunghezza e questo vi dirà se l'unità è sempre così occupato che non può servire tutte le richieste di dati. Come regola generale, qualsiasi valore superiore a 0 indica che l'unità è probabilmente esaurita e che qualcosa oltre 2 significa che l'unità è completamente saturata. Queste regole si applicano sia a SSD che a HDD abbastanza bene.
Inoltre, qualsiasi valore letto è un valore istantaneo in un punto nel tempo. Dovresti eseguire una media parziale su alcuni risultati, ad es. effettuare una lettura ogni 100 ms e una media di 5 letture prima di utilizzare le informazioni dal risultato per prendere una decisione (ad esempio, attendere fino a quando i contatori si stabiliscono prima di effettuare la successiva richiesta di I/O).
internal DiskUsageMonitor(string driveName)
{
// Get a list of the counters and look for "C:"
var perfCategory = new PerformanceCounterCategory("PhysicalDisk");
string[] instanceNames = perfCategory.GetInstanceNames();
foreach (string name in instanceNames)
{
if (name.IndexOf("C:") > 0)
{
if (string.IsNullOrEmpty(driveName))
driveName = name;
}
}
_readBytesCounter = new PerformanceCounter("PhysicalDisk",
"Disk Read Bytes/sec",
driveName);
_writeBytesCounter = new PerformanceCounter("PhysicalDisk",
"Disk Write Bytes/sec",
driveName);
_diskQueueCounter = new PerformanceCounter("PhysicalDisk",
"Current Disk Queue Length",
driveName);
_idleCounter = new PerformanceCounter("PhysicalDisk",
"% Idle Time",
driveName);
InitTimer();
}
internal event DiskUsageResultHander DiskUsageResult;
private void InitTimer()
{
StopTimer();
_perfTimer = new Timer(_updateResolutionMillisecs);
_perfTimer.Elapsed += PerfTimerElapsed;
_perfTimer.Start();
}
private void PerfTimerElapsed(object sender, ElapsedEventArgs e)
{
float diskReads = _readBytesCounter.NextValue();
float diskWrites = _writeBytesCounter.NextValue();
float diskQueue = _diskQueueCounter.NextValue();
float idlePercent = _idleCounter.NextValue();
if (idlePercent > 100)
{
idlePercent = 100;
}
if (DiskUsageResult != null)
{
var stats = new DiskUsageStats
{
DriveName = _readBytesCounter.InstanceName,
DiskQueueLength = (int)diskQueue,
ReadBytesPerSec = (int)diskReads,
WriteBytesPerSec = (int)diskWrites,
DiskUsagePercent = 100 - (int)idlePercent
};
DiskUsageResult(stats);
}
}
fonte
2010-10-25 11:44:43
Il servizio dispone di privilegi amministrativi o può essere eseguito come un normale account utente? (I contatori di prestazioni per dischi fisici richiedono privilegi di amministratore). A seconda della risposta, potrebbe esserci un altro modo. –
Sì, avrà i privilegi di amministratore. – Anatoly