Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行系统命令非常慢 我有一个C++程序,它能很长时间连续地记录大量的数据。因此,我有一个线程来监控可用的磁盘空间,一旦达到一定的百分比,就会做一些事情_C++_Performance_File Io_System - Fatal编程技术网

执行系统命令非常慢 我有一个C++程序,它能很长时间连续地记录大量的数据。因此,我有一个线程来监控可用的磁盘空间,一旦达到一定的百分比,就会做一些事情

执行系统命令非常慢 我有一个C++程序,它能很长时间连续地记录大量的数据。因此,我有一个线程来监控可用的磁盘空间,一旦达到一定的百分比,就会做一些事情,c++,performance,file-io,system,C++,Performance,File Io,System,这是在双四核x64 CentOS系统上进行的,录制发生在直接连接的SATA磁盘上,这些磁盘仅用于使用ext3文件系统进行录制。我通过使用system()发出“df”命令并读取结果来监视磁盘使用情况 在昨晚运行该命令时,我在日志文件中注意到,运行该命令花了整整39分钟来查找磁盘使用情况 处理超时的代码如下所示: int DiskSpaceMonitor::handle_timeout(const ACE_Time_Value& time_, const void* pFunc_) {

这是在双四核x64 CentOS系统上进行的,录制发生在直接连接的SATA磁盘上,这些磁盘仅用于使用ext3文件系统进行录制。我通过使用
system()
发出“df”命令并读取结果来监视磁盘使用情况

在昨晚运行该命令时,我在日志文件中注意到,运行该命令花了整整39分钟来查找磁盘使用情况

处理超时的代码如下所示:

int DiskSpaceMonitor::handle_timeout(const ACE_Time_Value& time_, const void* pFunc_)
{
    LOG4CXX_TRACE(m_logger, "DiskSpaceMonitor timer fired");

    ACE_UINT8 usagePercent = m_diskChecker.getDiskSpaceUsagePercentage(m_monitoredDisk);

    m_fileRecorder->notifyDiskUsage(usagePercent);

    return 0;
} 
调用执行“df”的函数:

ACE_UINT8 DiskSpaceChecker::getDiskSpaceUsagePercentage(std::string diskMountPoint)
{
std::stringstream usageCommand;

usageCommand使用
system
的另一种方法是操作系统特定的API调用,如


但是我同意花这么长时间很奇怪。你能重新创建这个吗?

也许你可以尝试使用
fstatvfs()/statvfs()
系统调用以获取可用磁盘空间量,然后查看这是否有任何区别。

我看到当某些NFS fs已装入但客户端无法访问服务器时,“df”挂起。那么您是否已装入任何网络fs


在任何情况下,正如其他人已经指出的,您应该使用statvfs()/fstatvfs()而不是system()。如果挂起的fs不是您试图运行的statvfs(),这也可能有助于挂起打开。

我不确定,但是,
getrusage
可以作为一个选项吗?在这个缓慢的响应过程中,了解iowait状态会是什么样子会很有趣。谢谢,我会让statvfs试一试。我的测试运行了几个小时,我只见过一次,所以重新创建它并不容易。但我会尝试这样做。服务器安装了NFS挂载但是在这个录制过程中,或者在
df
命令中没有使用它们。也许如果它们坏了,
df
确实会挂起。我会尝试一下statvfs(),看看这是否会改善情况。干杯。是的,如果挂起任何挂载的fs,df就会挂起,因为df本质上是为每个挂载的fs运行statvfs()。
ACE_UINT8 DiskSpaceChecker::getDiskSpaceUsagePercentage(std::string diskMountPoint)
{
    std::stringstream usageCommand;
    usageCommand << "df -PH " << diskMountPoint << " | grep -v \"^Filesystem\" | awk '{print $5}' | cut -d'%' -f1 > " << m_mountSpaceFile;
    system(usageCommand.str().c_str());

    std::ifstream inFile(m_mountSpaceFile.c_str(), std::ios::in);
    if (!inFile)
    {
        return 0;
    }

    std::string usageStr;
    inFile >> usageStr;
    int usage = atoi(usageStr.c_str());

    inFile.close();

    std::stringstream rmCmd;
    rmCmd << "rm " << m_mountSpaceFile;
    system(rmCmd.str().c_str());

    LOG4CXX_DEBUG(m_logger, "Disk usage for disk: " << diskMountPoint << " = " << usage << "%");

    return  usage;
}