【问题标题】:How to control reading from file using performance counters?如何使用性能计数器控制从文件中读取?
【发布时间】:2014-10-28 10:19:06
【问题描述】:

在驱动器 G 上执行了几项操作。我的程序应该从文件中读取数据。当磁盘使用率非常高(> 90%)时,程序应该减慢读取速度,这样它就不会干扰使用磁盘的其他进程。
显然,我想,在调用@之后检查Disk Time 987654323@ 将导致计数器返回非常高的百分比,因为磁盘刚刚被使用。你可以在image上看到。

关于如何正确检查Disk Time的任何建议?

PDH_HQUERY query;
PDH_HCOUNTER counter;
PdhOpenQuery(NULL, 0, &query);
PdhAddCounterA(query, "\\LogicalDisk(G:)\\% Disk Time", 0, &counter);
PdhCollectQueryData(query);

auto getDiskTime = [&]()->double
{
    PDH_FMT_COUNTERVALUE fmtCounter;
    PdhCollectQueryData(query); 
    PdhGetFormattedCounterValue(counter, PDH_FMT_DOUBLE, 0, &fmtCounter);       

    return fmtCounter.doubleValue;
};

for(...)
{
   get_data_from_file();

   print_done_percentage();

   double diskUsage = getDiskTime();
   if(diskUsage >= 90)
   {            
       std::cout << "The disk usage is over << diskUsage << "%. I'll wait...                
       while(diskUsage >= 90)
       {
           diskUsage = getDiskTime();
           Sleep(500);
       }
   }
}

【问题讨论】:

    标签: c++ performancecounter resource-monitor


    【解决方案1】:

    一个独特的监控线程可以帮助您更独立于写入来衡量磁盘使用情况。

    线程执行的函数如下所示:

    void diskmonitor(atomic<double>& du, const atomic<bool>& finished) {
        while (!finished) {         // stop looping as soon as main process has finished job
            du = getDiskTime();     // measure disk
            this_thread::sleep_for(chrono::milliseconds(500)); //wait
        }
    }
    

    它通过引用传递的原子(即避免数据竞争)变量与主线程通信。

    您的处理循环如下所示:

    atomic<bool> finished=false;            // tell diskmonitor that the processing is ongoing
    atomic<double> diskusage=0;             // last disk usage read by diskmonitor
    thread t(diskmonitor, ref(diskusage), ref(finished));   // launch monitor
    for (int i = 0; i < 1000; i++)
    {
        ...
        print_done_percentage();
    
        while (diskusage >= 90) {    // disk usage is filled in background
            std::cout << "The disk usage is over " << diskusage << ".I'll wait...\n";
            this_thread::sleep_for(chrono::milliseconds(500));
            }
        ...
    }
    finished = false;           // tell diskmonitor that i't's finished, so that it ends the loop
    t.join();                   // wait until diskmonitor is finished. 
    

    此示例使用标准 C++ 线程。当然,您可以使用特定于操作系统的线程编写类似的代码。

    【讨论】:

    • 我以完全相同的解决方案结束:) 我登录以删除我的帖子,但你已经回答了:) 但是,我仍然觉得你的回答很有帮助,因为我使用了 C CreateThread,我喜欢你的c++ 线程使用情况。
    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2021-11-27
    • 2019-02-01
    相关资源
    最近更新 更多