Performance Features
Whixp includes several performance optimizations to ensure efficient operation, especially under high message volumes. These features include message batching, rate limiting, bounded queues, and comprehensive performance metrics.
Overview
Performance features in Whixp include:
- Message Batching: Groups multiple stanzas together to reduce network overhead
- Rate Limiting: Prevents overwhelming the server with too many requests
- Bounded Queues: Limits memory usage by capping queue sizes
- Performance Metrics: Tracks various performance indicators for monitoring
Performance Metrics
Access performance metrics through the transport:
final metrics = whixp.transport.metrics;
// Get summary
final summary = metrics.getSummary();
print('Stanzas sent: ${summary['stanzasSent']}');
print('Stanzas received: ${summary['stanzasReceived']}');
print('Average parsing time: ${summary['averageParsingTimeMs']}ms');
Available Metrics
The metrics system tracks:
- Stanza counts: Sent, received, and parsed
- Batch statistics: Batch sizes, flush times, and counts
- Queue statistics: Current size, max size, and overflows
- Rate limiting: Number of rate limit hits
- Parsing performance: Average parsing times
- Uptime: Time since metrics were reset
Getting Metrics Summary
final summary = metrics.getSummary();
print('Performance Summary:');
print(' Uptime: ${summary['uptimeSeconds']}s');
print(' Stanzas sent: ${summary['stanzasSent']}');
print(' Stanzas received: ${summary['stanzasReceived']}');
print(' Stanzas parsed: ${summary['stanzasParsed']}');
print(' Batches flushed: ${summary['batchesFlushed']}');
print(' Average batch size: ${summary['averageBatchSize']}');
print(' Queue overflows: ${summary['queueOverflows']}');
print(' Rate limit hits: ${summary['rateLimitHits']}');
Formatted Summary
Get a formatted string representation:
final formatted = metrics.getFormattedSummary();
print(formatted);
Resetting Metrics
Reset metrics to start fresh:
metrics.reset();
Message Batching
Message batching groups multiple stanzas together before sending, reducing network overhead and improving efficiency.
How Batching Works
When batching is enabled:
- Stanzas are collected into batches
- Batches are flushed when they reach a certain size or time limit
- Multiple stanzas are sent together in a single network operation
Accessing Batch Information
final metrics = whixp.transport.metrics;
final summary = metrics.getSummary();
print('Current batch size: ${summary['currentBatchSize']}');
print('Batches flushed: ${summary['batchesFlushed']}');
print('Average batch size: ${summary['averageBatchSize']}');
print('Average flush time: ${summary['averageBatchFlushTimeMs']}ms');
Rate Limiting
Rate limiting prevents overwhelming the server by limiting the number of requests per time period.
Rate Limit Hits
Monitor rate limit hits:
final metrics = whixp.transport.metrics;
final summary = metrics.getSummary();
if (summary['rateLimitHits'] > 0) {
print('Rate limit was hit ${summary['rateLimitHits']} times');
print('Consider adjusting your message sending rate');
}
Queue Management
Bounded queues prevent excessive memory usage by limiting queue sizes.
Queue Statistics
final metrics = whixp.transport.metrics;
final summary = metrics.getSummary();
print('Current queue size: ${summary['currentQueueSize']}');
print('Max queue size: ${summary['maxQueueSize']}');
print('Queue overflows: ${summary['queueOverflows']}');
Handling Overflows
If queue overflows occur frequently, consider:
- Increasing queue size limits (if configurable)
- Reducing message sending rate
- Processing messages more efficiently
- Implementing backpressure mechanisms
Monitoring Performance
Periodic Monitoring
Set up periodic monitoring of performance metrics:
Timer.periodic(Duration(seconds: 10), (timer) {
final metrics = whixp.transport.metrics;
final summary = metrics.getSummary();
print('Performance (last 10s):');
print(' Sent: ${summary['stanzasPerSecondSent']}/s');
print(' Received: ${summary['stanzasPerSecondReceived']}/s');
print(' Parsed: ${summary['stanzasPerSecondParsed']}/s');
});
Performance Alerts
Set up alerts for performance issues:
Timer.periodic(Duration(minutes: 1), (timer) {
final metrics = whixp.transport.metrics;
final summary = metrics.getSummary();
// Alert on high queue size
if (summary['currentQueueSize'] > 1000) {
print('WARNING: High queue size: ${summary['currentQueueSize']}');
}
// Alert on frequent rate limiting
if (summary['rateLimitHits'] > 10) {
print('WARNING: Rate limiting occurred ${summary['rateLimitHits']} times');
}
// Alert on queue overflows
if (summary['queueOverflows'] > 0) {
print('WARNING: Queue overflow occurred ${summary['queueOverflows']} times');
}
});
Best Practices
- Monitor regularly: Check performance metrics periodically to identify issues early
- Watch for overflows: Queue overflows indicate performance problems
- Respect rate limits: If rate limiting occurs frequently, reduce your sending rate
- Optimize parsing: If parsing times are high, consider optimizing message processing
- Reset when needed: Reset metrics periodically to get fresh statistics
Complete Example
Here's a complete example of monitoring performance:
void main() {
final whixp = Whixp(
jabberID: 'user@example.com',
password: 'password',
internalDatabasePath: 'whixp',
);
// Monitor performance every 10 seconds
Timer.periodic(Duration(seconds: 10), (timer) {
final metrics = whixp.transport.metrics;
final summary = metrics.getSummary();
print('\n=== Performance Metrics ===');
print('Uptime: ${summary['uptimeSeconds']}s');
print('Stanzas:');
print(' Sent: ${summary['stanzasSent']} (${summary['stanzasPerSecondSent']}/s)');
print(' Received: ${summary['stanzasReceived']} (${summary['stanzasPerSecondReceived']}/s)');
print(' Parsed: ${summary['stanzasParsed']} (${summary['stanzasPerSecondParsed']}/s)');
print('Batching:');
print(' Current batch: ${summary['currentBatchSize']}');
print(' Batches flushed: ${summary['batchesFlushed']}');
print(' Avg batch size: ${summary['averageBatchSize']}');
print('Queue:');
print(' Current size: ${summary['currentQueueSize']}');
print(' Max size: ${summary['maxQueueSize']}');
print(' Overflows: ${summary['queueOverflows']}');
print('Rate Limiting:');
print(' Hits: ${summary['rateLimitHits']}');
print('Parsing:');
print(' Avg time: ${summary['averageParsingTimeMs']}ms');
print('========================\n');
});
whixp.connect();
}
Performance features in Whixp help ensure your application runs efficiently even under high load, providing the metrics you need to monitor and optimize performance.