SH-3275 WIP Run viewer metrics for object update messages
improved update logging API and output formatmaster
parent
90547ff411
commit
5d32e23a11
|
|
@ -48,6 +48,24 @@
|
|||
-->
|
||||
</array>
|
||||
</map>
|
||||
</array>
|
||||
<map>
|
||||
<key>level</key>
|
||||
<string>NONE</string>
|
||||
<key>functions</key>
|
||||
<array>
|
||||
</array>
|
||||
<key>classes</key>
|
||||
<array>
|
||||
<string>LLViewerStatsRecorder</string>
|
||||
</array>
|
||||
<key>files</key>
|
||||
<array>
|
||||
</array>
|
||||
<key>tags</key>
|
||||
<array>
|
||||
|
||||
</array>
|
||||
</map>
|
||||
</array>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -719,10 +719,6 @@ bool LLAppViewer::init()
|
|||
|
||||
mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling"));
|
||||
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::initClass();
|
||||
#endif
|
||||
|
||||
// *NOTE:Mani - LLCurl::initClass is not thread safe.
|
||||
// Called before threads are created.
|
||||
LLCurl::initClass(gSavedSettings.getF32("CurlRequestTimeOut"),
|
||||
|
|
@ -1894,10 +1890,6 @@ bool LLAppViewer::cleanup()
|
|||
|
||||
LLMetricPerformanceTesterBasic::cleanClass() ;
|
||||
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::cleanupClass();
|
||||
#endif
|
||||
|
||||
llinfos << "Cleaning up Media and Textures" << llendflush;
|
||||
|
||||
//Note:
|
||||
|
|
|
|||
|
|
@ -334,6 +334,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
|
||||
U64 region_handle;
|
||||
mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle);
|
||||
|
||||
LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle);
|
||||
|
||||
if (!regionp)
|
||||
|
|
@ -345,9 +346,9 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
U8 compressed_dpbuffer[2048];
|
||||
LLDataPackerBinaryBuffer compressed_dp(compressed_dpbuffer, 2048);
|
||||
LLDataPacker *cached_dpp = NULL;
|
||||
|
||||
LLViewerStatsRecorder& recorder = LLViewerStatsRecorder::instance();
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(regionp);
|
||||
recorder.beginObjectUpdateEvents(1.f);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < num_objects; i++)
|
||||
|
|
@ -355,6 +356,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
// timer is unused?
|
||||
LLTimer update_timer;
|
||||
BOOL justCreated = FALSE;
|
||||
S32 msg_size = 0;
|
||||
|
||||
if (cached)
|
||||
{
|
||||
|
|
@ -362,6 +364,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
U32 crc;
|
||||
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, id, i);
|
||||
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_CRC, crc, i);
|
||||
msg_size += sizeof(U32) * 2;
|
||||
|
||||
// Lookup data packer and add this id to cache miss lists if necessary.
|
||||
U8 cache_miss_type = LLViewerRegion::CACHE_MISS_TYPE_NONE;
|
||||
|
|
@ -377,9 +380,9 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
else
|
||||
{
|
||||
// Cache Miss.
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->recordCacheMissEvent(id, update_type, cache_miss_type);
|
||||
#endif
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
recorder.recordCacheMissEvent(id, update_type, cache_miss_type, msg_size);
|
||||
#endif
|
||||
|
||||
continue; // no data packer, skip this object
|
||||
}
|
||||
|
|
@ -391,10 +394,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
S32 compressed_length;
|
||||
compressed_dp.reset();
|
||||
|
||||
|
||||
U32 flags = 0;
|
||||
if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
|
||||
{
|
||||
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, i);
|
||||
msg_size += sizeof(U32);
|
||||
}
|
||||
|
||||
// I don't think we ever use this flag from the server. DK 2010/12/09
|
||||
|
|
@ -402,6 +407,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
{
|
||||
//llinfos << "TEST: flags & FLAGS_ZLIB_COMPRESSED" << llendl;
|
||||
compressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
|
||||
msg_size += compressed_length;
|
||||
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compbuffer, 0, i);
|
||||
uncompressed_length = 2048;
|
||||
uncompress(compressed_dpbuffer, (unsigned long *)&uncompressed_length,
|
||||
|
|
@ -411,6 +417,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
else
|
||||
{
|
||||
uncompressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
|
||||
msg_size += uncompressed_length;
|
||||
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compressed_dpbuffer, 0, i);
|
||||
compressed_dp.assignBuffer(compressed_dpbuffer, uncompressed_length);
|
||||
}
|
||||
|
|
@ -439,6 +446,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
else if (update_type != OUT_FULL) // !compressed, !OUT_FULL ==> OUT_FULL_CACHED only?
|
||||
{
|
||||
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
|
||||
msg_size += sizeof(U32);
|
||||
|
||||
getUUIDFromLocal(fullid,
|
||||
local_id,
|
||||
gMessageSystem->getSenderIP(),
|
||||
|
|
@ -453,6 +462,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
{
|
||||
mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i);
|
||||
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
|
||||
msg_size += sizeof(LLUUID);
|
||||
msg_size += sizeof(U32);
|
||||
// llinfos << "Full Update, obj " << local_id << ", global ID" << fullid << "from " << mesgsys->getSender() << llendl;
|
||||
}
|
||||
objectp = findObject(fullid);
|
||||
|
|
@ -499,7 +510,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
{
|
||||
// llinfos << "terse update for an unknown object (compressed):" << fullid << llendl;
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
|
||||
recorder.recordObjectUpdateFailure(local_id, update_type, msg_size);
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
|
@ -513,12 +524,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
{
|
||||
//llinfos << "terse update for an unknown object:" << fullid << llendl;
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
|
||||
recorder.recordObjectUpdateFailure(local_id, update_type, msg_size);
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
||||
mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_PCode, pcode, i);
|
||||
msg_size += sizeof(U8);
|
||||
|
||||
}
|
||||
#ifdef IGNORE_DEAD
|
||||
if (mDeadObjects.find(fullid) != mDeadObjects.end())
|
||||
|
|
@ -526,7 +539,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
mNumDeadObjectUpdates++;
|
||||
//llinfos << "update for a dead object:" << fullid << llendl;
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
|
||||
recorder.recordObjectUpdateFailure(local_id, update_type, msg_size);
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
|
@ -537,7 +550,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
{
|
||||
llinfos << "createObject failure for object: " << fullid << llendl;
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
|
||||
recorder.recordObjectUpdateFailure(local_id, update_type, msg_size);
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
|
@ -566,7 +579,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
bCached = true;
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
|
||||
LLViewerStatsRecorder::instance()->recordCacheFullUpdate(local_id, update_type, result, objectp);
|
||||
recorder.recordCacheFullUpdate(local_id, update_type, result, objectp, msg_size);
|
||||
#else
|
||||
objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
|
||||
#endif
|
||||
|
|
@ -586,14 +599,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated);
|
||||
}
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp);
|
||||
recorder.recordObjectUpdateEvent(local_id, update_type, objectp, msg_size);
|
||||
#endif
|
||||
objectp->setLastUpdateType(update_type);
|
||||
objectp->setLastUpdateCached(bCached);
|
||||
}
|
||||
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
|
||||
recorder.endObjectUpdateEvents();
|
||||
#endif
|
||||
|
||||
LLVOAvatar::cullAvatarsByPixelArea();
|
||||
|
|
|
|||
|
|
@ -1318,9 +1318,9 @@ void LLViewerRegion::requestCacheMisses()
|
|||
mCacheDirty = TRUE ;
|
||||
// llinfos << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << llendl;
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(this);
|
||||
LLViewerStatsRecorder::instance()->recordRequestCacheMissesEvent(full_count + crc_count);
|
||||
LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
|
||||
LLViewerStatsRecorder::instance().beginObjectUpdateEvents(1.f);
|
||||
LLViewerStatsRecorder::instance().recordRequestCacheMissesEvent(full_count + crc_count);
|
||||
LLViewerStatsRecorder::instance().endObjectUpdateEvents();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,9 +45,10 @@ LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL;
|
|||
LLViewerStatsRecorder::LLViewerStatsRecorder() :
|
||||
mObjectCacheFile(NULL),
|
||||
mTimer(),
|
||||
mRegionp(NULL),
|
||||
mStartTime(0.f),
|
||||
mProcessingTime(0.f)
|
||||
mStartTime(0.0),
|
||||
mProcessingStartTime(0.0),
|
||||
mProcessingTotalTime(0.0),
|
||||
mLastSnapshotTime(0.0)
|
||||
{
|
||||
if (NULL != sInstance)
|
||||
{
|
||||
|
|
@ -61,112 +62,114 @@ LLViewerStatsRecorder::~LLViewerStatsRecorder()
|
|||
{
|
||||
if (mObjectCacheFile != NULL)
|
||||
{
|
||||
// last chance snapshot
|
||||
takeSnapshot();
|
||||
LLFile::close(mObjectCacheFile);
|
||||
mObjectCacheFile = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerStatsRecorder::initClass()
|
||||
{
|
||||
sInstance = new LLViewerStatsRecorder();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerStatsRecorder::cleanupClass()
|
||||
{
|
||||
delete sInstance;
|
||||
sInstance = NULL;
|
||||
}
|
||||
|
||||
|
||||
void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp)
|
||||
void LLViewerStatsRecorder::beginObjectUpdateEvents(F32 interval)
|
||||
{
|
||||
mSnapshotInterval = interval;
|
||||
if (mObjectCacheFile == NULL)
|
||||
{
|
||||
mStartTime = LLTimer::getTotalTime();
|
||||
mStartTime = LLTimer::getTotalSeconds();
|
||||
mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb");
|
||||
if (mObjectCacheFile)
|
||||
{ // Write column headers
|
||||
std::ostringstream data_msg;
|
||||
data_msg << "EventTime, "
|
||||
<< "ProcessingTime, "
|
||||
<< "CacheHits, "
|
||||
<< "CacheFullMisses, "
|
||||
<< "CacheCrcMisses, "
|
||||
<< "FullUpdates, "
|
||||
<< "TerseUpdates, "
|
||||
<< "CacheMissRequests, "
|
||||
<< "CacheMissResponses, "
|
||||
<< "CacheUpdateDupes, "
|
||||
<< "CacheUpdateChanges, "
|
||||
<< "CacheUpdateAdds, "
|
||||
<< "CacheUpdateReplacements, "
|
||||
<< "UpdateFailures"
|
||||
data_msg << "EventTime(ms), "
|
||||
<< "Processing Time(ms), "
|
||||
<< "Cache Hits, "
|
||||
<< "Cache Full Misses, "
|
||||
<< "Cache Crc Misses, "
|
||||
<< "Full Updates, "
|
||||
<< "Terse Updates, "
|
||||
<< "Cache Miss Requests, "
|
||||
<< "Cache Miss Responses, "
|
||||
<< "Cache Update Dupes, "
|
||||
<< "Cache Update Changes, "
|
||||
<< "Cache Update Adds, "
|
||||
<< "Cache Update Replacements, "
|
||||
<< "Update Failures, "
|
||||
<< "Cache Hits bps, "
|
||||
<< "Cache Full Misses bps, "
|
||||
<< "Cache Crc Misses bps, "
|
||||
<< "Full Updates bps, "
|
||||
<< "Terse Updates bps, "
|
||||
<< "Cache Miss Responses bps, "
|
||||
<< "\n";
|
||||
|
||||
fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerStatsRecorder::beginObjectUpdateEvents(LLViewerRegion *regionp)
|
||||
{
|
||||
initStatsRecorder(regionp);
|
||||
mRegionp = regionp;
|
||||
mProcessingTime = LLTimer::getTotalTime();
|
||||
clearStats();
|
||||
mProcessingStartTime = LLTimer::getTotalSeconds();
|
||||
}
|
||||
|
||||
void LLViewerStatsRecorder::clearStats()
|
||||
{
|
||||
mObjectCacheHitCount = 0;
|
||||
mObjectCacheHitSize = 0;
|
||||
mObjectCacheMissFullCount = 0;
|
||||
mObjectCacheMissFullSize = 0;
|
||||
mObjectCacheMissCrcCount = 0;
|
||||
mObjectCacheMissCrcSize = 0;
|
||||
mObjectFullUpdates = 0;
|
||||
mObjectFullUpdatesSize = 0;
|
||||
mObjectTerseUpdates = 0;
|
||||
mObjectTerseUpdatesSize = 0;
|
||||
mObjectCacheMissRequests = 0;
|
||||
mObjectCacheMissResponses = 0;
|
||||
mObjectCacheMissResponsesSize = 0;
|
||||
mObjectCacheUpdateDupes = 0;
|
||||
mObjectCacheUpdateChanges = 0;
|
||||
mObjectCacheUpdateAdds = 0;
|
||||
mObjectCacheUpdateReplacements = 0;
|
||||
mObjectUpdateFailures = 0;
|
||||
mObjectUpdateFailuresSize = 0;
|
||||
}
|
||||
|
||||
|
||||
void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type)
|
||||
void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
|
||||
{
|
||||
mObjectUpdateFailures++;
|
||||
mObjectUpdateFailuresSize += msg_size;
|
||||
}
|
||||
|
||||
void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type)
|
||||
void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size)
|
||||
{
|
||||
if (LLViewerRegion::CACHE_MISS_TYPE_FULL == cache_miss_type)
|
||||
{
|
||||
mObjectCacheMissFullCount++;
|
||||
mObjectCacheMissFullSize += msg_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
mObjectCacheMissCrcCount++;
|
||||
mObjectCacheMissCrcSize += msg_size;
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp)
|
||||
void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size)
|
||||
{
|
||||
switch (update_type)
|
||||
{
|
||||
case OUT_FULL:
|
||||
mObjectFullUpdates++;
|
||||
mObjectFullUpdatesSize += msg_size;
|
||||
break;
|
||||
case OUT_TERSE_IMPROVED:
|
||||
mObjectTerseUpdates++;
|
||||
mObjectTerseUpdatesSize += msg_size;
|
||||
break;
|
||||
case OUT_FULL_COMPRESSED:
|
||||
mObjectCacheMissResponses++;
|
||||
mObjectCacheMissResponsesSize += msg_size;
|
||||
break;
|
||||
case OUT_FULL_CACHED:
|
||||
mObjectCacheHitCount++;
|
||||
mObjectCacheHitSize += msg_size;
|
||||
break;
|
||||
default:
|
||||
llwarns << "Unknown update_type" << llendl;
|
||||
|
|
@ -174,7 +177,7 @@ void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectU
|
|||
};
|
||||
}
|
||||
|
||||
void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp)
|
||||
void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size)
|
||||
{
|
||||
switch (update_result)
|
||||
{
|
||||
|
|
@ -203,53 +206,72 @@ void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count)
|
|||
|
||||
void LLViewerStatsRecorder::endObjectUpdateEvents()
|
||||
{
|
||||
llinfos << "ILX: "
|
||||
<< mObjectCacheHitCount << " hits, "
|
||||
<< mObjectCacheMissFullCount << " full misses, "
|
||||
<< mObjectCacheMissCrcCount << " crc misses, "
|
||||
<< mObjectFullUpdates << " full updates, "
|
||||
<< mObjectTerseUpdates << " terse updates, "
|
||||
<< mObjectCacheMissRequests << " cache miss requests, "
|
||||
<< mObjectCacheMissResponses << " cache miss responses, "
|
||||
<< mObjectCacheUpdateDupes << " cache update dupes, "
|
||||
<< mObjectCacheUpdateChanges << " cache update changes, "
|
||||
<< mObjectCacheUpdateAdds << " cache update adds, "
|
||||
<< mObjectCacheUpdateReplacements << " cache update replacements, "
|
||||
<< mObjectUpdateFailures << " update failures"
|
||||
<< llendl;
|
||||
mProcessingTotalTime += LLTimer::getTotalSeconds() - mProcessingStartTime;
|
||||
takeSnapshot();
|
||||
}
|
||||
|
||||
S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
|
||||
if (mObjectCacheFile != NULL &&
|
||||
total_objects > 0)
|
||||
void LLViewerStatsRecorder::takeSnapshot()
|
||||
{
|
||||
F64 delta_time = LLTimer::getTotalSeconds() - mLastSnapshotTime;
|
||||
if ( delta_time > mSnapshotInterval)
|
||||
{
|
||||
std::ostringstream data_msg;
|
||||
F32 processing32 = (F32) ((LLTimer::getTotalTime() - mProcessingTime) / 1000.0);
|
||||
mLastSnapshotTime = LLTimer::getTotalSeconds();
|
||||
llinfos << "ILX: "
|
||||
<< mObjectCacheHitCount << " hits, "
|
||||
<< mObjectCacheMissFullCount << " full misses, "
|
||||
<< mObjectCacheMissCrcCount << " crc misses, "
|
||||
<< mObjectFullUpdates << " full updates, "
|
||||
<< mObjectTerseUpdates << " terse updates, "
|
||||
<< mObjectCacheMissRequests << " cache miss requests, "
|
||||
<< mObjectCacheMissResponses << " cache miss responses, "
|
||||
<< mObjectCacheUpdateDupes << " cache update dupes, "
|
||||
<< mObjectCacheUpdateChanges << " cache update changes, "
|
||||
<< mObjectCacheUpdateAdds << " cache update adds, "
|
||||
<< mObjectCacheUpdateReplacements << " cache update replacements, "
|
||||
<< mObjectUpdateFailures << " update failures"
|
||||
<< llendl;
|
||||
|
||||
data_msg << getTimeSinceStart()
|
||||
<< ", " << processing32
|
||||
<< ", " << mObjectCacheHitCount
|
||||
<< ", " << mObjectCacheMissFullCount
|
||||
<< ", " << mObjectCacheMissCrcCount
|
||||
<< ", " << mObjectFullUpdates
|
||||
<< ", " << mObjectTerseUpdates
|
||||
<< ", " << mObjectCacheMissRequests
|
||||
<< ", " << mObjectCacheMissResponses
|
||||
<< ", " << mObjectCacheUpdateDupes
|
||||
<< ", " << mObjectCacheUpdateChanges
|
||||
<< ", " << mObjectCacheUpdateAdds
|
||||
<< ", " << mObjectCacheUpdateReplacements
|
||||
<< ", " << mObjectUpdateFailures
|
||||
<< "\n";
|
||||
S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
|
||||
if (mObjectCacheFile != NULL &&
|
||||
total_objects > 0)
|
||||
{
|
||||
std::ostringstream data_msg;
|
||||
|
||||
fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
|
||||
F32 processing32 = (F32) mProcessingTotalTime;
|
||||
mProcessingTotalTime = 0.0;
|
||||
|
||||
data_msg << getTimeSinceStart()
|
||||
<< ", " << processing32
|
||||
<< ", " << mObjectCacheHitCount
|
||||
<< ", " << mObjectCacheMissFullCount
|
||||
<< ", " << mObjectCacheMissCrcCount
|
||||
<< ", " << mObjectFullUpdates
|
||||
<< ", " << mObjectTerseUpdates
|
||||
<< ", " << mObjectCacheMissRequests
|
||||
<< ", " << mObjectCacheMissResponses
|
||||
<< ", " << mObjectCacheUpdateDupes
|
||||
<< ", " << mObjectCacheUpdateChanges
|
||||
<< ", " << mObjectCacheUpdateAdds
|
||||
<< ", " << mObjectCacheUpdateReplacements
|
||||
<< ", " << mObjectUpdateFailures
|
||||
<< ", " << (mObjectCacheHitSize * 8 / delta_time)
|
||||
<< ", " << (mObjectCacheMissFullSize * 8 / delta_time)
|
||||
<< ", " << (mObjectCacheMissCrcSize * 8 / delta_time)
|
||||
<< ", " << (mObjectFullUpdatesSize * 8 / delta_time)
|
||||
<< ", " << (mObjectTerseUpdatesSize * 8 / delta_time)
|
||||
<< ", " << (mObjectCacheMissResponsesSize * 8 / delta_time)
|
||||
<< "\n";
|
||||
|
||||
fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
|
||||
}
|
||||
|
||||
clearStats();
|
||||
}
|
||||
|
||||
clearStats();
|
||||
}
|
||||
|
||||
F32 LLViewerStatsRecorder::getTimeSinceStart()
|
||||
{
|
||||
return (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0);
|
||||
return (F32) (LLTimer::getTotalSeconds() - mStartTime);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
// for analysis.
|
||||
|
||||
// This is normally 0. Set to 1 to enable viewer stats recording
|
||||
#define LL_RECORD_VIEWER_STATS 0
|
||||
#define LL_RECORD_VIEWER_STATS 1
|
||||
|
||||
|
||||
#if LL_RECORD_VIEWER_STATS
|
||||
|
|
@ -41,52 +41,59 @@
|
|||
#include "llviewerregion.h"
|
||||
|
||||
class LLMutex;
|
||||
class LLViewerRegion;
|
||||
class LLViewerObject;
|
||||
|
||||
class LLViewerStatsRecorder
|
||||
class LLViewerStatsRecorder : public LLSingleton<LLViewerStatsRecorder>
|
||||
{
|
||||
public:
|
||||
LOG_CLASS(LLViewerStatsRecorder);
|
||||
LLViewerStatsRecorder();
|
||||
~LLViewerStatsRecorder();
|
||||
|
||||
static void initClass();
|
||||
static void cleanupClass();
|
||||
static LLViewerStatsRecorder* instance() {return sInstance; }
|
||||
void beginObjectUpdateEvents(F32 interval);
|
||||
|
||||
void initStatsRecorder(LLViewerRegion *regionp);
|
||||
|
||||
void beginObjectUpdateEvents(LLViewerRegion *regionp);
|
||||
void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type);
|
||||
void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type);
|
||||
void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp);
|
||||
void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp);
|
||||
void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size);
|
||||
void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size);
|
||||
void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size);
|
||||
void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size);
|
||||
void recordRequestCacheMissesEvent(S32 count);
|
||||
|
||||
void endObjectUpdateEvents();
|
||||
|
||||
F32 getTimeSinceStart();
|
||||
|
||||
private:
|
||||
void takeSnapshot();
|
||||
|
||||
static LLViewerStatsRecorder* sInstance;
|
||||
|
||||
LLFILE * mObjectCacheFile; // File to write data into
|
||||
LLFrameTimer mTimer;
|
||||
LLViewerRegion* mRegionp;
|
||||
F64 mStartTime;
|
||||
F64 mProcessingTime;
|
||||
F64 mProcessingStartTime;
|
||||
F64 mProcessingTotalTime;
|
||||
F64 mSnapshotInterval;
|
||||
F64 mLastSnapshotTime;
|
||||
|
||||
S32 mObjectCacheHitCount;
|
||||
S32 mObjectCacheHitSize;
|
||||
S32 mObjectCacheMissFullCount;
|
||||
S32 mObjectCacheMissFullSize;
|
||||
S32 mObjectCacheMissCrcCount;
|
||||
S32 mObjectCacheMissCrcSize;
|
||||
S32 mObjectFullUpdates;
|
||||
S32 mObjectFullUpdatesSize;
|
||||
S32 mObjectTerseUpdates;
|
||||
S32 mObjectTerseUpdatesSize;
|
||||
S32 mObjectCacheMissRequests;
|
||||
S32 mObjectCacheMissResponses;
|
||||
S32 mObjectCacheMissResponsesSize;
|
||||
S32 mObjectCacheUpdateDupes;
|
||||
S32 mObjectCacheUpdateChanges;
|
||||
S32 mObjectCacheUpdateAdds;
|
||||
S32 mObjectCacheUpdateReplacements;
|
||||
S32 mObjectUpdateFailures;
|
||||
S32 mObjectUpdateFailuresSize;
|
||||
|
||||
|
||||
void clearStats();
|
||||
|
|
|
|||
Loading…
Reference in New Issue