VirtualBox

Changeset 43908 in vbox for trunk/src/VBox/Main/src-client


Ignore:
Timestamp:
Nov 19, 2012 5:36:43 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
82169
Message:

Main/Metrics: VM network rate metrics (#6345)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/GuestImpl.cpp

    r42919 r43908  
    3333#include <VBox/VMMDev.h>
    3434#include <iprt/cpp/utils.h>
     35#include <iprt/ctype.h>
     36#include <iprt/stream.h>
    3537#include <iprt/timer.h>
    3638#include <VBox/vmm/pgm.h>
     
    9597
    9698    /* Clear statistics. */
     99    mNetStatRx = mNetStatTx = 0;
     100    mNetStatLastTs = RTTimeNanoTS();
    97101    for (unsigned i = 0 ; i < GUESTSTATTYPE_MAX; i++)
    98102        mCurrentGuestStat[i] = 0;
    99     mGuestValidStats = pm::GUESTSTATMASK_NONE;
     103    mVmValidStats = pm::VMSTATMASK_NONE;
    100104
    101105    mMagic = GUEST_MAGIC;
     
    180184}
    181185
     186/* static */
     187int Guest::staticEnumStatsCallback(const char *pszName, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit,
     188                                          STAMVISIBILITY enmVisiblity, const char *pszDesc, void *pvUser)
     189{
     190    PSTAMCOUNTER pCnt = (PSTAMCOUNTER)pvSample;
     191    char *pszEnd = strrchr((char*)pszName, '/');
     192    if (pszEnd)
     193    {
     194        bool    fRx;
     195        uint8_t uInstance = 0;
     196
     197        switch (pszEnd[1])
     198        {
     199            case 'R':
     200                fRx = true;
     201                break;
     202            case 'T':
     203                fRx = false;
     204                break;
     205            default:
     206                LogRel(("Failed to parse the name of network stat counter (unknown counter): %s\n", pszName));
     207                return VINF_SUCCESS;
     208        }
     209        do
     210            --pszEnd;
     211        while (pszEnd > pszName && RT_C_IS_DIGIT(*pszEnd));
     212        if (RT_SUCCESS(RTStrToUInt8Ex(pszEnd + 1, NULL, 10, &uInstance)))
     213        {
     214            Guest *pGuest = (Guest *)pvUser;
     215            LogFlowFunc(("%s i=%u d=%s %llu %s\n", pszName, uInstance, fRx ? "RX" : "TX",
     216                         pCnt->c, STAMR3GetUnit(enmUnit)));
     217            if (fRx)
     218                pGuest->mNetStatRx += pCnt->c;
     219            else
     220                pGuest->mNetStatTx += pCnt->c;
     221        }
     222        else
     223            LogRel(("Failed to extract the device instance from the name of network stat counter: %s\n", pszEnd));
     224    }
     225    else
     226        LogRel(("Failed to parse the name of network stat counter (no slash): %s\n", pszName));
     227
     228    return VINF_SUCCESS;
     229}
     230
    182231void Guest::updateStats(uint64_t iTick)
    183232{
     
    187236    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    188237
     238    ULONG uNetStatRx = 0;
     239    ULONG uNetStatTx = 0;
    189240    ULONG aGuestStats[GUESTSTATTYPE_MAX];
    190241    RT_ZERO(aGuestStats);
    191     ULONG validStats = mGuestValidStats;
     242    ULONG validStats = mVmValidStats;
    192243    /* Check if we have anything to report */
    193244    if (validStats)
    194245    {
    195         mGuestValidStats = pm::GUESTSTATMASK_NONE;
     246        mVmValidStats = pm::VMSTATMASK_NONE;
    196247        memcpy(aGuestStats, mCurrentGuestStat, sizeof(aGuestStats));
    197248    }
     
    226277            if (rc == VINF_SUCCESS)
    227278            {
    228                 validStats |= pm::GUESTSTATMASK_MEMSHARED;
     279                validStats |= pm::VMSTATMASK_GUEST_MEMSHARED;
    229280            }
    230281        }
     
    236287            if (rc == VINF_SUCCESS)
    237288            {
    238                 validStats |= pm::GUESTSTATMASK_ALLOCVMM|pm::GUESTSTATMASK_FREEVMM|
    239                     pm::GUESTSTATMASK_BALOONVMM|pm::GUESTSTATMASK_SHAREDVMM;
     289                validStats |=
     290                    pm::VMSTATMASK_VMM_ALLOC  | pm::VMSTATMASK_VMM_FREE |
     291                    pm::VMSTATMASK_VMM_BALOON | pm::VMSTATMASK_VMM_SHARED;
    240292            }
    241293        }
    242294
    243     }
    244 
    245     mParent->reportGuestStatistics(validStats,
    246                                    aGuestStats[GUESTSTATTYPE_CPUUSER],
    247                                    aGuestStats[GUESTSTATTYPE_CPUKERNEL],
    248                                    aGuestStats[GUESTSTATTYPE_CPUIDLE],
    249                                    /* Convert the units for RAM usage stats: page (4K) -> 1KB units */
    250                                    mCurrentGuestStat[GUESTSTATTYPE_MEMTOTAL] * (_4K/_1K),
    251                                    mCurrentGuestStat[GUESTSTATTYPE_MEMFREE] * (_4K/_1K),
    252                                    mCurrentGuestStat[GUESTSTATTYPE_MEMBALLOON] * (_4K/_1K),
    253                                    (ULONG)(uSharedMem / _1K), /* bytes -> KB */
    254                                    mCurrentGuestStat[GUESTSTATTYPE_MEMCACHE] * (_4K/_1K),
    255                                    mCurrentGuestStat[GUESTSTATTYPE_PAGETOTAL] * (_4K/_1K),
    256                                    (ULONG)(uAllocTotal / _1K), /* bytes -> KB */
    257                                    (ULONG)(uFreeTotal / _1K),
    258                                    (ULONG)(uBalloonedTotal / _1K),
    259                                    (ULONG)(uSharedTotal / _1K));
     295        uint64_t uRxPrev = mNetStatRx;
     296        uint64_t uTxPrev = mNetStatTx;
     297        mNetStatRx = mNetStatTx = 0;
     298        rc = STAMR3Enum(pVM, "*/ReceiveBytes|*/TransmitBytes", staticEnumStatsCallback, this);
     299        uint64_t uTsNow = RTTimeNanoTS();
     300        uint64_t uTimePassed = uTsNow - mNetStatLastTs;
     301        mNetStatLastTs = uTsNow;
     302        uNetStatRx = (ULONG)((mNetStatRx - uRxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */
     303        uNetStatTx = (ULONG)((mNetStatTx - uTxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */
     304        LogFlowThisFunc(("Net Rx=%llu Tx=%llu Ts=%llu Delta=%llu\n", mNetStatRx, mNetStatTx, uTsNow, uTimePassed));
     305        AssertRC(rc);
     306        validStats |= pm::VMSTATMASK_NET_RX | pm::VMSTATMASK_NET_TX;
     307    }
     308
     309    mParent->reportVmStatistics(validStats,
     310                                aGuestStats[GUESTSTATTYPE_CPUUSER],
     311                                aGuestStats[GUESTSTATTYPE_CPUKERNEL],
     312                                aGuestStats[GUESTSTATTYPE_CPUIDLE],
     313                                /* Convert the units for RAM usage stats: page (4K) -> 1KB units */
     314                                mCurrentGuestStat[GUESTSTATTYPE_MEMTOTAL] * (_4K/_1K),
     315                                mCurrentGuestStat[GUESTSTATTYPE_MEMFREE] * (_4K/_1K),
     316                                mCurrentGuestStat[GUESTSTATTYPE_MEMBALLOON] * (_4K/_1K),
     317                                (ULONG)(uSharedMem / _1K), /* bytes -> KB */
     318                                mCurrentGuestStat[GUESTSTATTYPE_MEMCACHE] * (_4K/_1K),
     319                                mCurrentGuestStat[GUESTSTATTYPE_PAGETOTAL] * (_4K/_1K),
     320                                (ULONG)(uAllocTotal / _1K), /* bytes -> KB */
     321                                (ULONG)(uFreeTotal / _1K),
     322                                (ULONG)(uBalloonedTotal / _1K),
     323                                (ULONG)(uSharedTotal / _1K),
     324                                uNetStatRx,
     325                                uNetStatTx);
    260326}
    261327
     
    620686    static ULONG indexToPerfMask[] =
    621687    {
    622         pm::GUESTSTATMASK_CPUUSER,
    623         pm::GUESTSTATMASK_CPUKERNEL,
    624         pm::GUESTSTATMASK_CPUIDLE,
    625         pm::GUESTSTATMASK_MEMTOTAL,
    626         pm::GUESTSTATMASK_MEMFREE,
    627         pm::GUESTSTATMASK_MEMBALLOON,
    628         pm::GUESTSTATMASK_MEMCACHE,
    629         pm::GUESTSTATMASK_PAGETOTAL,
    630         pm::GUESTSTATMASK_NONE
     688        pm::VMSTATMASK_GUEST_CPUUSER,
     689        pm::VMSTATMASK_GUEST_CPUKERNEL,
     690        pm::VMSTATMASK_GUEST_CPUIDLE,
     691        pm::VMSTATMASK_GUEST_MEMTOTAL,
     692        pm::VMSTATMASK_GUEST_MEMFREE,
     693        pm::VMSTATMASK_GUEST_MEMBALLOON,
     694        pm::VMSTATMASK_GUEST_MEMCACHE,
     695        pm::VMSTATMASK_GUEST_PAGETOTAL,
     696        pm::VMSTATMASK_NONE
    631697    };
    632698    AutoCaller autoCaller(this);
     
    639705
    640706    mCurrentGuestStat[enmType] = aVal;
    641     mGuestValidStats |= indexToPerfMask[enmType];
     707    mVmValidStats |= indexToPerfMask[enmType];
    642708    return S_OK;
    643709}
Note: See TracChangeset for help on using the changeset viewer.

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