System.Diagnostics.PerformanceCounter
कक्षा का उपयोग करके, आप जिस सूचकांक को अनुक्रमणित कर रहे हैं उससे संबंधित फिजिकडिस्क काउंटर से संलग्न करें।
नीचे कुछ कोड है जो चित्रित करने के लिए है, हालांकि वर्तमान में इसे "सी:" ड्राइव में कोड किया गया है। आप अपनी प्रक्रिया को स्कैन करने वाले किसी भी ड्राइव को "सी:" बदलना चाहेंगे। (यह प्रदर्शन काउंटरों के अस्तित्व को स्पष्ट करने के लिए केवल एक मोटा नमूना कोड है - इसे सटीक जानकारी प्रदान करने के रूप में न लें - हमेशा एक गाइड के रूप में उपयोग किया जाना चाहिए। अपने स्वयं के उद्देश्य के लिए बदलें)
% निष्क्रिय समय का निरीक्षण करें काउंटर जो इंगित करता है कि ड्राइव कितनी बार कर रही है। 0% निष्क्रिय का मतलब है कि डिस्क व्यस्त है, लेकिन इसका मतलब यह नहीं है कि यह फ्लैट-आउट है और अधिक डेटा स्थानांतरित नहीं कर सकता है।
साथ वर्तमान डिस्क पंक्ति लंबाई कम्बाइन % निष्क्रिय समय और इस आपको पता चलेगा कि ड्राइव इतना व्यस्त है कि यह डेटा के लिए सभी अनुरोधों को सेवा नहीं कर सकते हो रही है। एक सामान्य दिशानिर्देश के रूप में, 0 से अधिक कुछ का मतलब है कि ड्राइव शायद व्यस्त है और 2 से अधिक का मतलब है कि ड्राइव पूरी तरह से संतृप्त है। ये नियम एसएसडी और एचडीडी दोनों पर काफी अच्छी तरह से लागू होते हैं।
इसके अलावा, आपके द्वारा पढ़े गए किसी भी मूल्य को समय पर एक तात्कालिक मूल्य है। आपको कुछ परिणामों पर चलने वाला औसत करना चाहिए, उदा। निर्णय लेने के लिए परिणाम से जानकारी का उपयोग करने से पहले हर 100 एमएमएस और औसत 5 रीडिंग्स को पढ़ने से पहले (यानी, आपके अगले आईओ अनुरोध करने से पहले काउंटर व्यवस्थित होने तक प्रतीक्षा करें)।
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);
}
}
स्रोत
2010-10-25 11:44:43
क्या सेवा में व्यवस्थापकीय विशेषाधिकार हैं या सामान्य उपयोगकर्ता खाते के रूप में चलेंगे? (भौतिक डिस्क के लिए प्रदर्शन काउंटरों को व्यवस्थापक विशेषाधिकार की आवश्यकता होती है)। उत्तर के आधार पर, एक और तरीका हो सकता है। –
हां, इसमें व्यवस्थापकीय विशेषाधिकार होंगे। – Anatoly