|
1 | 1 | const fs = require('fs').promises; |
2 | 2 | const path = require('path'); |
| 3 | +const os = require('os'); |
3 | 4 |
|
4 | 5 | /** |
5 | 6 | * 错误类型定义 |
@@ -586,18 +587,35 @@ class ErrorMonitor { |
586 | 587 | */ |
587 | 588 | async checkSystemResources(alerts) { |
588 | 589 | try { |
589 | | - const memoryUsage = process.memoryUsage(); |
590 | | - const memoryUsagePercent = memoryUsage.heapUsed / memoryUsage.heapTotal; |
| 590 | + const totalMem = os.totalmem(); |
| 591 | + const freeMem = os.freemem(); |
| 592 | + const usedMem = totalMem - freeMem; |
| 593 | + const memoryUsagePercent = usedMem / totalMem; |
| 594 | + const memoryUsage = process.memoryUsage(); // 保留用于记录进程数据 |
591 | 595 |
|
592 | | - // 检查内存使用率 |
| 596 | + // 检查服务器物理内存使用率 |
593 | 597 | if (memoryUsagePercent > 0.9) { // 90%内存使用率 |
594 | 598 | const alertKey = 'HIGH_MEMORY_USAGE'; |
595 | 599 | if (this.shouldSendAlert(alertKey)) { |
596 | 600 | alerts.push({ |
597 | 601 | type: alertKey, |
598 | | - message: `内存使用率${(memoryUsagePercent * 100).toFixed(2)}%过高`, |
| 602 | + message: `服务器物理内存使用率${(memoryUsagePercent * 100).toFixed(2)}%过高`, |
| 603 | + severity: 'WARNING', |
| 604 | + data: { systemUsage: memoryUsagePercent, processMemory: memoryUsage } |
| 605 | + }); |
| 606 | + } |
| 607 | + } |
| 608 | + |
| 609 | + // 也检查一下 Node 进程本身是否占用过高 (超过 500MB rss) |
| 610 | + const processMemUsageMB = memoryUsage.rss / (1024 * 1024); |
| 611 | + if (processMemUsageMB > 500) { |
| 612 | + const alertKey = 'HIGH_PROCESS_MEMORY'; |
| 613 | + if (this.shouldSendAlert(alertKey)) { |
| 614 | + alerts.push({ |
| 615 | + type: alertKey, |
| 616 | + message: `Node进程内存占用过高: ${processMemUsageMB.toFixed(2)}MB`, |
599 | 617 | severity: 'WARNING', |
600 | | - data: { memoryUsage, memoryUsagePercent } |
| 618 | + data: { processMemory: memoryUsage } |
601 | 619 | }); |
602 | 620 | } |
603 | 621 | } |
@@ -734,13 +752,17 @@ class ErrorMonitor { |
734 | 752 |
|
735 | 753 | const errorRate = statistics.totalErrors / Math.max(1, statistics.totalErrors + 100); // 假设正常请求数 |
736 | 754 | const memoryUsage = process.memoryUsage(); |
737 | | - const memoryUsagePercent = memoryUsage.heapUsed / memoryUsage.heapTotal; |
| 755 | + |
| 756 | + // 将健康检查修改为基于系统的实际内存分配或者 RSS |
| 757 | + const totalMem = os.totalmem(); |
| 758 | + const freeMem = os.freemem(); |
| 759 | + const memoryUsagePercent = (totalMem - freeMem) / totalMem; |
738 | 760 |
|
739 | 761 | // 综合评估健康状态 |
740 | 762 | const healthChecks = { |
741 | 763 | errorRate: errorRate <= this.errorThresholds.errorRate, |
742 | 764 | errorCount: statistics.totalErrors <= this.errorThresholds.errorCount, |
743 | | - memoryUsage: memoryUsagePercent <= 0.9, |
| 765 | + memoryUsage: memoryUsagePercent <= 0.9 && (memoryUsage.rss / (1024 * 1024)) < 500, // 系统不足90% 或 进程不足500MB |
744 | 766 | uptime: process.uptime() < 7 * 24 * 60 * 60 // 7天 |
745 | 767 | }; |
746 | 768 |
|
|
0 commit comments