front-cpu 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +475 -0
  2. package/README.zh-CN.md +474 -0
  3. package/dist/Pipeline.d.ts +119 -0
  4. package/dist/Pipeline.d.ts.map +1 -0
  5. package/dist/Pipeline.js +373 -0
  6. package/dist/Pipeline.js.map +1 -0
  7. package/dist/debug.d.ts +3 -0
  8. package/dist/debug.d.ts.map +1 -0
  9. package/dist/debug.js +12 -0
  10. package/dist/debug.js.map +1 -0
  11. package/dist/index.d.ts +20 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +19 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/interfaces.d.ts +49 -0
  16. package/dist/interfaces.d.ts.map +1 -0
  17. package/dist/interfaces.js +8 -0
  18. package/dist/interfaces.js.map +1 -0
  19. package/dist/isa/index.d.ts +20 -0
  20. package/dist/isa/index.d.ts.map +1 -0
  21. package/dist/isa/index.js +26 -0
  22. package/dist/isa/index.js.map +1 -0
  23. package/dist/isa/types.d.ts +144 -0
  24. package/dist/isa/types.d.ts.map +1 -0
  25. package/dist/isa/types.js +10 -0
  26. package/dist/isa/types.js.map +1 -0
  27. package/dist/logging/CPUConsole.d.ts +105 -0
  28. package/dist/logging/CPUConsole.d.ts.map +1 -0
  29. package/dist/logging/CPUConsole.js +471 -0
  30. package/dist/logging/CPUConsole.js.map +1 -0
  31. package/dist/logging/CPUDebugger.d.ts +91 -0
  32. package/dist/logging/CPUDebugger.d.ts.map +1 -0
  33. package/dist/logging/CPUDebugger.js +166 -0
  34. package/dist/logging/CPUDebugger.js.map +1 -0
  35. package/dist/logging/CPUEventCollector.d.ts +90 -0
  36. package/dist/logging/CPUEventCollector.d.ts.map +1 -0
  37. package/dist/logging/CPUEventCollector.js +353 -0
  38. package/dist/logging/CPUEventCollector.js.map +1 -0
  39. package/dist/logging/CPULogger.d.ts +150 -0
  40. package/dist/logging/CPULogger.d.ts.map +1 -0
  41. package/dist/logging/CPULogger.js +336 -0
  42. package/dist/logging/CPULogger.js.map +1 -0
  43. package/dist/logging/index.d.ts +10 -0
  44. package/dist/logging/index.d.ts.map +1 -0
  45. package/dist/logging/index.js +16 -0
  46. package/dist/logging/index.js.map +1 -0
  47. package/dist/logging/runtime.d.ts +37 -0
  48. package/dist/logging/runtime.d.ts.map +1 -0
  49. package/dist/logging/runtime.js +42 -0
  50. package/dist/logging/runtime.js.map +1 -0
  51. package/dist/logging/stack-parser.d.ts +22 -0
  52. package/dist/logging/stack-parser.d.ts.map +1 -0
  53. package/dist/logging/stack-parser.js +144 -0
  54. package/dist/logging/stack-parser.js.map +1 -0
  55. package/dist/logging/types.d.ts +73 -0
  56. package/dist/logging/types.d.ts.map +1 -0
  57. package/dist/logging/types.js +47 -0
  58. package/dist/logging/types.js.map +1 -0
  59. package/dist/scheduling/ResourceStrategyRegistry.d.ts +61 -0
  60. package/dist/scheduling/ResourceStrategyRegistry.d.ts.map +1 -0
  61. package/dist/scheduling/ResourceStrategyRegistry.js +109 -0
  62. package/dist/scheduling/ResourceStrategyRegistry.js.map +1 -0
  63. package/dist/scheduling/index.d.ts +6 -0
  64. package/dist/scheduling/index.d.ts.map +1 -0
  65. package/dist/scheduling/index.js +5 -0
  66. package/dist/scheduling/index.js.map +1 -0
  67. package/dist/scheduling/types.d.ts +44 -0
  68. package/dist/scheduling/types.d.ts.map +1 -0
  69. package/dist/scheduling/types.js +5 -0
  70. package/dist/scheduling/types.js.map +1 -0
  71. package/dist/stages/EX.d.ts +17 -0
  72. package/dist/stages/EX.d.ts.map +1 -0
  73. package/dist/stages/EX.js +95 -0
  74. package/dist/stages/EX.js.map +1 -0
  75. package/dist/stages/IF.d.ts +41 -0
  76. package/dist/stages/IF.d.ts.map +1 -0
  77. package/dist/stages/IF.js +83 -0
  78. package/dist/stages/IF.js.map +1 -0
  79. package/dist/stages/RES.d.ts +17 -0
  80. package/dist/stages/RES.d.ts.map +1 -0
  81. package/dist/stages/RES.js +37 -0
  82. package/dist/stages/RES.js.map +1 -0
  83. package/dist/stages/SCH.d.ts +77 -0
  84. package/dist/stages/SCH.d.ts.map +1 -0
  85. package/dist/stages/SCH.js +270 -0
  86. package/dist/stages/SCH.js.map +1 -0
  87. package/dist/stages/WB.d.ts +19 -0
  88. package/dist/stages/WB.d.ts.map +1 -0
  89. package/dist/stages/WB.js +102 -0
  90. package/dist/stages/WB.js.map +1 -0
  91. package/dist/types.d.ts +111 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +26 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils/InstructionCancellation.d.ts +31 -0
  96. package/dist/utils/InstructionCancellation.d.ts.map +1 -0
  97. package/dist/utils/InstructionCancellation.js +53 -0
  98. package/dist/utils/InstructionCancellation.js.map +1 -0
  99. package/dist/utils/abortable.d.ts +30 -0
  100. package/dist/utils/abortable.d.ts.map +1 -0
  101. package/dist/utils/abortable.js +76 -0
  102. package/dist/utils/abortable.js.map +1 -0
  103. package/dist/utils/request.d.ts +27 -0
  104. package/dist/utils/request.d.ts.map +1 -0
  105. package/dist/utils/request.js +96 -0
  106. package/dist/utils/request.js.map +1 -0
  107. package/package.json +74 -0
  108. package/src/Pipeline.ts +475 -0
  109. package/src/debug.ts +15 -0
  110. package/src/index.ts +67 -0
  111. package/src/interfaces.ts +53 -0
  112. package/src/isa/index.ts +34 -0
  113. package/src/isa/types.ts +178 -0
  114. package/src/logging/CPUConsole.md +843 -0
  115. package/src/logging/CPUConsole.ts +631 -0
  116. package/src/logging/CPUDebugger.ts +235 -0
  117. package/src/logging/CPUEventCollector.ts +418 -0
  118. package/src/logging/CPULogger.ts +435 -0
  119. package/src/logging/CPU_LOGGING_DESIGN.md +1319 -0
  120. package/src/logging/USAGE_GUIDE.md +505 -0
  121. package/src/logging/index.ts +21 -0
  122. package/src/logging/runtime.ts +96 -0
  123. package/src/logging/stack-parser.ts +168 -0
  124. package/src/logging/types.ts +101 -0
  125. package/src/scheduling/ResourceStrategyRegistry.ts +124 -0
  126. package/src/scheduling/index.ts +13 -0
  127. package/src/scheduling/types.ts +47 -0
  128. package/src/stages/EX.ts +121 -0
  129. package/src/stages/IF.ts +103 -0
  130. package/src/stages/RES.ts +46 -0
  131. package/src/stages/SCH.ts +331 -0
  132. package/src/stages/WB.ts +127 -0
  133. package/src/types.ts +118 -0
  134. package/src/utils/InstructionCancellation.ts +73 -0
  135. package/src/utils/abortable.ts +89 -0
  136. package/src/utils/request.ts +125 -0
@@ -0,0 +1,1319 @@
1
+ # FrontCPU 专用日志与调试系统设计
2
+
3
+ **设计目标**: 为 FrontCPU 打造专业级指令追踪、性能分析和调试工具
4
+ **设计原则**: 零依赖、高性能、智能化、可视化
5
+
6
+ ---
7
+
8
+ ## 📋 目录
9
+
10
+ 1. [现有问题分析](#现有问题分析)
11
+ 2. [架构设计](#架构设计)
12
+ 3. [核心组件](#核心组件)
13
+ 4. [API 设计](#api-设计)
14
+ 5. [调试器 UI 增强](#调试器-ui-增强)
15
+ 6. [实施计划](#实施计划)
16
+
17
+ ---
18
+
19
+ ## 🔍 现有问题分析
20
+
21
+ ### 旧 Logger 的问题
22
+
23
+ ```typescript
24
+ // ❌ 问题1: 使用通用 logger,不了解 CPU 指令的特殊需求
25
+ logger.info('System:Pipeline', 'WB: 指令完成', { instructionId, type })
26
+
27
+ // ❌ 问题2: 简单的 console.log,缺乏结构化
28
+ console.log(`🎯 指令完成: ${trace.type}`, this.formatTraceInfo(trace))
29
+
30
+ // ❌ 问题3: 无法进行复杂查询
31
+ // "找出所有执行超过 100ms 的 schedule.update 指令"
32
+ // "找出所有触发了回滚的指令"
33
+ // "分析资源冲突导致的调度延迟"
34
+ ```
35
+
36
+ ### InstructionTracker 的局限
37
+
38
+ 1. **功能单一**: 只记录时间戳和状态,缺少深度信息
39
+ 2. **无持久化**: 刷新页面后丢失所有历史
40
+ 3. **无聚合分析**: 无法统计平均耗时、成功率等
41
+ 4. **无关联分析**: 无法追踪 `correlationId` 的完整链路
42
+ 5. **调试困难**: 无法重放指令、无法导出数据
43
+
44
+ ---
45
+
46
+ ## 🏗️ 架构设计
47
+
48
+ ### 整体架构
49
+
50
+ ```
51
+ ┌─────────────────────────────────────────────────────┐
52
+ │ FrontCPU │
53
+ │ IF → SCH → EX → RES → WB → INT │
54
+ └───────────────┬─────────────────────────────────────┘
55
+ │ 发送指令事件
56
+
57
+ ┌─────────────────────────────────────────────────────┐
58
+ │ CPUEventCollector (事件采集器) │
59
+ │ - 捕获所有指令生命周期事件 │
60
+ │ - 零侵入式设计,不影响流水线性能 │
61
+ └───────────────┬─────────────────────────────────────┘
62
+ │ 结构化事件流
63
+
64
+ ┌─────────────────────────────────────────────────────┐
65
+ │ CPULogger (日志记录器) │
66
+ │ - 结构化存储 │
67
+ │ - 智能索引 │
68
+ │ - 自动分析 │
69
+ └───────────────┬─────────────────────────────────────┘
70
+ │ 查询接口
71
+
72
+ ┌─────────────────────────────────────────────────────┐
73
+ │ CPUDebugger (调试器) │
74
+ │ - 实时监控面板 │
75
+ │ - 性能分析图表 │
76
+ │ - 指令查询引擎 │
77
+ │ - 时间旅行调试 │
78
+ └─────────────────────────────────────────────────────┘
79
+ ```
80
+
81
+ ### 核心设计原则
82
+
83
+ 1. **零依赖**: 完全独立,不依赖旧 logger
84
+ 2. **高性能**: 异步批量处理,不阻塞流水线
85
+ 3. **结构化**: 所有数据都是强类型、可查询的
86
+ 4. **智能化**: 自动检测异常、分析性能瓶颈
87
+ 5. **可视化**: 丰富的图表和交互式调试界面
88
+
89
+ ---
90
+
91
+ ## 🧩 核心组件
92
+
93
+ ### 1. CPUEvent (事件模型)
94
+
95
+ ```typescript
96
+ /**
97
+ * CPU 指令事件类型
98
+ */
99
+ export enum CPUEventType {
100
+ // 指令生命周期
101
+ INSTRUCTION_CREATED = 'instruction.created',
102
+ INSTRUCTION_ISSUED = 'instruction.issued',
103
+ INSTRUCTION_EXECUTING = 'instruction.executing',
104
+ INSTRUCTION_RESPONDED = 'instruction.responded',
105
+ INSTRUCTION_COMMITTED = 'instruction.committed',
106
+ INSTRUCTION_FAILED = 'instruction.failed',
107
+
108
+ // 乐观更新
109
+ OPTIMISTIC_APPLIED = 'optimistic.applied',
110
+ OPTIMISTIC_ROLLED_BACK = 'optimistic.rolled_back',
111
+
112
+ // 调度器
113
+ SCHEDULER_CONFLICT_DETECTED = 'scheduler.conflict_detected',
114
+ SCHEDULER_INSTRUCTION_QUEUED = 'scheduler.instruction_queued',
115
+ SCHEDULER_INSTRUCTION_DEQUEUED = 'scheduler.instruction_dequeued',
116
+
117
+ // 网络
118
+ NETWORK_REQUEST_SENT = 'network.request_sent',
119
+ NETWORK_RESPONSE_RECEIVED = 'network.response_received',
120
+ NETWORK_ERROR = 'network.error',
121
+
122
+ // 中断
123
+ INTERRUPT_REGISTERED = 'interrupt.registered',
124
+ INTERRUPT_DISPATCHED = 'interrupt.dispatched',
125
+ INTERRUPT_DEDUPLICATED = 'interrupt.deduplicated',
126
+
127
+ // 性能
128
+ PERFORMANCE_WARNING = 'performance.warning',
129
+ PERFORMANCE_BOTTLENECK = 'performance.bottleneck',
130
+ }
131
+
132
+ /**
133
+ * CPU 事件基础接口
134
+ */
135
+ export interface CPUEvent {
136
+ // 基础信息
137
+ eventId: string
138
+ eventType: CPUEventType
139
+ timestamp: number
140
+
141
+ // 指令上下文
142
+ instructionId: string
143
+ instructionType: string
144
+ correlationId: string
145
+
146
+ // 流水线状态
147
+ pipelineStage: PipelineStage
148
+ instructionStatus: InstructionStatus
149
+
150
+ // 性能指标
151
+ latency?: number // 该事件的延迟(相对于上一个事件)
152
+ duration?: number // 该阶段的持续时间
153
+
154
+ // 事件数据
155
+ payload: any
156
+
157
+ // 元数据
158
+ metadata?: {
159
+ resourceIds?: string[]
160
+ priority?: number
161
+ retryCount?: number
162
+ tags?: string[]
163
+ }
164
+ }
165
+
166
+ /**
167
+ * 特定事件类型的详细接口
168
+ */
169
+ export interface InstructionCreatedEvent extends CPUEvent {
170
+ eventType: CPUEventType.INSTRUCTION_CREATED
171
+ payload: {
172
+ instructionType: string
173
+ payload: any
174
+ origin: 'user' | 'system' | 'sse'
175
+ }
176
+ }
177
+
178
+ export interface OptimisticAppliedEvent extends CPUEvent {
179
+ eventType: CPUEventType.OPTIMISTIC_APPLIED
180
+ payload: {
181
+ snapshot: any
182
+ changes: any // 应用了什么变更
183
+ }
184
+ }
185
+
186
+ export interface OptimisticRolledBackEvent extends CPUEvent {
187
+ eventType: CPUEventType.OPTIMISTIC_ROLLED_BACK
188
+ payload: {
189
+ snapshot: any
190
+ reason: string
191
+ error?: Error
192
+ }
193
+ }
194
+
195
+ export interface SchedulerConflictEvent extends CPUEvent {
196
+ eventType: CPUEventType.SCHEDULER_CONFLICT_DETECTED
197
+ payload: {
198
+ conflictingInstructions: string[]
199
+ conflictingResources: string[]
200
+ waitTime: number
201
+ }
202
+ }
203
+
204
+ export interface NetworkRequestEvent extends CPUEvent {
205
+ eventType: CPUEventType.NETWORK_REQUEST_SENT
206
+ payload: {
207
+ method: string
208
+ url: string
209
+ headers: Record<string, string>
210
+ }
211
+ }
212
+
213
+ export interface NetworkResponseEvent extends CPUEvent {
214
+ eventType: CPUEventType.NETWORK_RESPONSE_RECEIVED
215
+ payload: {
216
+ status: number
217
+ latency: number
218
+ size: number
219
+ }
220
+ }
221
+
222
+ export interface PerformanceWarningEvent extends CPUEvent {
223
+ eventType: CPUEventType.PERFORMANCE_WARNING
224
+ payload: {
225
+ metric: 'latency' | 'throughput' | 'queue_depth'
226
+ threshold: number
227
+ actual: number
228
+ suggestion: string
229
+ }
230
+ }
231
+ ```
232
+
233
+ ### 2. CPUEventCollector (事件采集器)
234
+
235
+ ```typescript
236
+ /**
237
+ * CPU 事件采集器
238
+ *
239
+ * 职责:
240
+ * 1. 在流水线各阶段捕获事件
241
+ * 2. 批量异步发送给 CPULogger
242
+ * 3. 零侵入、零延迟
243
+ */
244
+ export class CPUEventCollector {
245
+ private eventQueue: CPUEvent[] = []
246
+ private flushInterval: number = 50 // 50ms 批量刷新
247
+ private maxBatchSize: number = 100
248
+ private enabled: boolean = true
249
+
250
+ /**
251
+ * 发送事件(异步,不阻塞流水线)
252
+ */
253
+ emit(event: Partial<CPUEvent>): void {
254
+ if (!this.enabled) return
255
+
256
+ const fullEvent: CPUEvent = {
257
+ eventId: this.generateEventId(),
258
+ timestamp: Date.now(),
259
+ ...event,
260
+ } as CPUEvent
261
+
262
+ this.eventQueue.push(fullEvent)
263
+
264
+ // 触发批量刷新
265
+ if (this.eventQueue.length >= this.maxBatchSize) {
266
+ this.flush()
267
+ }
268
+ }
269
+
270
+ /**
271
+ * 批量刷新事件
272
+ */
273
+ private flush(): void {
274
+ if (this.eventQueue.length === 0) return
275
+
276
+ const batch = this.eventQueue.splice(0, this.maxBatchSize)
277
+
278
+ // 异步发送给 Logger(使用 queueMicrotask 确保不阻塞)
279
+ queueMicrotask(() => {
280
+ cpuLogger.ingestBatch(batch)
281
+ })
282
+ }
283
+
284
+ /**
285
+ * 便捷方法:指令创建
286
+ */
287
+ onInstructionCreated(instruction: QueuedInstruction): void {
288
+ this.emit({
289
+ eventType: CPUEventType.INSTRUCTION_CREATED,
290
+ instructionId: instruction.id,
291
+ instructionType: instruction.type,
292
+ correlationId: instruction.context.correlationId,
293
+ pipelineStage: PipelineStage.IF,
294
+ instructionStatus: InstructionStatus.PENDING,
295
+ payload: {
296
+ instructionType: instruction.type,
297
+ payload: instruction.payload,
298
+ origin: 'user',
299
+ },
300
+ })
301
+ }
302
+
303
+ /**
304
+ * 便捷方法:乐观更新应用
305
+ */
306
+ onOptimisticApplied(
307
+ instructionId: string,
308
+ instructionType: string,
309
+ correlationId: string,
310
+ snapshot: any,
311
+ changes: any
312
+ ): void {
313
+ this.emit({
314
+ eventType: CPUEventType.OPTIMISTIC_APPLIED,
315
+ instructionId,
316
+ instructionType,
317
+ correlationId,
318
+ pipelineStage: PipelineStage.EX,
319
+ instructionStatus: InstructionStatus.EXECUTING,
320
+ payload: { snapshot, changes },
321
+ })
322
+ }
323
+
324
+ /**
325
+ * 便捷方法:乐观更新回滚
326
+ */
327
+ onOptimisticRolledBack(
328
+ instructionId: string,
329
+ instructionType: string,
330
+ correlationId: string,
331
+ snapshot: any,
332
+ reason: string,
333
+ error?: Error
334
+ ): void {
335
+ this.emit({
336
+ eventType: CPUEventType.OPTIMISTIC_ROLLED_BACK,
337
+ instructionId,
338
+ instructionType,
339
+ correlationId,
340
+ pipelineStage: PipelineStage.WB,
341
+ instructionStatus: InstructionStatus.FAILED,
342
+ payload: { snapshot, reason, error: error?.message },
343
+ metadata: { tags: ['rollback', 'failure'] },
344
+ })
345
+ }
346
+
347
+ /**
348
+ * 便捷方法:资源冲突检测
349
+ */
350
+ onSchedulerConflict(
351
+ instructionId: string,
352
+ instructionType: string,
353
+ correlationId: string,
354
+ conflictingInstructions: string[],
355
+ conflictingResources: string[],
356
+ waitTime: number
357
+ ): void {
358
+ this.emit({
359
+ eventType: CPUEventType.SCHEDULER_CONFLICT_DETECTED,
360
+ instructionId,
361
+ instructionType,
362
+ correlationId,
363
+ pipelineStage: PipelineStage.SCH,
364
+ instructionStatus: InstructionStatus.ISSUED,
365
+ payload: {
366
+ conflictingInstructions,
367
+ conflictingResources,
368
+ waitTime,
369
+ },
370
+ metadata: {
371
+ resourceIds: conflictingResources,
372
+ tags: ['conflict', 'scheduler'],
373
+ },
374
+ })
375
+ }
376
+
377
+ /**
378
+ * 便捷方法:网络请求
379
+ */
380
+ onNetworkRequest(
381
+ instructionId: string,
382
+ instructionType: string,
383
+ correlationId: string,
384
+ method: string,
385
+ url: string
386
+ ): void {
387
+ this.emit({
388
+ eventType: CPUEventType.NETWORK_REQUEST_SENT,
389
+ instructionId,
390
+ instructionType,
391
+ correlationId,
392
+ pipelineStage: PipelineStage.EX,
393
+ instructionStatus: InstructionStatus.EXECUTING,
394
+ payload: { method, url },
395
+ metadata: { tags: ['network'] },
396
+ })
397
+ }
398
+
399
+ /**
400
+ * 便捷方法:网络响应
401
+ */
402
+ onNetworkResponse(
403
+ instructionId: string,
404
+ instructionType: string,
405
+ correlationId: string,
406
+ status: number,
407
+ latency: number,
408
+ size: number
409
+ ): void {
410
+ this.emit({
411
+ eventType: CPUEventType.NETWORK_RESPONSE_RECEIVED,
412
+ instructionId,
413
+ instructionType,
414
+ correlationId,
415
+ pipelineStage: PipelineStage.RES,
416
+ instructionStatus: InstructionStatus.RESPONDED,
417
+ payload: { status, latency, size },
418
+ latency,
419
+ metadata: { tags: ['network'] },
420
+ })
421
+
422
+ // 🔥 自动检测性能警告
423
+ if (latency > 1000) {
424
+ this.emit({
425
+ eventType: CPUEventType.PERFORMANCE_WARNING,
426
+ instructionId,
427
+ instructionType,
428
+ correlationId,
429
+ pipelineStage: PipelineStage.RES,
430
+ instructionStatus: InstructionStatus.RESPONDED,
431
+ payload: {
432
+ metric: 'latency',
433
+ threshold: 1000,
434
+ actual: latency,
435
+ suggestion: `网络请求耗时 ${latency}ms,超过阈值 1000ms`,
436
+ },
437
+ metadata: { tags: ['performance', 'warning'] },
438
+ })
439
+ }
440
+ }
441
+
442
+ private generateEventId(): string {
443
+ return `evt_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`
444
+ }
445
+ }
446
+
447
+ export const cpuEventCollector = new CPUEventCollector()
448
+ ```
449
+
450
+ ### 3. CPULogger (日志记录器)
451
+
452
+ ```typescript
453
+ /**
454
+ * CPU 日志记录器
455
+ *
456
+ * 职责:
457
+ * 1. 存储和索引所有 CPU 事件
458
+ * 2. 提供强大的查询 API
459
+ * 3. 自动分析和聚合
460
+ */
461
+ export class CPULogger {
462
+ // 存储
463
+ private events: CPUEvent[] = []
464
+ private maxEvents: number = 10000 // 保留最近 10000 条事件
465
+
466
+ // 索引
467
+ private eventsByInstruction = new Map<string, CPUEvent[]>()
468
+ private eventsByCorrelation = new Map<string, CPUEvent[]>()
469
+ private eventsByType = new Map<CPUEventType, CPUEvent[]>()
470
+
471
+ // 统计
472
+ private stats = {
473
+ totalEvents: 0,
474
+ eventCounts: new Map<CPUEventType, number>(),
475
+ instructionCounts: new Map<string, number>(),
476
+ }
477
+
478
+ /**
479
+ * 批量接收事件
480
+ */
481
+ ingestBatch(events: CPUEvent[]): void {
482
+ for (const event of events) {
483
+ this.ingestEvent(event)
484
+ }
485
+ }
486
+
487
+ /**
488
+ * 接收单个事件
489
+ */
490
+ private ingestEvent(event: CPUEvent): void {
491
+ // 存储
492
+ this.events.push(event)
493
+ if (this.events.length > this.maxEvents) {
494
+ const removed = this.events.shift()!
495
+ this.removeFromIndexes(removed)
496
+ }
497
+
498
+ // 索引
499
+ this.addToIndex(this.eventsByInstruction, event.instructionId, event)
500
+ this.addToIndex(this.eventsByCorrelation, event.correlationId, event)
501
+ this.addToIndex(this.eventsByType, event.eventType, event)
502
+
503
+ // 统计
504
+ this.stats.totalEvents++
505
+ this.stats.eventCounts.set(
506
+ event.eventType,
507
+ (this.stats.eventCounts.get(event.eventType) || 0) + 1
508
+ )
509
+ this.stats.instructionCounts.set(
510
+ event.instructionType,
511
+ (this.stats.instructionCounts.get(event.instructionType) || 0) + 1
512
+ )
513
+ }
514
+
515
+ private addToIndex<K>(map: Map<K, CPUEvent[]>, key: K, event: CPUEvent): void {
516
+ if (!map.has(key)) {
517
+ map.set(key, [])
518
+ }
519
+ map.get(key)!.push(event)
520
+ }
521
+
522
+ private removeFromIndexes(event: CPUEvent): void {
523
+ // 从索引中移除(简化实现,实际可能需要更复杂的清理逻辑)
524
+ }
525
+
526
+ // ==================== 查询 API ====================
527
+
528
+ /**
529
+ * 查询:获取指令的完整事件链
530
+ */
531
+ getInstructionTrace(instructionId: string): CPUEvent[] {
532
+ return this.eventsByInstruction.get(instructionId) || []
533
+ }
534
+
535
+ /**
536
+ * 查询:获取 correlationId 的完整链路
537
+ */
538
+ getCorrelationTrace(correlationId: string): CPUEvent[] {
539
+ return this.eventsByCorrelation.get(correlationId) || []
540
+ }
541
+
542
+ /**
543
+ * 查询:按类型过滤事件
544
+ */
545
+ getEventsByType(type: CPUEventType): CPUEvent[] {
546
+ return this.eventsByType.get(type) || []
547
+ }
548
+
549
+ /**
550
+ * 查询:按指令类型过滤
551
+ */
552
+ getEventsByInstructionType(instructionType: string): CPUEvent[] {
553
+ return this.events.filter((e) => e.instructionType === instructionType)
554
+ }
555
+
556
+ /**
557
+ * 查询:按时间范围过滤
558
+ */
559
+ getEventsByTimeRange(startTime: number, endTime: number): CPUEvent[] {
560
+ return this.events.filter((e) => e.timestamp >= startTime && e.timestamp <= endTime)
561
+ }
562
+
563
+ /**
564
+ * 查询:按标签过滤
565
+ */
566
+ getEventsByTags(tags: string[]): CPUEvent[] {
567
+ return this.events.filter((e) => tags.some((tag) => e.metadata?.tags?.includes(tag)))
568
+ }
569
+
570
+ /**
571
+ * 高级查询:复杂条件
572
+ */
573
+ query(filter: {
574
+ instructionType?: string
575
+ eventType?: CPUEventType
576
+ pipelineStage?: PipelineStage
577
+ instructionStatus?: InstructionStatus
578
+ timeRange?: { start: number; end: number }
579
+ tags?: string[]
580
+ minLatency?: number
581
+ maxLatency?: number
582
+ }): CPUEvent[] {
583
+ let results = this.events
584
+
585
+ if (filter.instructionType) {
586
+ results = results.filter((e) => e.instructionType === filter.instructionType)
587
+ }
588
+
589
+ if (filter.eventType) {
590
+ results = results.filter((e) => e.eventType === filter.eventType)
591
+ }
592
+
593
+ if (filter.pipelineStage) {
594
+ results = results.filter((e) => e.pipelineStage === filter.pipelineStage)
595
+ }
596
+
597
+ if (filter.instructionStatus) {
598
+ results = results.filter((e) => e.instructionStatus === filter.instructionStatus)
599
+ }
600
+
601
+ if (filter.timeRange) {
602
+ results = results.filter(
603
+ (e) => e.timestamp >= filter.timeRange!.start && e.timestamp <= filter.timeRange!.end
604
+ )
605
+ }
606
+
607
+ if (filter.tags) {
608
+ results = results.filter((e) => filter.tags!.some((tag) => e.metadata?.tags?.includes(tag)))
609
+ }
610
+
611
+ if (filter.minLatency !== undefined) {
612
+ results = results.filter((e) => e.latency !== undefined && e.latency >= filter.minLatency!)
613
+ }
614
+
615
+ if (filter.maxLatency !== undefined) {
616
+ results = results.filter((e) => e.latency !== undefined && e.latency <= filter.maxLatency!)
617
+ }
618
+
619
+ return results
620
+ }
621
+
622
+ // ==================== 分析 API ====================
623
+
624
+ /**
625
+ * 分析:指令性能统计
626
+ */
627
+ analyzeInstructionPerformance(instructionType: string): {
628
+ count: number
629
+ successRate: number
630
+ avgLatency: number
631
+ p50: number
632
+ p95: number
633
+ p99: number
634
+ } {
635
+ const instructions = Array.from(this.eventsByInstruction.entries()).filter(
636
+ ([_, events]) => events[0]?.instructionType === instructionType
637
+ )
638
+
639
+ if (instructions.length === 0) {
640
+ return {
641
+ count: 0,
642
+ successRate: 0,
643
+ avgLatency: 0,
644
+ p50: 0,
645
+ p95: 0,
646
+ p99: 0,
647
+ }
648
+ }
649
+
650
+ const latencies: number[] = []
651
+ let successCount = 0
652
+
653
+ for (const [_, events] of instructions) {
654
+ const commitEvent = events.find((e) => e.eventType === CPUEventType.INSTRUCTION_COMMITTED)
655
+ const failEvent = events.find((e) => e.eventType === CPUEventType.INSTRUCTION_FAILED)
656
+
657
+ if (commitEvent) {
658
+ successCount++
659
+ const duration = commitEvent.timestamp - events[0].timestamp
660
+ latencies.push(duration)
661
+ } else if (failEvent) {
662
+ const duration = failEvent.timestamp - events[0].timestamp
663
+ latencies.push(duration)
664
+ }
665
+ }
666
+
667
+ latencies.sort((a, b) => a - b)
668
+
669
+ return {
670
+ count: instructions.length,
671
+ successRate: successCount / instructions.length,
672
+ avgLatency: latencies.reduce((a, b) => a + b, 0) / latencies.length || 0,
673
+ p50: this.percentile(latencies, 0.5),
674
+ p95: this.percentile(latencies, 0.95),
675
+ p99: this.percentile(latencies, 0.99),
676
+ }
677
+ }
678
+
679
+ /**
680
+ * 分析:资源冲突热点
681
+ */
682
+ analyzeResourceConflicts(): Array<{
683
+ resource: string
684
+ conflictCount: number
685
+ avgWaitTime: number
686
+ involvedInstructions: string[]
687
+ }> {
688
+ const conflicts = this.getEventsByType(CPUEventType.SCHEDULER_CONFLICT_DETECTED)
689
+
690
+ const resourceMap = new Map<
691
+ string,
692
+ { count: number; totalWait: number; instructions: Set<string> }
693
+ >()
694
+
695
+ for (const event of conflicts) {
696
+ const { conflictingResources, waitTime, conflictingInstructions } = event.payload
697
+
698
+ for (const resource of conflictingResources) {
699
+ if (!resourceMap.has(resource)) {
700
+ resourceMap.set(resource, {
701
+ count: 0,
702
+ totalWait: 0,
703
+ instructions: new Set(),
704
+ })
705
+ }
706
+
707
+ const entry = resourceMap.get(resource)!
708
+ entry.count++
709
+ entry.totalWait += waitTime
710
+ conflictingInstructions.forEach((id: string) => entry.instructions.add(id))
711
+ }
712
+ }
713
+
714
+ return Array.from(resourceMap.entries())
715
+ .map(([resource, data]) => ({
716
+ resource,
717
+ conflictCount: data.count,
718
+ avgWaitTime: data.totalWait / data.count,
719
+ involvedInstructions: Array.from(data.instructions),
720
+ }))
721
+ .sort((a, b) => b.conflictCount - a.conflictCount)
722
+ }
723
+
724
+ /**
725
+ * 分析:乐观更新回滚率
726
+ */
727
+ analyzeOptimisticRollbackRate(): {
728
+ totalOptimistic: number
729
+ rollbackCount: number
730
+ rollbackRate: number
731
+ byInstructionType: Record<string, { total: number; rollbacks: number; rate: number }>
732
+ } {
733
+ const appliedEvents = this.getEventsByType(CPUEventType.OPTIMISTIC_APPLIED)
734
+ const rolledBackEvents = this.getEventsByType(CPUEventType.OPTIMISTIC_ROLLED_BACK)
735
+
736
+ const byType: Record<string, { total: number; rollbacks: number; rate: number }> = {}
737
+
738
+ // 统计每种指令类型的乐观更新和回滚
739
+ for (const event of appliedEvents) {
740
+ if (!byType[event.instructionType]) {
741
+ byType[event.instructionType] = { total: 0, rollbacks: 0, rate: 0 }
742
+ }
743
+ byType[event.instructionType].total++
744
+ }
745
+
746
+ for (const event of rolledBackEvents) {
747
+ if (!byType[event.instructionType]) {
748
+ byType[event.instructionType] = { total: 0, rollbacks: 0, rate: 0 }
749
+ }
750
+ byType[event.instructionType].rollbacks++
751
+ }
752
+
753
+ // 计算回滚率
754
+ for (const type in byType) {
755
+ byType[type].rate = byType[type].rollbacks / byType[type].total
756
+ }
757
+
758
+ return {
759
+ totalOptimistic: appliedEvents.length,
760
+ rollbackCount: rolledBackEvents.length,
761
+ rollbackRate: rolledBackEvents.length / appliedEvents.length || 0,
762
+ byInstructionType: byType,
763
+ }
764
+ }
765
+
766
+ /**
767
+ * 分析:流水线吞吐量
768
+ */
769
+ analyzeThroughput(timeWindowMs: number = 60000): {
770
+ instructionsPerSecond: number
771
+ eventsPerSecond: number
772
+ avgPipelineUtilization: number
773
+ } {
774
+ const now = Date.now()
775
+ const startTime = now - timeWindowMs
776
+
777
+ const recentEvents = this.getEventsByTimeRange(startTime, now)
778
+ const instructionIds = new Set(recentEvents.map((e) => e.instructionId))
779
+
780
+ return {
781
+ instructionsPerSecond: (instructionIds.size / timeWindowMs) * 1000,
782
+ eventsPerSecond: (recentEvents.length / timeWindowMs) * 1000,
783
+ avgPipelineUtilization: 0, // TODO: 计算流水线利用率
784
+ }
785
+ }
786
+
787
+ /**
788
+ * 工具:计算百分位数
789
+ */
790
+ private percentile(values: number[], p: number): number {
791
+ if (values.length === 0) return 0
792
+ const index = Math.ceil(values.length * p) - 1
793
+ return values[index] || 0
794
+ }
795
+
796
+ /**
797
+ * 获取统计信息
798
+ */
799
+ getStats() {
800
+ return {
801
+ ...this.stats,
802
+ totalInstructions: this.eventsByInstruction.size,
803
+ totalCorrelations: this.eventsByCorrelation.size,
804
+ storageUsage: this.events.length,
805
+ maxStorage: this.maxEvents,
806
+ }
807
+ }
808
+
809
+ /**
810
+ * 导出数据(用于离线分析)
811
+ */
812
+ exportData(filter?: any): {
813
+ events: CPUEvent[]
814
+ stats: any
815
+ exportTime: number
816
+ } {
817
+ const events = filter ? this.query(filter) : this.events
818
+
819
+ return {
820
+ events,
821
+ stats: this.getStats(),
822
+ exportTime: Date.now(),
823
+ }
824
+ }
825
+
826
+ /**
827
+ * 清空数据
828
+ */
829
+ clear(): void {
830
+ this.events = []
831
+ this.eventsByInstruction.clear()
832
+ this.eventsByCorrelation.clear()
833
+ this.eventsByType.clear()
834
+ this.stats = {
835
+ totalEvents: 0,
836
+ eventCounts: new Map(),
837
+ instructionCounts: new Map(),
838
+ }
839
+ }
840
+ }
841
+
842
+ export const cpuLogger = new CPULogger()
843
+ ```
844
+
845
+ ### 4. CPUDebugger (调试器)
846
+
847
+ ```typescript
848
+ /**
849
+ * CPU 调试器
850
+ *
851
+ * 职责:
852
+ * 1. 提供调试器 API
853
+ * 2. 支持时间旅行调试
854
+ * 3. 支持指令重放
855
+ */
856
+ export class CPUDebugger {
857
+ /**
858
+ * 查询:执行最慢的指令
859
+ */
860
+ getSlowestInstructions(limit: number = 10): Array<{
861
+ instructionId: string
862
+ instructionType: string
863
+ duration: number
864
+ events: CPUEvent[]
865
+ }> {
866
+ const instructionTraces = Array.from(cpuLogger['eventsByInstruction'].entries())
867
+
868
+ const withDuration = instructionTraces.map(([instructionId, events]) => {
869
+ const firstEvent = events[0]
870
+ const lastEvent = events[events.length - 1]
871
+ const duration = lastEvent.timestamp - firstEvent.timestamp
872
+
873
+ return {
874
+ instructionId,
875
+ instructionType: firstEvent.instructionType,
876
+ duration,
877
+ events,
878
+ }
879
+ })
880
+
881
+ return withDuration.sort((a, b) => b.duration - a.duration).slice(0, limit)
882
+ }
883
+
884
+ /**
885
+ * 查询:失败的指令
886
+ */
887
+ getFailedInstructions(): Array<{
888
+ instructionId: string
889
+ instructionType: string
890
+ error: string
891
+ events: CPUEvent[]
892
+ }> {
893
+ const failEvents = cpuLogger.getEventsByType(CPUEventType.INSTRUCTION_FAILED)
894
+
895
+ return failEvents.map((failEvent) => ({
896
+ instructionId: failEvent.instructionId,
897
+ instructionType: failEvent.instructionType,
898
+ error: failEvent.payload?.error || 'Unknown error',
899
+ events: cpuLogger.getInstructionTrace(failEvent.instructionId),
900
+ }))
901
+ }
902
+
903
+ /**
904
+ * 查询:触发回滚的指令
905
+ */
906
+ getRolledBackInstructions(): Array<{
907
+ instructionId: string
908
+ instructionType: string
909
+ reason: string
910
+ events: CPUEvent[]
911
+ }> {
912
+ const rollbackEvents = cpuLogger.getEventsByType(CPUEventType.OPTIMISTIC_ROLLED_BACK)
913
+
914
+ return rollbackEvents.map((event) => ({
915
+ instructionId: event.instructionId,
916
+ instructionType: event.instructionType,
917
+ reason: event.payload.reason,
918
+ events: cpuLogger.getInstructionTrace(event.instructionId),
919
+ }))
920
+ }
921
+
922
+ /**
923
+ * 查询:资源冲突链
924
+ */
925
+ getResourceConflictChain(instructionId: string): Array<{
926
+ instructionId: string
927
+ instructionType: string
928
+ blockedBy: string[]
929
+ waitTime: number
930
+ }> {
931
+ const events = cpuLogger.getInstructionTrace(instructionId)
932
+ const conflictEvents = events.filter(
933
+ (e) => e.eventType === CPUEventType.SCHEDULER_CONFLICT_DETECTED
934
+ )
935
+
936
+ return conflictEvents.map((event) => ({
937
+ instructionId: event.instructionId,
938
+ instructionType: event.instructionType,
939
+ blockedBy: event.payload.conflictingInstructions,
940
+ waitTime: event.payload.waitTime,
941
+ }))
942
+ }
943
+
944
+ /**
945
+ * 时间旅行:重放指令
946
+ */
947
+ replayInstruction(instructionId: string): {
948
+ success: boolean
949
+ events: CPUEvent[]
950
+ timeline: Array<{ time: number; stage: string; event: string }>
951
+ } {
952
+ const events = cpuLogger.getInstructionTrace(instructionId)
953
+
954
+ const timeline = events.map((event) => ({
955
+ time: event.timestamp,
956
+ stage: event.pipelineStage,
957
+ event: event.eventType,
958
+ }))
959
+
960
+ return {
961
+ success: events.some((e) => e.eventType === CPUEventType.INSTRUCTION_COMMITTED),
962
+ events,
963
+ timeline,
964
+ }
965
+ }
966
+
967
+ /**
968
+ * 诊断:分析指令为什么慢
969
+ */
970
+ diagnoseSlowInstruction(instructionId: string): {
971
+ instructionId: string
972
+ totalDuration: number
973
+ bottleneck: { stage: string; duration: number; percentage: number }
974
+ breakdown: Array<{ stage: string; duration: number; percentage: number }>
975
+ suggestions: string[]
976
+ } {
977
+ const events = cpuLogger.getInstructionTrace(instructionId)
978
+ if (events.length === 0) {
979
+ throw new Error(`Instruction ${instructionId} not found`)
980
+ }
981
+
982
+ const firstEvent = events[0]
983
+ const lastEvent = events[events.length - 1]
984
+ const totalDuration = lastEvent.timestamp - firstEvent.timestamp
985
+
986
+ // 计算每个阶段的耗时
987
+ const stageBreakdown = new Map<string, number>()
988
+ for (let i = 1; i < events.length; i++) {
989
+ const prevEvent = events[i - 1]
990
+ const currEvent = events[i]
991
+ const duration = currEvent.timestamp - prevEvent.timestamp
992
+ const stage = `${prevEvent.pipelineStage}→${currEvent.pipelineStage}`
993
+ stageBreakdown.set(stage, (stageBreakdown.get(stage) || 0) + duration)
994
+ }
995
+
996
+ const breakdown = Array.from(stageBreakdown.entries())
997
+ .map(([stage, duration]) => ({
998
+ stage,
999
+ duration,
1000
+ percentage: (duration / totalDuration) * 100,
1001
+ }))
1002
+ .sort((a, b) => b.duration - a.duration)
1003
+
1004
+ const bottleneck = breakdown[0]
1005
+
1006
+ // 生成建议
1007
+ const suggestions: string[] = []
1008
+ if (bottleneck.stage.includes('EX')) {
1009
+ suggestions.push('网络请求耗时较长,考虑优化后端性能或使用缓存')
1010
+ }
1011
+ if (bottleneck.stage.includes('SCH')) {
1012
+ suggestions.push('调度器等待时间较长,存在资源冲突')
1013
+ }
1014
+ if (bottleneck.percentage > 80) {
1015
+ suggestions.push(
1016
+ `${bottleneck.stage} 占总耗时 ${bottleneck.percentage.toFixed(1)}%,是主要瓶颈`
1017
+ )
1018
+ }
1019
+
1020
+ return {
1021
+ instructionId,
1022
+ totalDuration,
1023
+ bottleneck,
1024
+ breakdown,
1025
+ suggestions,
1026
+ }
1027
+ }
1028
+
1029
+ /**
1030
+ * 实时监控:获取最近 N 秒的统计
1031
+ */
1032
+ getRealtimeStats(windowSeconds: number = 5): {
1033
+ instructionsPerSecond: number
1034
+ avgLatency: number
1035
+ errorRate: number
1036
+ topInstructionTypes: Array<{ type: string; count: number }>
1037
+ } {
1038
+ const now = Date.now()
1039
+ const startTime = now - windowSeconds * 1000
1040
+ const recentEvents = cpuLogger.getEventsByTimeRange(startTime, now)
1041
+
1042
+ const instructionIds = new Set(recentEvents.map((e) => e.instructionId))
1043
+ const failedIds = new Set(
1044
+ recentEvents
1045
+ .filter((e) => e.eventType === CPUEventType.INSTRUCTION_FAILED)
1046
+ .map((e) => e.instructionId)
1047
+ )
1048
+
1049
+ const latencies = recentEvents.filter((e) => e.latency !== undefined).map((e) => e.latency!)
1050
+
1051
+ const avgLatency = latencies.reduce((a, b) => a + b, 0) / latencies.length || 0
1052
+
1053
+ const typeCount = new Map<string, number>()
1054
+ for (const event of recentEvents) {
1055
+ if (event.eventType === CPUEventType.INSTRUCTION_CREATED) {
1056
+ typeCount.set(event.instructionType, (typeCount.get(event.instructionType) || 0) + 1)
1057
+ }
1058
+ }
1059
+
1060
+ const topInstructionTypes = Array.from(typeCount.entries())
1061
+ .map(([type, count]) => ({ type, count }))
1062
+ .sort((a, b) => b.count - a.count)
1063
+ .slice(0, 5)
1064
+
1065
+ return {
1066
+ instructionsPerSecond: instructionIds.size / windowSeconds,
1067
+ avgLatency,
1068
+ errorRate: failedIds.size / instructionIds.size || 0,
1069
+ topInstructionTypes,
1070
+ }
1071
+ }
1072
+ }
1073
+
1074
+ export const cpuDebugger = new CPUDebugger()
1075
+ ```
1076
+
1077
+ ---
1078
+
1079
+ ## 📊 调试器 UI 增强
1080
+
1081
+ ### 新增功能
1082
+
1083
+ 1. **性能分析面板**
1084
+ - 指令类型的平均耗时、P95、P99
1085
+ - 流水线各阶段的耗时分布
1086
+ - 热力图:指令执行密度
1087
+
1088
+ 2. **资源冲突可视化**
1089
+ - 依赖图:展示哪些指令在等待哪些资源
1090
+ - 冲突时间线:按时间展示资源冲突
1091
+ - 热点资源排行
1092
+
1093
+ 3. **乐观更新监控**
1094
+ - 回滚率统计
1095
+ - 回滚原因分类
1096
+ - 回滚指令详情
1097
+
1098
+ 4. **实时监控大屏**
1099
+ - 指令吞吐量(IPS)
1100
+ - 平均延迟
1101
+ - 错误率
1102
+ - 流水线利用率
1103
+
1104
+ 5. **指令查询器**
1105
+ - 高级过滤(类型、状态、时间范围、延迟)
1106
+ - 时间旅行:回放指令执行过程
1107
+ - 导出功能:导出查询结果为 JSON/CSV
1108
+
1109
+ 6. **诊断工具**
1110
+ - "为什么这个指令慢?" - 自动分析瓶颈
1111
+ - "为什么触发回滚?" - 回滚原因分析
1112
+ - "资源冲突链" - 追踪资源争用
1113
+
1114
+ ### UI 组件示例
1115
+
1116
+ ```vue
1117
+ <!-- src/views/CPUDebugView.vue -->
1118
+ <template>
1119
+ <div class="cpu-debug-view">
1120
+ <!-- 1. 实时监控 -->
1121
+ <section class="realtime-section">
1122
+ <h2>🎯 实时监控</h2>
1123
+ <div class="metrics-grid">
1124
+ <MetricCard
1125
+ title="指令吞吐量"
1126
+ :value="`${realtimeStats.instructionsPerSecond.toFixed(2)} IPS`"
1127
+ />
1128
+ <MetricCard title="平均延迟" :value="`${realtimeStats.avgLatency.toFixed(0)} ms`" />
1129
+ <MetricCard
1130
+ title="错误率"
1131
+ :value="`${(realtimeStats.errorRate * 100).toFixed(1)}%`"
1132
+ :variant="realtimeStats.errorRate > 0.05 ? 'danger' : 'success'"
1133
+ />
1134
+ </div>
1135
+ </section>
1136
+
1137
+ <!-- 2. 性能分析 -->
1138
+ <section class="performance-section">
1139
+ <h2>📊 性能分析</h2>
1140
+ <InstructionPerformanceTable :data="performanceData" />
1141
+ <PipelineStageChart :data="stageBreakdown" />
1142
+ </section>
1143
+
1144
+ <!-- 3. 资源冲突 -->
1145
+ <section class="conflict-section">
1146
+ <h2>⚠️ 资源冲突</h2>
1147
+ <ResourceConflictHeatmap :data="conflictHotspots" />
1148
+ </section>
1149
+
1150
+ <!-- 4. 乐观更新 -->
1151
+ <section class="optimistic-section">
1152
+ <h2>🔄 乐观更新</h2>
1153
+ <OptimisticRollbackStats :data="rollbackStats" />
1154
+ </section>
1155
+
1156
+ <!-- 5. 指令查询 -->
1157
+ <section class="query-section">
1158
+ <h2>🔍 指令查询</h2>
1159
+ <InstructionQueryBuilder @query="handleQuery" />
1160
+ <InstructionTraceViewer :traces="queryResults" />
1161
+ </section>
1162
+ </div>
1163
+ </template>
1164
+ ```
1165
+
1166
+ ---
1167
+
1168
+ ## 🚀 实施计划
1169
+
1170
+ ### Phase 1: 核心基础(1-2 天)
1171
+
1172
+ - [ ] 实现 `CPUEvent` 类型定义
1173
+ - [ ] 实现 `CPUEventCollector`
1174
+ - [ ] 实现 `CPULogger` 基础功能
1175
+ - [ ] 在流水线各阶段集成事件采集
1176
+
1177
+ ### Phase 2: 查询与分析(1-2 天)
1178
+
1179
+ - [ ] 完善 `CPULogger` 查询 API
1180
+ - [ ] 实现性能分析函数
1181
+ - [ ] 实现资源冲突分析
1182
+ - [ ] 实现乐观更新分析
1183
+
1184
+ ### Phase 3: 调试器(2-3 天)
1185
+
1186
+ - [ ] 实现 `CPUDebugger` 核心功能
1187
+ - [ ] 实现诊断工具
1188
+ - [ ] 实现时间旅行调试
1189
+ - [ ] 实现数据导出
1190
+
1191
+ ### Phase 4: UI 增强(2-3 天)
1192
+
1193
+ - [ ] 重构 `CPUDebugView.vue`
1194
+ - [ ] 实现性能分析面板
1195
+ - [ ] 实现资源冲突可视化
1196
+ - [ ] 实现指令查询器
1197
+ - [ ] 实现实时监控大屏
1198
+
1199
+ ### Phase 5: 优化与文档(1-2 天)
1200
+
1201
+ - [ ] 性能优化(批量处理、索引优化)
1202
+ - [ ] 编写使用文档
1203
+ - [ ] 编写最佳实践指南
1204
+ - [ ] 单元测试
1205
+
1206
+ ---
1207
+
1208
+ ## 📝 使用示例
1209
+
1210
+ ### 基础使用
1211
+
1212
+ ```typescript
1213
+ // 1. 在流水线中集成事件采集
1214
+ // src/cpu/stages/EX.ts
1215
+ export class ExecuteStage {
1216
+ async execute(instruction: QueuedInstruction): Promise<void> {
1217
+ // 记录执行开始
1218
+ cpuEventCollector.emit({
1219
+ eventType: CPUEventType.INSTRUCTION_EXECUTING,
1220
+ instructionId: instruction.id,
1221
+ instructionType: instruction.type,
1222
+ correlationId: instruction.context.correlationId,
1223
+ pipelineStage: PipelineStage.EX,
1224
+ instructionStatus: InstructionStatus.EXECUTING,
1225
+ })
1226
+
1227
+ // 应用乐观更新
1228
+ if (isa.optimistic?.enabled) {
1229
+ const snapshot = isa.optimistic.apply(instruction.payload, instruction.context)
1230
+
1231
+ cpuEventCollector.onOptimisticApplied(
1232
+ instruction.id,
1233
+ instruction.type,
1234
+ instruction.context.correlationId,
1235
+ snapshot,
1236
+ { /* 变更内容 */ }
1237
+ )
1238
+ }
1239
+
1240
+ // 执行网络请求
1241
+ cpuEventCollector.onNetworkRequest(
1242
+ instruction.id,
1243
+ instruction.type,
1244
+ instruction.context.correlationId,
1245
+ 'PATCH',
1246
+ '/api/tasks/123'
1247
+ )
1248
+
1249
+ const result = await executeRequest(...)
1250
+
1251
+ cpuEventCollector.onNetworkResponse(
1252
+ instruction.id,
1253
+ instruction.type,
1254
+ instruction.context.correlationId,
1255
+ 200,
1256
+ 125, // 延迟
1257
+ 1024 // 大小
1258
+ )
1259
+ }
1260
+ }
1261
+ ```
1262
+
1263
+ ### 调试器使用
1264
+
1265
+ ```typescript
1266
+ // 2. 在调试界面中使用
1267
+ import { cpuDebugger, cpuLogger } from '@/cpu/logging'
1268
+
1269
+ // 查询最慢的指令
1270
+ const slowest = cpuDebugger.getSlowestInstructions(10)
1271
+ console.log('最慢的 10 条指令:', slowest)
1272
+
1273
+ // 诊断慢指令
1274
+ const diagnosis = cpuDebugger.diagnoseSlowInstruction('instr_xxx')
1275
+ console.log('瓶颈分析:', diagnosis.bottleneck)
1276
+ console.log('建议:', diagnosis.suggestions)
1277
+
1278
+ // 分析性能
1279
+ const perf = cpuLogger.analyzeInstructionPerformance('task.update')
1280
+ console.log(`task.update 成功率: ${(perf.successRate * 100).toFixed(1)}%`)
1281
+ console.log(`平均延迟: ${perf.avgLatency.toFixed(0)}ms (P95: ${perf.p95.toFixed(0)}ms)`)
1282
+
1283
+ // 分析资源冲突
1284
+ const conflicts = cpuLogger.analyzeResourceConflicts()
1285
+ console.log('冲突最多的资源:', conflicts[0])
1286
+
1287
+ // 导出数据
1288
+ const data = cpuLogger.exportData({
1289
+ instructionType: 'schedule.update',
1290
+ timeRange: { start: Date.now() - 3600000, end: Date.now() },
1291
+ })
1292
+ console.log('导出数据:', data)
1293
+ ```
1294
+
1295
+ ---
1296
+
1297
+ ## 🎯 预期效果
1298
+
1299
+ 1. **零依赖**:完全独立的日志系统,不依赖旧 logger
1300
+ 2. **高性能**:异步批量处理,对流水线性能影响 < 1%
1301
+ 3. **强大查询**:支持复杂的过滤和聚合查询
1302
+ 4. **智能分析**:自动检测瓶颈、异常和性能问题
1303
+ 5. **可视化**:丰富的图表和交互式调试界面
1304
+ 6. **可导出**:支持导出数据进行离线分析
1305
+
1306
+ ---
1307
+
1308
+ ## 📚 参考资料
1309
+
1310
+ - Chrome DevTools Performance API
1311
+ - OpenTelemetry Tracing
1312
+ - AWS X-Ray
1313
+ - DataDog APM
1314
+
1315
+ ---
1316
+
1317
+ **作者**: AI Assistant
1318
+ **版本**: v1.0
1319
+ **日期**: 2025-10-15