VirtualBox

Changeset 43842 in vbox for trunk


Ignore:
Timestamp:
Nov 8, 2012 4:51:46 PM (12 years ago)
Author:
vboxsync
Message:

Main/Metrics: Alternative way to collect disk stats on Linux (#6345)

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/linux/PerformanceLinux.cpp

    r43840 r43842  
    6262    char *getDiskName(char *pszDiskName, size_t cbDiskName, const char *pszDevName, bool fTrimDigits);
    6363    void addVolumeDependencies(const char *pcszVolume, DiskList& listDisks);
     64    char *trimTrailingDigits(char *pszName);
    6465
    6566    struct VMProcessStats
     
    332333int CollectorLinux::getRawHostDiskLoad(const char *name, uint64_t *disk_ms, uint64_t *total_ms)
    333334{
     335#if 0
    334336    int rc = VINF_SUCCESS;
    335337    char szIfName[/*IFNAMSIZ*/ 16 + 36];
     
    352354    else
    353355        rc = VERR_ACCESS_DENIED;
     356#else
     357    int rc = VERR_MISSING;
     358    FILE *f = fopen("/proc/diskstats", "r");
     359    if (f)
     360    {
     361        char szBuf[128];
     362        while (fgets(szBuf, sizeof(szBuf), f))
     363        {
     364            char *pszBufName = &szBuf[13];
     365            char *pszBufData = strchr(pszBufName, ' ');
     366            if (!pszBufData)
     367            {
     368                LogRel(("CollectorLinux::getRawHostDiskLoad() failed to parse disk stats: %s\n", szBuf));
     369                continue;
     370            }
     371            *pszBufData++ = '\0';
     372            if (!strcmp(name, pszBufName))
     373            {
     374                long long unsigned int u64Busy, tmp;
     375
     376                if (sscanf(pszBufData, "%llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu",
     377                           &tmp, &tmp, &tmp, &tmp, &tmp, &tmp, &tmp, &tmp, &tmp, &u64Busy, &tmp) == 11)
     378                {
     379                    *disk_ms   = u64Busy;
     380                    *total_ms  = (uint64_t)(mSingleUser + mSingleKernel + mSingleIdle) * 1000 / mHZ;
     381                    rc = VINF_SUCCESS;
     382                }
     383                else
     384                    rc = VERR_FILE_IO_ERROR;
     385                break;
     386            }
     387        }
     388        fclose(f);
     389    }
     390#endif
    354391
    355392    return rc;
     393}
     394
     395char *CollectorLinux::trimTrailingDigits(char *pszName)
     396{
     397    unsigned cbName = strlen(pszName);
     398    if (cbName == 0)
     399        return pszName;
     400
     401    char *pszEnd = pszName + cbName - 1;
     402    while (pszEnd > pszName && RT_C_IS_DIGIT(*pszEnd))
     403        pszEnd--;
     404    pszEnd[1] = '\0';
     405
     406    return pszName;
    356407}
    357408
     
    380431    {
    381432        LogRel(("VolInfo: Failed to get program path, rc=%Rrc\n", rc));
    382         return VERR_INVALID_PARAMETER;
     433        return;
    383434    }
    384435    strcat(szVolInfo, "/" VBOXVOLINFO_NAME " ");
     
    391442
    392443        while (fgets(szBuf, sizeof(szBuf), fp))
    393             listDisks.push_back(RTCString(szBuf));
     444            listDisks.push_back(RTCString(trimTrailingDigits(szBuf)));
    394445
    395446        pclose(fp);
  • trunk/src/VBox/Main/testcase/tstCollector.cpp

    r43835 r43842  
    314314        return 1;
    315315    }
    316 #if 1
     316#if 0
    317317    pm::CollectorHints hints;
    318318    hints.collectHostCpuLoad();
     
    482482    rc = testDisk(collector);
    483483#endif
    484 #if 1
     484#if 0
    485485    RTPrintf("tstCollector: TESTING - Performance\n\n");
    486486
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette