mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 06:58:56 +02:00
added more stats to octree server stats page
This commit is contained in:
parent
59b272d8db
commit
e9684c0ee5
3 changed files with 97 additions and 24 deletions
|
@ -117,7 +117,7 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, OctreeQuer
|
||||||
quint64 lockWaitEnd = usecTimestampNow();
|
quint64 lockWaitEnd = usecTimestampNow();
|
||||||
float lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart);
|
float lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart);
|
||||||
OctreeServer::trackNodeWaitTime(lockWaitElapsedUsec);
|
OctreeServer::trackNodeWaitTime(lockWaitElapsedUsec);
|
||||||
|
|
||||||
const HifiSockAddr* nodeAddress = node->getActiveSocket();
|
const HifiSockAddr* nodeAddress = node->getActiveSocket();
|
||||||
if (!nodeAddress) {
|
if (!nodeAddress) {
|
||||||
return packetsSent; // without sending...
|
return packetsSent; // without sending...
|
||||||
|
@ -452,15 +452,13 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue
|
||||||
_myServer->getOctree()->lockForRead();
|
_myServer->getOctree()->lockForRead();
|
||||||
quint64 lockWaitEnd = usecTimestampNow();
|
quint64 lockWaitEnd = usecTimestampNow();
|
||||||
lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart);
|
lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart);
|
||||||
OctreeServer::trackTreeWaitTime(lockWaitElapsedUsec);
|
|
||||||
|
|
||||||
nodeData->stats.encodeStarted();
|
nodeData->stats.encodeStarted();
|
||||||
|
|
||||||
quint64 encodeStart = usecTimestampNow();
|
quint64 encodeStart = usecTimestampNow();
|
||||||
bytesWritten = _myServer->getOctree()->encodeTreeBitstream(subTree, &_packetData, nodeData->nodeBag, params);
|
bytesWritten = _myServer->getOctree()->encodeTreeBitstream(subTree, &_packetData, nodeData->nodeBag, params);
|
||||||
quint64 encodeEnd = usecTimestampNow();
|
quint64 encodeEnd = usecTimestampNow();
|
||||||
encodeElapsedUsec = (float)(encodeEnd - encodeStart);
|
encodeElapsedUsec = (float)(encodeEnd - encodeStart);
|
||||||
OctreeServer::trackEncodeTime(encodeElapsedUsec);
|
|
||||||
|
|
||||||
// If after calling encodeTreeBitstream() there are no nodes left to send, then we know we've
|
// If after calling encodeTreeBitstream() there are no nodes left to send, then we know we've
|
||||||
// sent the entire scene. We want to know this below so we'll actually write this content into
|
// sent the entire scene. We want to know this below so we'll actually write this content into
|
||||||
|
|
|
@ -20,13 +20,54 @@
|
||||||
|
|
||||||
OctreeServer* OctreeServer::_instance = NULL;
|
OctreeServer* OctreeServer::_instance = NULL;
|
||||||
int OctreeServer::_clientCount = 0;
|
int OctreeServer::_clientCount = 0;
|
||||||
SimpleMovingAverage OctreeServer::_averageLoopTime(100000);
|
const int MOVING_AVERAGE_SAMPLE_COUNTS = 1000000;
|
||||||
SimpleMovingAverage OctreeServer::_averageEncodeTime(100000);
|
SimpleMovingAverage OctreeServer::_averageLoopTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
SimpleMovingAverage OctreeServer::_averageInsideTime(100000);
|
SimpleMovingAverage OctreeServer::_averageEncodeTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
SimpleMovingAverage OctreeServer::_averageTreeWaitTime(100000);
|
SimpleMovingAverage OctreeServer::_averageInsideTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
SimpleMovingAverage OctreeServer::_averageNodeWaitTime(100000);
|
SimpleMovingAverage OctreeServer::_averageTreeWaitTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
SimpleMovingAverage OctreeServer::_averageCompressAndWriteTime(100000);
|
SimpleMovingAverage OctreeServer::_averageTreeShortWaitTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
SimpleMovingAverage OctreeServer::_averagePacketSendingTime(100000);
|
SimpleMovingAverage OctreeServer::_averageTreeLongWaitTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
|
SimpleMovingAverage OctreeServer::_averageTreeExtraLongWaitTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
|
SimpleMovingAverage OctreeServer::_averageNodeWaitTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
|
SimpleMovingAverage OctreeServer::_averageCompressAndWriteTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
|
SimpleMovingAverage OctreeServer::_averagePacketSendingTime(MOVING_AVERAGE_SAMPLE_COUNTS);
|
||||||
|
int OctreeServer::_extraLongTreeWait = 0;
|
||||||
|
int OctreeServer::_longTreeWait = 0;
|
||||||
|
int OctreeServer::_shortTreeWait = 0;
|
||||||
|
|
||||||
|
|
||||||
|
void OctreeServer::resetSendingStats() {
|
||||||
|
_averageLoopTime.reset();
|
||||||
|
_averageEncodeTime.reset();
|
||||||
|
_averageInsideTime.reset();
|
||||||
|
_averageTreeWaitTime.reset();
|
||||||
|
_averageTreeShortWaitTime.reset();
|
||||||
|
_averageTreeLongWaitTime.reset();
|
||||||
|
_averageTreeExtraLongWaitTime.reset();
|
||||||
|
_averageNodeWaitTime.reset();
|
||||||
|
_averageCompressAndWriteTime.reset();
|
||||||
|
_averagePacketSendingTime.reset();
|
||||||
|
_extraLongTreeWait = 0;
|
||||||
|
_longTreeWait = 0;
|
||||||
|
_shortTreeWait = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OctreeServer::trackTreeWaitTime(float time) {
|
||||||
|
_averageTreeWaitTime.updateAverage(time);
|
||||||
|
const float MAX_SHORT_TIME = 10.0f;
|
||||||
|
const float MAX_LONG_TIME = 100.0f;
|
||||||
|
if (time <= MAX_SHORT_TIME) {
|
||||||
|
_shortTreeWait++;
|
||||||
|
_averageTreeShortWaitTime.updateAverage(time);
|
||||||
|
} else if (time <= MAX_LONG_TIME) {
|
||||||
|
_longTreeWait++;
|
||||||
|
_averageTreeLongWaitTime.updateAverage(time);
|
||||||
|
} else {
|
||||||
|
_extraLongTreeWait++;
|
||||||
|
_averageTreeExtraLongWaitTime.updateAverage(time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void OctreeServer::attachQueryNodeToNode(Node* newNode) {
|
void OctreeServer::attachQueryNodeToNode(Node* newNode) {
|
||||||
if (!newNode->getLinkedData()) {
|
if (!newNode->getLinkedData()) {
|
||||||
|
@ -124,6 +165,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QString&
|
||||||
showStats = true;
|
showStats = true;
|
||||||
} else if (path == "/resetStats") {
|
} else if (path == "/resetStats") {
|
||||||
_octreeInboundPacketProcessor->resetStats();
|
_octreeInboundPacketProcessor->resetStats();
|
||||||
|
resetSendingStats();
|
||||||
showStats = true;
|
showStats = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -258,7 +300,9 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QString&
|
||||||
statsString += "\r\n";
|
statsString += "\r\n";
|
||||||
|
|
||||||
// display outbound packet stats
|
// display outbound packet stats
|
||||||
statsString += QString("<b>%1 Outbound Packet Statistics...</b>\r\n").arg(getMyServerName());
|
statsString += QString("<b>%1 Outbound Packet Statistics... "
|
||||||
|
"<a href='/resetStats'>[RESET]</a></b>\r\n").arg(getMyServerName());
|
||||||
|
|
||||||
quint64 totalOutboundPackets = OctreeSendThread::_totalPackets;
|
quint64 totalOutboundPackets = OctreeSendThread::_totalPackets;
|
||||||
quint64 totalOutboundBytes = OctreeSendThread::_totalBytes;
|
quint64 totalOutboundBytes = OctreeSendThread::_totalBytes;
|
||||||
quint64 totalWastedBytes = OctreeSendThread::_totalWastedBytes;
|
quint64 totalWastedBytes = OctreeSendThread::_totalWastedBytes;
|
||||||
|
@ -266,7 +310,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QString&
|
||||||
quint64 totalBytesOfBitMasks = OctreePacketData::getTotalBytesOfBitMasks();
|
quint64 totalBytesOfBitMasks = OctreePacketData::getTotalBytesOfBitMasks();
|
||||||
quint64 totalBytesOfColor = OctreePacketData::getTotalBytesOfColor();
|
quint64 totalBytesOfColor = OctreePacketData::getTotalBytesOfColor();
|
||||||
|
|
||||||
const int COLUMN_WIDTH = 10;
|
const int COLUMN_WIDTH = 19;
|
||||||
statsString += QString(" Configured Max PPS/Client: %1 pps/client\r\n")
|
statsString += QString(" Configured Max PPS/Client: %1 pps/client\r\n")
|
||||||
.arg(locale.toString((uint)getPacketsPerClientPerSecond()).rightJustified(COLUMN_WIDTH, ' '));
|
.arg(locale.toString((uint)getPacketsPerClientPerSecond()).rightJustified(COLUMN_WIDTH, ' '));
|
||||||
statsString += QString(" Configured Max PPS/Server: %1 pps/server\r\n\r\n")
|
statsString += QString(" Configured Max PPS/Server: %1 pps/server\r\n\r\n")
|
||||||
|
@ -275,45 +319,66 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QString&
|
||||||
.arg(locale.toString((uint)getCurrentClientCount()).rightJustified(COLUMN_WIDTH, ' '));
|
.arg(locale.toString((uint)getCurrentClientCount()).rightJustified(COLUMN_WIDTH, ' '));
|
||||||
|
|
||||||
float averageLoopTime = getAverageLoopTime();
|
float averageLoopTime = getAverageLoopTime();
|
||||||
statsString += QString().sprintf(" Average packetLoop() time: %5.2f msecs\r\n", averageLoopTime);
|
statsString += QString().sprintf(" Average packetLoop() time: %5.2f msecs\r\n", averageLoopTime);
|
||||||
qDebug() << "averageLoopTime=" << averageLoopTime;
|
qDebug() << "averageLoopTime=" << averageLoopTime;
|
||||||
|
|
||||||
float averageInsideTime = getAverageInsideTime();
|
float averageInsideTime = getAverageInsideTime();
|
||||||
statsString += QString().sprintf(" Average 'inside' time: %7.2f usecs\r\n", averageInsideTime);
|
statsString += QString().sprintf(" Average 'inside' time: %7.2f usecs\r\n", averageInsideTime);
|
||||||
qDebug() << "averageInsideTime=" << averageInsideTime;
|
qDebug() << "averageInsideTime=" << averageInsideTime;
|
||||||
|
|
||||||
|
int allWaitTimes = _extraLongTreeWait +_longTreeWait + _shortTreeWait;
|
||||||
|
|
||||||
float averageTreeWaitTime = getAverageTreeWaitTime();
|
float averageTreeWaitTime = getAverageTreeWaitTime();
|
||||||
statsString += QString().sprintf(" Average tree lock wait time: %7.2f usecs\r\n", averageTreeWaitTime);
|
statsString += QString().sprintf(" Average tree lock wait time: %7.2f usecs samples: %12d \r\n",
|
||||||
|
averageTreeWaitTime, allWaitTimes);
|
||||||
qDebug() << "averageTreeWaitTime=" << averageTreeWaitTime;
|
qDebug() << "averageTreeWaitTime=" << averageTreeWaitTime;
|
||||||
|
|
||||||
|
float shortVsTotal = (allWaitTimes > 0) ? ((float)_shortTreeWait / (float)allWaitTimes) : 0.0f;
|
||||||
|
statsString += QString().sprintf(" Avg tree lock short wait time: %7.2f usecs (%6.2f%%) samples: %12d \r\n",
|
||||||
|
_averageTreeShortWaitTime.getAverage(),
|
||||||
|
shortVsTotal * AS_PERCENT, _shortTreeWait);
|
||||||
|
qDebug() << "averageTreeShortWaitTime=" << _averageTreeShortWaitTime.getAverage();
|
||||||
|
|
||||||
|
float longVsTotal = (allWaitTimes > 0) ? ((float)_longTreeWait / (float)allWaitTimes) : 0.0f;
|
||||||
|
statsString += QString().sprintf(" Avg tree lock long wait time: %7.2f usecs (%6.2f%%) samples: %12d \r\n",
|
||||||
|
_averageTreeLongWaitTime.getAverage(),
|
||||||
|
longVsTotal * AS_PERCENT, _longTreeWait);
|
||||||
|
qDebug() << "averageTreeLongWaitTime=" << _averageTreeLongWaitTime.getAverage();
|
||||||
|
|
||||||
|
float extraLongVsTotal = (allWaitTimes > 0) ? ((float)_extraLongTreeWait / (float)allWaitTimes) : 0.0f;
|
||||||
|
statsString += QString().sprintf("Avg tree lock extra long wait time: %7.2f usecs (%6.2f%%) samples: %12d \r\n",
|
||||||
|
_averageTreeExtraLongWaitTime.getAverage(),
|
||||||
|
extraLongVsTotal * AS_PERCENT, _extraLongTreeWait);
|
||||||
|
qDebug() << "averageTreeExtraLongWaitTime=" << _averageTreeExtraLongWaitTime.getAverage();
|
||||||
|
|
||||||
float averageEncodeTime = getAverageEncodeTime();
|
float averageEncodeTime = getAverageEncodeTime();
|
||||||
statsString += QString().sprintf(" Average encode time: %7.2f usecs\r\n", averageEncodeTime);
|
statsString += QString().sprintf(" Average encode time: %7.2f usecs\r\n", averageEncodeTime);
|
||||||
qDebug() << "averageEncodeTime=" << averageEncodeTime;
|
qDebug() << "averageEncodeTime=" << averageEncodeTime;
|
||||||
|
|
||||||
float averageCompressAndWriteTime = getAverageCompressAndWriteTime();
|
float averageCompressAndWriteTime = getAverageCompressAndWriteTime();
|
||||||
statsString += QString().sprintf(" Average compress and write time: %7.2f usecs\r\n", averageCompressAndWriteTime);
|
statsString += QString().sprintf(" Average compress and write time: %7.2f usecs\r\n", averageCompressAndWriteTime);
|
||||||
qDebug() << "averageCompressAndWriteTime=" << averageCompressAndWriteTime;
|
qDebug() << "averageCompressAndWriteTime=" << averageCompressAndWriteTime;
|
||||||
|
|
||||||
float averagePacketSendingTime = getAveragePacketSendingTime();
|
float averagePacketSendingTime = getAveragePacketSendingTime();
|
||||||
statsString += QString().sprintf(" Average packet sending time: %7.2f usecs (includes node lock)\r\n",
|
statsString += QString().sprintf(" Average packet sending time: %7.2f usecs (includes node lock)\r\n",
|
||||||
averagePacketSendingTime);
|
averagePacketSendingTime);
|
||||||
|
|
||||||
qDebug() << "averagePacketSendingTime=" << averagePacketSendingTime;
|
qDebug() << "averagePacketSendingTime=" << averagePacketSendingTime;
|
||||||
|
|
||||||
float averageNodeWaitTime = getAverageNodeWaitTime();
|
float averageNodeWaitTime = getAverageNodeWaitTime();
|
||||||
statsString += QString().sprintf(" Average node lock wait time: %7.2f usecs\r\n", averageNodeWaitTime);
|
statsString += QString().sprintf(" Average node lock wait time: %7.2f usecs\r\n", averageNodeWaitTime);
|
||||||
qDebug() << "averageNodeWaitTime=" << averageNodeWaitTime;
|
qDebug() << "averageNodeWaitTime=" << averageNodeWaitTime;
|
||||||
|
|
||||||
statsString += QString().sprintf("---------------------------------------------------\r\n");
|
statsString += QString().sprintf("----------------------------------------------------\r\n");
|
||||||
|
|
||||||
float encodeToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averageEncodeTime / averageInsideTime) * AS_PERCENT;
|
float encodeToInsidePercent = averageInsideTime == 0.0f ? 0.0f : (averageEncodeTime / averageInsideTime) * AS_PERCENT;
|
||||||
statsString += QString().sprintf(" encode ratio: %5.2f%%\r\n",
|
statsString += QString().sprintf(" encode ratio: %5.2f%%\r\n",
|
||||||
encodeToInsidePercent);
|
encodeToInsidePercent);
|
||||||
qDebug() << "encodeToInsidePercent=" << encodeToInsidePercent;
|
qDebug() << "encodeToInsidePercent=" << encodeToInsidePercent;
|
||||||
|
|
||||||
float waitToInsidePercent = averageInsideTime == 0.0f ? 0.0f
|
float waitToInsidePercent = averageInsideTime == 0.0f ? 0.0f
|
||||||
: ((averageTreeWaitTime + averageNodeWaitTime) / averageInsideTime) * AS_PERCENT;
|
: ((averageTreeWaitTime + averageNodeWaitTime) / averageInsideTime) * AS_PERCENT;
|
||||||
statsString += QString().sprintf(" waiting ratio: %5.2f%%\r\n", waitToInsidePercent);
|
statsString += QString().sprintf(" waiting ratio: %5.2f%%\r\n", waitToInsidePercent);
|
||||||
qDebug() << "waitToInsidePercent=" << waitToInsidePercent;
|
qDebug() << "waitToInsidePercent=" << waitToInsidePercent;
|
||||||
|
|
||||||
|
|
||||||
|
@ -761,6 +826,7 @@ void OctreeServer::run() {
|
||||||
|
|
||||||
void OctreeServer::nodeAdded(SharedNodePointer node) {
|
void OctreeServer::nodeAdded(SharedNodePointer node) {
|
||||||
// we might choose to use this notifier to track clients in a pending state
|
// we might choose to use this notifier to track clients in a pending state
|
||||||
|
qDebug() << "OctreeServer::nodeAdded() node:" << *node;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctreeServer::nodeKilled(SharedNodePointer node) {
|
void OctreeServer::nodeKilled(SharedNodePointer node) {
|
||||||
|
|
|
@ -83,8 +83,9 @@ public:
|
||||||
static void trackInsideTime(float time) { _averageInsideTime.updateAverage(time); }
|
static void trackInsideTime(float time) { _averageInsideTime.updateAverage(time); }
|
||||||
static float getAverageInsideTime() { return _averageInsideTime.getAverage(); }
|
static float getAverageInsideTime() { return _averageInsideTime.getAverage(); }
|
||||||
|
|
||||||
static void trackTreeWaitTime(float time) { _averageTreeWaitTime.updateAverage(time); }
|
static void trackTreeWaitTime(float time);
|
||||||
static float getAverageTreeWaitTime() { return _averageTreeWaitTime.getAverage(); }
|
static float getAverageTreeWaitTime() { return _averageTreeWaitTime.getAverage(); }
|
||||||
|
|
||||||
static void trackNodeWaitTime(float time) { _averageNodeWaitTime.updateAverage(time); }
|
static void trackNodeWaitTime(float time) { _averageNodeWaitTime.updateAverage(time); }
|
||||||
static float getAverageNodeWaitTime() { return _averageNodeWaitTime.getAverage(); }
|
static float getAverageNodeWaitTime() { return _averageNodeWaitTime.getAverage(); }
|
||||||
|
|
||||||
|
@ -95,6 +96,7 @@ public:
|
||||||
static float getAveragePacketSendingTime() { return _averagePacketSendingTime.getAverage(); }
|
static float getAveragePacketSendingTime() { return _averagePacketSendingTime.getAverage(); }
|
||||||
|
|
||||||
bool handleHTTPRequest(HTTPConnection* connection, const QString& path);
|
bool handleHTTPRequest(HTTPConnection* connection, const QString& path);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
/// runs the voxel server assignment
|
/// runs the voxel server assignment
|
||||||
void run();
|
void run();
|
||||||
|
@ -105,6 +107,7 @@ public slots:
|
||||||
protected:
|
protected:
|
||||||
void parsePayload();
|
void parsePayload();
|
||||||
void initHTTPManager(int port);
|
void initHTTPManager(int port);
|
||||||
|
void resetSendingStats();
|
||||||
|
|
||||||
int _argc;
|
int _argc;
|
||||||
const char** _argv;
|
const char** _argv;
|
||||||
|
@ -135,9 +138,15 @@ protected:
|
||||||
static SimpleMovingAverage _averageEncodeTime;
|
static SimpleMovingAverage _averageEncodeTime;
|
||||||
static SimpleMovingAverage _averageInsideTime;
|
static SimpleMovingAverage _averageInsideTime;
|
||||||
static SimpleMovingAverage _averageTreeWaitTime;
|
static SimpleMovingAverage _averageTreeWaitTime;
|
||||||
|
static SimpleMovingAverage _averageTreeShortWaitTime;
|
||||||
|
static SimpleMovingAverage _averageTreeLongWaitTime;
|
||||||
|
static SimpleMovingAverage _averageTreeExtraLongWaitTime;
|
||||||
static SimpleMovingAverage _averageNodeWaitTime;
|
static SimpleMovingAverage _averageNodeWaitTime;
|
||||||
static SimpleMovingAverage _averageCompressAndWriteTime;
|
static SimpleMovingAverage _averageCompressAndWriteTime;
|
||||||
static SimpleMovingAverage _averagePacketSendingTime;
|
static SimpleMovingAverage _averagePacketSendingTime;
|
||||||
|
static int _extraLongTreeWait;
|
||||||
|
static int _longTreeWait;
|
||||||
|
static int _shortTreeWait;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __octree_server__OctreeServer__
|
#endif // __octree_server__OctreeServer__
|
||||||
|
|
Loading…
Reference in a new issue