mirror of
https://github.com/overte-org/overte.git
synced 2025-08-07 21:30:33 +02:00
clean up stats, add slave stats
This commit is contained in:
parent
4f655bba3f
commit
cddb72bbd7
6 changed files with 63 additions and 24 deletions
|
@ -102,6 +102,7 @@ void AvatarMixer::start() {
|
||||||
//_slavePool.setNumThreads(1); // grins
|
//_slavePool.setNumThreads(1); // grins
|
||||||
|
|
||||||
while (!_isFinished) {
|
while (!_isFinished) {
|
||||||
|
_numTightLoopFrames++;
|
||||||
_loopRate.increment();
|
_loopRate.increment();
|
||||||
|
|
||||||
// FIXME - we really should sleep for the remainder of what we haven't spent time processing
|
// FIXME - we really should sleep for the remainder of what we haven't spent time processing
|
||||||
|
@ -754,24 +755,19 @@ void AvatarMixer::sendStatsPacket() {
|
||||||
statsObject["timing_average_b_ignoreCalculation"] = (float)_ignoreCalculationElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_b_ignoreCalculation"] = (float)_ignoreCalculationElapsedTime / (float)_numStatFrames;
|
||||||
statsObject["timing_average_c_avatarDataPacking"] = (float)_avatarDataPackingElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_c_avatarDataPacking"] = (float)_avatarDataPackingElapsedTime / (float)_numStatFrames;
|
||||||
statsObject["timing_average_d_packetSending"] = (float)_packetSendingElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_d_packetSending"] = (float)_packetSendingElapsedTime / (float)_numStatFrames;
|
||||||
|
|
||||||
statsObject["timing_average_e_total_broadcastAvatarData"] = (float)_broadcastAvatarDataElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_e_total_broadcastAvatarData"] = (float)_broadcastAvatarDataElapsedTime / (float)_numStatFrames;
|
||||||
|
|
||||||
|
// this things all occur on the frequency of the tight loop
|
||||||
statsObject["timing_average_y_processEvents"] = (float)_processEventsElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_y_processEvents"] = (float)_processEventsElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_y_queueIncomingPacket"] = (float)_queueIncomingPacketElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_y_queueIncomingPacket"] = (float)_queueIncomingPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
|
statsObject["timing_average_z_handleAvatarDataPacket"] = (float)_handleAvatarDataPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
|
statsObject["timing_average_z_handleAvatarIdentityPacket"] = (float)_handleAvatarIdentityPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_z_handleAvatarDataPacket"] = (float)_handleAvatarDataPacketElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_z_handleKillAvatarPacket"] = (float)_handleKillAvatarPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_z_handleAvatarIdentityPacket"] = (float)_handleAvatarIdentityPacketElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_z_handleNodeIgnoreRequestPacket"] = (float)_handleNodeIgnoreRequestPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_z_handleKillAvatarPacket"] = (float)_handleKillAvatarPacketElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_z_handleRadiusIgnoreRequestPacket"] = (float)_handleRadiusIgnoreRequestPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_z_handleNodeIgnoreRequestPacket"] = (float)_handleNodeIgnoreRequestPacketElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_z_handleRequestsDomainListDataPacket"] = (float)_handleRequestsDomainListDataPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_z_handleRadiusIgnoreRequestPacket"] = (float)_handleRadiusIgnoreRequestPacketElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_z_handleViewFrustumPacket"] = (float)_handleViewFrustumPacketElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_z_handleRequestsDomainListDataPacket"] = (float)_handleRequestsDomainListDataPacketElapsedTime / (float)_numStatFrames;
|
statsObject["timing_average_z_processQueuedAvatarDataPackets"] = (float)_processQueuedAvatarDataPacketsElapsedTime / (float)_numTightLoopFrames;
|
||||||
statsObject["timing_average_z_handleViewFrustumPacket"] = (float)_handleViewFrustumPacketElapsedTime / (float)_numStatFrames;
|
|
||||||
|
|
||||||
statsObject["timing_average_z_processQueuedAvatarDataPackets"] = (float)_processQueuedAvatarDataPacketsElapsedTime / (float)_numStatFrames;
|
|
||||||
|
|
||||||
|
|
||||||
statsObject["timing_sendStats"] = (float)_sendStatsElapsedTime;
|
statsObject["timing_sendStats"] = (float)_sendStatsElapsedTime;
|
||||||
|
|
||||||
|
@ -786,8 +782,24 @@ void AvatarMixer::sendStatsPacket() {
|
||||||
_queueIncomingPacketElapsedTime = 0;
|
_queueIncomingPacketElapsedTime = 0;
|
||||||
_processQueuedAvatarDataPacketsElapsedTime = 0;
|
_processQueuedAvatarDataPacketsElapsedTime = 0;
|
||||||
|
|
||||||
QJsonObject avatarsObject;
|
QJsonObject slavesObject;
|
||||||
|
// gather stats
|
||||||
|
int slaveNumber = 1;
|
||||||
|
_slavePool.each([&](AvatarMixerSlave& slave) {
|
||||||
|
QJsonObject slaveObject;
|
||||||
|
int nodesProcessed, packetsProcessed;
|
||||||
|
quint64 processIncomingPacketsElapsedTime;
|
||||||
|
slave.harvestStats(nodesProcessed, packetsProcessed, processIncomingPacketsElapsedTime);
|
||||||
|
slaveObject["nodesProcessed"] = nodesProcessed;
|
||||||
|
slaveObject["packetsProcessed"] = packetsProcessed;
|
||||||
|
slaveObject["timing_average_processIncomingPackets"] = (float)processIncomingPacketsElapsedTime / (float)_numTightLoopFrames;
|
||||||
|
|
||||||
|
slavesObject[QString::number(slaveNumber)] = slaveObject;
|
||||||
|
slaveNumber++;
|
||||||
|
});
|
||||||
|
statsObject["timing_slaves"] = slavesObject;
|
||||||
|
|
||||||
|
QJsonObject avatarsObject;
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
// add stats for each listerner
|
// add stats for each listerner
|
||||||
nodeList->eachNode([&](const SharedNodePointer& node) {
|
nodeList->eachNode([&](const SharedNodePointer& node) {
|
||||||
|
@ -818,11 +830,13 @@ void AvatarMixer::sendStatsPacket() {
|
||||||
});
|
});
|
||||||
|
|
||||||
statsObject["z_avatars"] = avatarsObject;
|
statsObject["z_avatars"] = avatarsObject;
|
||||||
|
|
||||||
ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject);
|
ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject);
|
||||||
|
|
||||||
_sumListeners = 0;
|
_sumListeners = 0;
|
||||||
_sumIdentityPackets = 0;
|
_sumIdentityPackets = 0;
|
||||||
_numStatFrames = 0;
|
_numStatFrames = 0;
|
||||||
|
_numTightLoopFrames = 0;
|
||||||
|
|
||||||
_broadcastAvatarDataElapsedTime = 0;
|
_broadcastAvatarDataElapsedTime = 0;
|
||||||
_displayNameManagementElapsedTime = 0;
|
_displayNameManagementElapsedTime = 0;
|
||||||
|
|
|
@ -69,6 +69,7 @@ private:
|
||||||
|
|
||||||
int _sumListeners { 0 };
|
int _sumListeners { 0 };
|
||||||
int _numStatFrames { 0 };
|
int _numStatFrames { 0 };
|
||||||
|
std::atomic<int> _numTightLoopFrames;
|
||||||
int _sumIdentityPackets { 0 };
|
int _sumIdentityPackets { 0 };
|
||||||
|
|
||||||
float _maxKbpsPerNode = 0.0f;
|
float _maxKbpsPerNode = 0.0f;
|
||||||
|
|
|
@ -34,7 +34,8 @@ void AvatarMixerClientData::queuePacket(QSharedPointer<ReceivedMessage> message,
|
||||||
// packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket");
|
// packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket");
|
||||||
// packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket");
|
// packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket");
|
||||||
|
|
||||||
void AvatarMixerClientData::processPackets() {
|
int AvatarMixerClientData::processPackets() {
|
||||||
|
int packetsProcessed = 0;
|
||||||
SharedNodePointer node = _packetQueue.node;
|
SharedNodePointer node = _packetQueue.node;
|
||||||
assert(_packetQueue.empty() || node);
|
assert(_packetQueue.empty() || node);
|
||||||
_packetQueue.node.clear();
|
_packetQueue.node.clear();
|
||||||
|
@ -42,6 +43,8 @@ void AvatarMixerClientData::processPackets() {
|
||||||
while (!_packetQueue.empty()) {
|
while (!_packetQueue.empty()) {
|
||||||
auto& packet = _packetQueue.back();
|
auto& packet = _packetQueue.back();
|
||||||
|
|
||||||
|
packetsProcessed++;
|
||||||
|
|
||||||
switch (packet->getType()) {
|
switch (packet->getType()) {
|
||||||
case PacketType::AvatarData:
|
case PacketType::AvatarData:
|
||||||
parseData(*packet);
|
parseData(*packet);
|
||||||
|
@ -52,6 +55,8 @@ void AvatarMixerClientData::processPackets() {
|
||||||
_packetQueue.pop();
|
_packetQueue.pop();
|
||||||
}
|
}
|
||||||
assert(_packetQueue.empty());
|
assert(_packetQueue.empty());
|
||||||
|
|
||||||
|
return packetsProcessed;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AvatarMixerClientData::parseData(ReceivedMessage& message) {
|
int AvatarMixerClientData::parseData(ReceivedMessage& message) {
|
||||||
|
|
|
@ -120,7 +120,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
|
void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
|
||||||
void processPackets();
|
int processPackets(); // returns number of packets processed
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct PacketQueue : public std::queue<QSharedPointer<ReceivedMessage>> {
|
struct PacketQueue : public std::queue<QSharedPointer<ReceivedMessage>> {
|
||||||
|
|
|
@ -35,10 +35,23 @@ void AvatarMixerSlave::configure(ConstIter begin, ConstIter end) {
|
||||||
_end = end;
|
_end = end;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) {
|
void AvatarMixerSlave::harvestStats(int& nodesProcessed, int& packetsProcessed, quint64& processIncomingPacketsElapsedTime) {
|
||||||
auto nodeData = dynamic_cast<AvatarMixerClientData*>(node->getLinkedData());
|
nodesProcessed = _nodesProcessed;
|
||||||
if (nodeData) {
|
packetsProcessed = _packetsProcessed;
|
||||||
nodeData->processPackets();
|
processIncomingPacketsElapsedTime = _processIncomingPacketsElapsedTime;
|
||||||
}
|
_packetsProcessed = _nodesProcessed = 0;
|
||||||
|
_processIncomingPacketsElapsedTime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) {
|
||||||
|
auto start = usecTimestampNow();
|
||||||
|
auto nodeData = dynamic_cast<AvatarMixerClientData*>(node->getLinkedData());
|
||||||
|
if (nodeData) {
|
||||||
|
_nodesProcessed++;
|
||||||
|
_packetsProcessed += nodeData->processPackets();
|
||||||
|
}
|
||||||
|
auto end = usecTimestampNow();
|
||||||
|
_processIncomingPacketsElapsedTime += (end - start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,16 @@ public:
|
||||||
|
|
||||||
void processIncomingPackets(const SharedNodePointer& node);
|
void processIncomingPackets(const SharedNodePointer& node);
|
||||||
|
|
||||||
|
void harvestStats(int& nodesProcessed, int& packetsProcessed, quint64& processIncomingPacketsElapsedTime);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// frame state
|
// frame state
|
||||||
ConstIter _begin;
|
ConstIter _begin;
|
||||||
ConstIter _end;
|
ConstIter _end;
|
||||||
|
|
||||||
|
int _nodesProcessed { 0 };
|
||||||
|
int _packetsProcessed { 0 };
|
||||||
|
quint64 _processIncomingPacketsElapsedTime { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_AvatarMixerSlave_h
|
#endif // hifi_AvatarMixerSlave_h
|
||||||
|
|
Loading…
Reference in a new issue