Skip to main content
Glama
performance-benchmarks.cjsโ€ข11 kB
#!/usr/bin/env node /** * Production Performance Benchmarks * Establishes baseline performance metrics and SLA targets */ const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); console.log('๐Ÿ“Š Establishing Production Performance Benchmarks...\n'); // Production Performance SLA Targets const PERFORMANCE_SLA = { // Response time targets (milliseconds) responseTime: { p50: 100, // 50th percentile < 100ms p95: 300, // 95th percentile < 300ms p99: 500, // 99th percentile < 500ms max: 1000 // Maximum < 1000ms }, // Throughput targets (requests/second) throughput: { read: 1000, // GET requests/sec write: 100, // POST/PUT/DELETE requests/sec mixed: 500 // Mixed workload requests/sec }, // Cache performance targets cache: { hitRate: 0.80, // 80% cache hit rate writeOpsPerSec: 50000, // Cache write operations/sec readOpsPerSec: 100000, // Cache read operations/sec memoryUsage: 512 // Max memory usage MB }, // Resource utilization targets resources: { cpuUsage: 0.70, // Max 70% CPU utilization memoryUsage: 0.80, // Max 80% memory utilization diskIO: 100, // Max 100 MB/s disk I/O networkIO: 500 // Max 500 MB/s network I/O }, // Availability targets availability: { uptime: 0.999, // 99.9% uptime SLA healthCheckTimeout: 5000, // Health check timeout maxDowntime: 43200 // Max downtime per month (12 hours) } }; // Test Scenarios const TEST_SCENARIOS = [ { name: 'WordPress API Load Test', description: 'Test WordPress REST API performance under load', duration: 60, concurrency: 50, target: 'posts' }, { name: 'Cache Performance Test', description: 'Validate cache hit rates and performance', duration: 30, operations: 10000, type: 'mixed' }, { name: 'Memory Stress Test', description: 'Test memory usage under sustained load', duration: 120, payloadSize: '1mb', operations: 1000 }, { name: 'Concurrent User Simulation', description: 'Simulate real-world concurrent user patterns', duration: 180, users: 100, rampUp: 30 } ]; function getCurrentMetrics() { console.log('๐Ÿ“ˆ Collecting current performance metrics...'); const metrics = { timestamp: new Date().toISOString(), system: { nodeVersion: process.version, platform: process.platform, arch: process.arch, cpus: require('os').cpus().length, totalMemory: Math.round(require('os').totalmem() / 1024 / 1024 / 1024) + ' GB' }, application: {} }; try { // Run performance tests to get baseline console.log(' โšก Running cache performance test...'); const cacheTest = execSync('NODE_OPTIONS="--experimental-vm-modules" npx jest tests/cache/cache-performance.test.js --verbose --testTimeout=60000', { encoding: 'utf8', timeout: 120000, stdio: ['pipe', 'pipe', 'pipe'] }); // Extract cache performance metrics from test output const cacheMetrics = extractCacheMetrics(cacheTest); metrics.application.cache = cacheMetrics; console.log(' ๐Ÿ” Cache write throughput:', cacheMetrics.writeThroughput.toLocaleString(), 'ops/sec'); console.log(' ๐Ÿ” Cache read throughput:', cacheMetrics.readThroughput.toLocaleString(), 'ops/sec'); } catch (error) { console.warn(' โš ๏ธ Could not collect all performance metrics:', error.message); } return metrics; } function extractCacheMetrics(testOutput) { const metrics = { writeThroughput: 0, readThroughput: 0, mixedThroughput: 0, latencyP50: 0, latencyP95: 0, latencyP99: 0, memoryEfficiency: 0 }; try { // Parse cache throughput from test output const writeMatch = testOutput.match(/Cache write throughput: ([\d,]+) ops\/sec/); if (writeMatch) { metrics.writeThroughput = parseInt(writeMatch[1].replace(/,/g, '')); } const readMatch = testOutput.match(/Cache read throughput: ([\d,]+) ops\/sec/); if (readMatch) { metrics.readThroughput = parseInt(readMatch[1].replace(/,/g, '')); } const mixedMatch = testOutput.match(/Mixed workload throughput: ([\d,]+) ops\/sec/); if (mixedMatch) { metrics.mixedThroughput = parseInt(mixedMatch[1].replace(/,/g, '')); } // Parse latency metrics const latencyMatch = testOutput.match(/P50: ([\d.]+)ms, P95: ([\d.]+)ms, P99: ([\d.]+)ms/); if (latencyMatch) { metrics.latencyP50 = parseFloat(latencyMatch[1]); metrics.latencyP95 = parseFloat(latencyMatch[2]); metrics.latencyP99 = parseFloat(latencyMatch[3]); } } catch (error) { console.warn(' โš ๏ธ Could not parse all cache metrics'); } return metrics; } function validateAgainstSLA(metrics) { console.log('\n๐ŸŽฏ Validating performance against SLA targets...'); const results = { overall: 'PASS', details: [], score: 100 }; // Validate cache performance if (metrics.application.cache) { const cache = metrics.application.cache; // Cache write throughput if (cache.writeThroughput >= PERFORMANCE_SLA.cache.writeOpsPerSec) { results.details.push({ metric: 'Cache Write Throughput', status: 'PASS', value: cache.writeThroughput, target: PERFORMANCE_SLA.cache.writeOpsPerSec }); } else { results.details.push({ metric: 'Cache Write Throughput', status: 'FAIL', value: cache.writeThroughput, target: PERFORMANCE_SLA.cache.writeOpsPerSec }); results.overall = 'FAIL'; results.score -= 15; } // Cache read throughput if (cache.readThroughput >= PERFORMANCE_SLA.cache.readOpsPerSec) { results.details.push({ metric: 'Cache Read Throughput', status: 'PASS', value: cache.readThroughput, target: PERFORMANCE_SLA.cache.readOpsPerSec }); } else { results.details.push({ metric: 'Cache Read Throughput', status: 'FAIL', value: cache.readThroughput, target: PERFORMANCE_SLA.cache.readOpsPerSec }); results.overall = 'FAIL'; results.score -= 15; } // Response time validation if (cache.latencyP95 <= PERFORMANCE_SLA.responseTime.p95) { results.details.push({ metric: 'Response Time P95', status: 'PASS', value: cache.latencyP95 + 'ms', target: PERFORMANCE_SLA.responseTime.p95 + 'ms' }); } else { results.details.push({ metric: 'Response Time P95', status: 'FAIL', value: cache.latencyP95 + 'ms', target: PERFORMANCE_SLA.responseTime.p95 + 'ms' }); results.overall = 'FAIL'; results.score -= 20; } } return results; } function generateBenchmarkReport(metrics, validation) { console.log('\n๐Ÿ“‹ Generating benchmark report...'); const report = { metadata: { version: '2.4.2', timestamp: new Date().toISOString(), environment: 'production', testDuration: '5 minutes' }, sla: PERFORMANCE_SLA, testScenarios: TEST_SCENARIOS, currentMetrics: metrics, validation: validation, recommendations: [] }; // Generate recommendations based on validation results validation.details.forEach(detail => { if (detail.status === 'FAIL') { report.recommendations.push({ priority: 'HIGH', metric: detail.metric, issue: `Performance below SLA target: ${detail.value} < ${detail.target}`, recommendations: generateRecommendations(detail.metric) }); } }); return report; } function generateRecommendations(metric) { const recommendations = { 'Cache Write Throughput': [ 'Optimize cache write operations with batching', 'Consider using Redis for distributed caching', 'Review cache serialization performance', 'Implement async cache writes where possible' ], 'Cache Read Throughput': [ 'Implement cache warming strategies', 'Optimize cache key generation and lookup', 'Consider memory-based caching for hot data', 'Review cache hit rate and eviction policies' ], 'Response Time P95': [ 'Enable request compression and caching', 'Optimize database queries and indexing', 'Implement connection pooling', 'Consider CDN for static assets' ] }; return recommendations[metric] || ['Review and optimize this metric']; } function displayResults(validation) { console.log('\n๐ŸŽฏ Performance Validation Results:'); console.log('===================================='); console.log(`Overall Status: ${validation.overall === 'PASS' ? 'โœ…' : 'โŒ'} ${validation.overall}`); console.log(`Performance Score: ${validation.score}/100`); console.log(''); validation.details.forEach(detail => { const status = detail.status === 'PASS' ? 'โœ…' : 'โŒ'; console.log(`${status} ${detail.metric}: ${detail.value} (target: ${detail.target})`); }); } async function main() { try { // Step 1: Collect current metrics const metrics = getCurrentMetrics(); // Step 2: Validate against SLA const validation = validateAgainstSLA(metrics); // Step 3: Generate comprehensive report const report = generateBenchmarkReport(metrics, validation); // Step 4: Save benchmark report const reportPath = 'performance-benchmark.json'; fs.writeFileSync(reportPath, JSON.stringify(report, null, 2)); // Step 5: Display results displayResults(validation); console.log('\n๐Ÿ“Š Performance Benchmarks Summary:'); console.log('=================================='); console.log(`Cache Write Throughput: ${metrics.application.cache?.writeThroughput?.toLocaleString() || 'N/A'} ops/sec`); console.log(`Cache Read Throughput: ${metrics.application.cache?.readThroughput?.toLocaleString() || 'N/A'} ops/sec`); console.log(`Mixed Workload Throughput: ${metrics.application.cache?.mixedThroughput?.toLocaleString() || 'N/A'} ops/sec`); console.log(`Response Time P95: ${metrics.application.cache?.latencyP95 || 'N/A'}ms`); console.log(''); console.log(`โœ… Benchmark report saved to: ${reportPath}`); if (report.recommendations.length > 0) { console.log('\n๐Ÿ’ก Performance Recommendations:'); console.log('==============================='); report.recommendations.forEach((rec, index) => { console.log(`${index + 1}. ${rec.metric} (${rec.priority} Priority)`); rec.recommendations.forEach(r => console.log(` - ${r}`)); console.log(''); }); } console.log('๐ŸŽ‰ Performance benchmarking complete!'); // Exit with appropriate code process.exit(validation.overall === 'PASS' ? 0 : 1); } catch (error) { console.error('โŒ Error during performance benchmarking:', error.message); process.exit(1); } } if (require.main === module) { main(); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/docdyhr/mcp-wordpress'

If you have feedback or need assistance with the MCP directory API, please join our Discord server