Add XCode skills for entity caching, ORM, and sharding ETL
|
---
name: system-introspection
description: >
使用 NewLife.Core çš„ MachineInfo(硬件 / 系统信æ¯ï¼ŒCPU å 用 / å†…å˜ / 网速)
å’Œ Runtime(平å°åˆ¤æ– / 容器检测 / 高精度计时 / 内å˜é‡Šæ”¾ï¼‰èŽ·å–è¿è¡ŒçŽ¯å¢ƒä¿¡æ¯ã€‚
适用于系统监控ã€çŽ¯å¢ƒè‡ªé€‚åº”é…ç½®ã€å¯è§‚测性心跳上报ç‰åœºæ™¯ã€‚
argument-hint: >
è¯´æ˜Žä½ çš„åœºæ™¯ï¼šèŽ·å–æœºå™¨å”¯ä¸€æ ‡è¯†ï¼ˆUUID/Guid/Serial);
读å–实时 CPU è´Ÿè½½ / 内å˜å 用;判æ–è¿è¡Œå¹³å°ï¼ˆWindows/Linux/Container);
还是获å–高精度系统è¿è¡Œæ—¶é•¿ï¼ˆTickCount64)。
---
# ç³»ç»Ÿè‡ªçœæŠ€èƒ½ï¼ˆMachineInfo + Runtime)
## 适用场景
- **`MachineInfo`**:心跳上报(CPU å 用率ã€å¯ç”¨å†…å˜ã€ç½‘速);机器指纹绑定(UUID/Guid/Serial);容é‡è§„划(总内å˜/ç£ç›˜ï¼‰ï¼›è·¨å¹³å°ç¡¬ä»¶ä¿¡æ¯èŽ·å–。
- **`Runtime`**ï¼šå¹³å°æ¡ä»¶ç¼–译替代(`Runtime.Windows` / `Linux` / `OSX`);容器/Docker 环境检测(`Runtime.Container`);控制å°/Web/GUI 场景判æ–;高精度系统è¿è¡Œæ—¶é•¿ï¼ˆ`TickCount64`ï¼Œæ— 32使º¢å‡ºé—®é¢˜ï¼‰ï¼›ä¸»åŠ¨é‡Šæ”¾ GC 内å˜ï¼ˆ`FreeMemory()`)。
- 代ç 审查:`MachineInfo.GetCurrent()` ä¼šåŒæ¥é˜»å¡žç‰å¾… `RegisterAsync()`,推è在应用å¯åŠ¨æ—¶ `await RegisterAsync()`ï¼›`Refresh()` åˆ·æ–°åŠ¨æ€æŒ‡æ ‡ï¼Œä¸ä¼šé‡æ–°è¯»å–陿€ç¡¬ä»¶ä¿¡æ¯ã€‚
## æ ¸å¿ƒåŽŸåˆ™
1. **`RegisterAsync()` å¯åŠ¨é˜¶æ®µè°ƒç”¨ä¸€æ¬¡**:异æ¥è¯»å–全部硬件信æ¯å¹¶ç¼“å˜åˆ° `machine_info.json`,æœåŠ¡é‡å¯åŽåŠ é€Ÿåˆå§‹åŒ–ï¼›`GetCurrent()` æ˜¯åŒæ¥é˜»å¡žåŒ…è£…ï¼Œä»…åœ¨æ— æ³•ä½¿ç”¨ async 时用。
2. **陿€å±žæ€§ vs 动æ€å±žæ€§**:硬件属性(`UUID`/`Memory`/`Processor`)在 `Init()/RegisterAsync()` åŽå›ºå®šï¼›åЍæ€å±žæ€§ï¼ˆ`CpuRate`/`AvailableMemory`/`UplinkSpeed`)需调用 `Refresh()` 刷新。
3. **`MachineInfo.Current` å³å•例**:`RegisterAsync()` 会注册到 `ObjectContainer`,å¯é€šè¿‡ `MachineInfo.Resolve()` 从 DI 获å–。
4. **`TickCount64` æ— æº¢å‡º**:`Environment.TickCount`(32ä½ï¼‰çº¦49.7天溢出;`Runtime.TickCount64`(`Int64`ï¼‰æ— æ¤é—®é¢˜ï¼Œæ‰€æœ‰è®¡æ—¶é€»è¾‘用 `TickCount64`。
5. **`Runtime.Container`**:通过环境å˜é‡ `DOTNET_RUNNING_IN_CONTAINER` 判æ–ï¼Œæ ‡å‡† Docker 镜åƒè‡ªåŠ¨è®¾ç½®æ¤å˜é‡ã€‚
## 执行æ¥éª¤
### 一ã€åº”用å¯åŠ¨æ—¶åˆå§‹åŒ–机器信æ¯
```csharp
using NewLife;
using NewLife.Log;
// 应用å¯åŠ¨ï¼ˆæœ€æ—©ï¼Œå¦‚ Main 或 ConfigureServices)
var machine = await MachineInfo.RegisterAsync();
XTrace.WriteLine("OS: {0} {1}", machine.OSName, machine.OSVersion);
XTrace.WriteLine("CPU: {0}", machine.Processor);
XTrace.WriteLine("内å˜: {0:N0} MB", machine.Memory / 1024 / 1024);
XTrace.WriteLine("UUID: {0}", machine.UUID);
XTrace.WriteLine("机器GUID: {0}", machine.Guid);
XTrace.WriteLine("åºåˆ—å·: {0}", machine.Serial);
```
### 二ã€å®žæ—¶ç›‘控 CPU / å†…å˜ / 网速
```csharp
var machine = MachineInfo.Current!;
// åˆ·æ–°åŠ¨æ€æŒ‡æ ‡ï¼ˆCPU / å†…å˜ / 网速 / 温度 / 电é‡ï¼‰
machine.Refresh();
XTrace.WriteLine("CPU å 用: {0:P1}", machine.CpuRate);
XTrace.WriteLine("å¯ç”¨å†…å˜: {0:N0} MB", machine.AvailableMemory / 1024 / 1024);
XTrace.WriteLine("空闲内å˜: {0:N0} MB", machine.FreeMemory / 1024 / 1024);
XTrace.WriteLine("上行速度: {0:N0} KB/s", machine.UplinkSpeed / 1024);
XTrace.WriteLine("下行速度: {0:N0} KB/s", machine.DownlinkSpeed / 1024);
XTrace.WriteLine("温度: {0:F1}°C", machine.Temperature);
XTrace.WriteLine("电é‡: {0:P0}", machine.Battery);
```
定期刷新(结åˆå®šæ—¶å™¨ï¼‰ï¼š
```csharp
var timer = new TimerX(_ => MachineInfo.Current?.Refresh(), null, 0, 5_000);
```
### ä¸‰ã€æœºå™¨å”¯ä¸€æ ‡è¯†ï¼ˆç¡¬ä»¶æŒ‡çº¹ï¼‰
```csharp
var machine = MachineInfo.GetCurrent();
// UUID:主æ¿/BIOS å”¯ä¸€æ ‡è¯†ï¼ˆæœ€ç¨³å®šï¼ŒæŽ¨è)
var deviceId = machine.UUID;
// Guid:系统分é…的逻辑 ID(OS 安装时生æˆï¼‰
var sysGuid = machine.Guid;
// Serial:整机åºåˆ—å·
var serial = machine.Serial;
// DiskID:主硬盘åºåˆ—å·
var diskId = machine.DiskID;
// ç»„åˆæŒ‡çº¹ï¼ˆæ›´ç¨³å¥ï¼‰
var fingerprint = $"{machine.UUID}|{machine.DiskID}".ToMD5();
```
### å››ã€Runtime — å¹³å°ä¸ŽçŽ¯å¢ƒåˆ¤æ–
```csharp
using NewLife;
// å¹³å°åˆ¤æ–
if (Runtime.Windows) XTrace.WriteLine("Windows å¹³å°");
else if (Runtime.Linux) XTrace.WriteLine("Linux å¹³å°");
else if (Runtime.OSX) XTrace.WriteLine("macOS å¹³å°");
// è¿è¡Œæ—¶ç±»åž‹
if (Runtime.Mono) XTrace.WriteLine("Mono è¿è¡Œæ—¶");
if (Runtime.Unity) XTrace.WriteLine("Unity è¿è¡Œæ—¶");
// 宿主类型
if (Runtime.Container) XTrace.WriteLine("Docker / Kubernetes 容器");
if (Runtime.IsConsole) XTrace.WriteLine("控制å°ç¨‹åº");
else if (Runtime.IsWeb) XTrace.WriteLine("Web 应用");
// 容器环境自适应é…ç½®
var logPath = Runtime.Container ? "/app/logs" : @".\Logs";
```
### 五ã€é«˜ç²¾åº¦è®¡æ—¶ï¼ˆTickCount64)
```csharp
// æ— 32使º¢å‡ºçš„系统è¿è¡Œæ—¶é•¿ï¼ˆæ¯«ç§’)
var startMs = Runtime.TickCount64;
DoSomeWork();
var elapsed = Runtime.TickCount64 - startMs;
XTrace.WriteLine("耗时: {0} ms", elapsed);
// 系统已è¿è¡Œæ—¶é•¿
var uptimeSec = Runtime.TickCount64 / 1000;
XTrace.WriteLine("系统è¿è¡Œ: {0} 天 {1:D2} æ—¶ {2:D2} 分",
uptimeSec / 86400, uptimeSec % 86400 / 3600, uptimeSec % 3600 / 60);
```
### å…ã€å†…å˜é‡Šæ”¾
```csharp
// ä¸»åŠ¨è§¦å‘ GC å¹¶ç¼©å‡ WorkingSet(é™ä½Žå†…å˜å 用)
Runtime.FreeMemory();
// 指定进程 ID(如需对外部进程æ“作,通常ä¸ç”¨ï¼‰
Runtime.FreeMemory(processId: 0, gc: true, workingSet: true);
```
### 七ã€å…¶ä»– Runtime 工具
```csharp
// 当å‰è¿›ç¨‹ ID
int pid = Runtime.ProcessId;
// å®¢æˆ·ç«¯å”¯ä¸€æ ‡è¯†ï¼ˆåŸºäºŽæœºå™¨+进程)
string clientId = Runtime.ClientId;
// 读å–环境å˜é‡ï¼ˆè·¨å¹³å°å…¼å®¹ï¼ŒåŒ…括系统/用户/进程级别)
string? dbHost = Runtime.GetEnvironmentVariable("DB_HOST");
var allVars = Runtime.GetEnvironmentVariables();
// 高精度 UTC 时间(通过 TimerScheduler æä¾›ï¼Œå¯æµ‹è¯•替æ¢ï¼‰
DateTimeOffset now = Runtime.UtcNow;
```
## é‡ç‚¹æ£€æŸ¥é¡¹
- [ ] `MachineInfo.RegisterAsync()` 是å¦åœ¨åº”用å¯åŠ¨æ—¶è°ƒç”¨ï¼ˆè€Œä¸æ˜¯æ¯æ¬¡ä½¿ç”¨æ—¶è°ƒç”¨ï¼‰ï¼Ÿ
- [ ] 读å–监控数æ®ä¹‹å‰æ˜¯å¦è°ƒç”¨äº† `Refresh()`ï¼ˆé™æ€ç¡¬ä»¶å±žæ€§ä¸éœ€è¦åˆ·æ–°ï¼ŒåŠ¨æ€æŒ‡æ ‡éœ€è¦ï¼‰ï¼Ÿ
- [ ] ä½¿ç”¨è®¡æ—¶é€»è¾‘æ—¶æ˜¯å¦æ”¹ç”¨ `Runtime.TickCount64` è€Œéž `Environment.TickCount`(åŽè€…32ä½çº¦49天溢出)?
- [ ] æœºå™¨å”¯ä¸€æ ‡è¯†æ˜¯å¦ä¼˜å…ˆé€‰ `UUID`(最稳定),并åšç©ºå€¼ä¿æŠ¤ï¼ˆè™šæ‹Ÿæœº/容器环境å¯èƒ½è¿”回 `null`)?
- [ ] å®¹å™¨åˆ¤æ–æ˜¯å¦ç”¨ `Runtime.Container`ï¼ˆè¯»å– `DOTNET_RUNNING_IN_CONTAINER` 环境å˜é‡ï¼‰ï¼Œè€Œéžè‡ªè¡Œåˆ¤æ–路径?
## è¾“å‡ºè¦æ±‚
- **机器信æ¯**:`MachineInfo`(`NewLife`)—— `RegisterAsync()`/`GetCurrent()`/`Refresh()`ï¼›é™æ€å±žæ€§ï¼ˆUUID/Memory/Processor)+ 动æ€å±žæ€§ï¼ˆCpuRate/AvailableMemory/UplinkSpeed)。
- **è¿è¡Œæ—¶å·¥å…·**:`Runtime`(`NewLife`ï¼Œé™æ€ç±»ï¼‰â€”— `Windows`/`Linux`/`OSX`/`Container`/`IsConsole`/`IsWeb`ï¼›`TickCount64`ï¼›`FreeMemory()`ï¼›`ProcessId`/`ClientId`。
## å‚考资料
- `NewLife.Core/Common/MachineInfo.cs`
- `NewLife.Core/Common/Runtime.cs`
- 相关技能:`logging-tracing-system`(APM å¿ƒè·³ä¸ŠæŠ¥ç»“åˆ MachineInfo)ã€`timer-scheduler`(定期 Refresh ç›‘æŽ§æŒ‡æ ‡ï¼‰
|