3. PI Data Archive性能基线建立

PI Data Archive 的性能问题往往不是突然出现的,而是长期缓慢劣化的结果:归档文件持续增长、压缩效率下降、磁盘队列变长、查询响应变慢。如果没有一条可信的性能基线,运维人员很难判断“现在到底算不算慢”“这次调整有没有效果”。建立基线的核心,是在系统处于健康状态时,把关键计数器、存储结构状态和采集方法固定下来,形成可对比的参照。

一、先理解历史数据的存储机制

PI Data Archive 并不是把每个测量值都原样写入磁盘。它采用“事件 + 归档文件”的存储模型:每个 PI Point 的测量值称为一个事件(event),事件按时间顺序写入归档文件(Archive File)。归档文件是固定大小的预分配文件,默认常见大小为 2 GB 左右,由 ArchiveSize 等参数控制。当当前归档写满后,系统会切换到下一个归档文件,形成归档链(Archive Chain)。

每个事件在磁盘上并不只存一个浮点数,而是包含时间戳、数值、状态位以及指向同一 PI Point 前一个事件的引用。这种结构让 PI 能以极小的空间存储海量时序数据,但也意味着归档文件的读写是顺序追加为主、随机读取为辅的混合模式。因此,磁盘的持续写入能力和随机读延迟都会直接影响性能。

二、归档与压缩原理

PI 的压缩(Compression)发生在数据写入归档之前,目的是剔除“没有信息量”的冗余事件。它使用旋转门压缩算法(Swinging Door Trending,SDT):对每个 PI Point 设定一个压缩偏差(Compression Deviation)和压缩最大时间间隔(Compression Maximum)。当新事件落在由上一个保留事件和偏差构成的“旋转门”范围内时,该事件被丢弃;一旦超出范围,就保留该事件并重新开启新的门。

压缩偏差越大,保留的事件越少,归档增长越慢,但历史曲线越粗糙;偏差越小,保真度越高,归档消耗越快。压缩最大时间间隔则保证即使数值长期不变,也会按固定间隔留下一个事件,避免曲线出现“断点”。

与压缩容易混淆的是归档(Archive)。压缩决定“哪些事件值得写”,归档决定“写到哪里、写满后怎么办”。归档文件写满后切换,旧归档仍保留在磁盘上供历史查询。归档链过长、单个归档过大或磁盘剩余空间不足,都会导致写入延迟上升甚至停止归档。

PI Data Archive 事件写入、压缩与归档链路 接口/采集器 原始测量事件 旋转门压缩 SDT Compression Deviation Compression Maximum 事件队列 Event Queue 写入缓冲 归档文件链 Archive Chain 归档1 归档2 当前归档 门内事件被丢弃 不写入归档 基线采集的关键性能计数器(示例阈值仅作教学参考) 归档写入速率 Events/sec 写入量 事件队列长度 Queue 积压趋势 磁盘队列/延迟 Avg Disk Queue 归档剩余空间 Free Archive Space 压缩比 写入/保留事件比 查询响应时间 PI SDK 读取耗时 CPU / 内存占用 进程级资源 归档切换频率 Archive Shift

三、关键性能计数器

建立基线时,应围绕“写入—存储—读取”三条路径选择计数器,而不是把所有可用指标都抓一遍。以下是一组具有代表性的关键计数器:

  • 归档写入速率:单位时间写入归档的事件数,反映系统负载水平。若该值持续接近磁盘可持续写入上限,说明已接近瓶颈。
  • 事件队列长度:接口写入与归档落盘之间的缓冲。队列持续增长说明写入速度跟不上采集速度,常见原因是磁盘慢或压缩配置过松。
  • 磁盘队列长度与平均延迟:Windows 性能计数器 PhysicalDisk\Avg. Disk Queue Length 和 Avg. Disk sec/Write。队列长期大于 2、写延迟长期高于 20 ms,通常意味着存储层存在压力。
  • 归档剩余空间:当前归档文件剩余可写空间。剩余空间过小会导致频繁切换归档,增加 I/O 抖动。
  • 压缩比:写入事件数与实际保留事件数之比。压缩比突然下降,往往意味着压缩偏差被调小或数据波动加剧。
  • 查询响应时间:通过 PI SDK 或 PI DataLink 读取一段历史数据的耗时,反映读取路径的健康度。
  • CPU 与内存占用:PI Archive Subsystem、PI Snapshot Subsystem 等进程的资源消耗。

四、基线采集方法与工具

基线采集的关键是“固定条件、固定频率、固定口径”。建议在系统负载平稳的时段(例如夜间或非生产高峰)采集,并连续采集至少 7 天,覆盖工作日与周末,避免把偶发峰值当成常态。

采集工具可以组合使用:

  • Windows 性能监视器(PerfMon):采集磁盘、CPU、内存等系统级计数器,保存为 .blg 文件,便于长期对比。
  • PI System Management Tools(SMT):查看归档状态、归档链、事件队列、压缩配置等 PI 专有指标。
  • PI Performance Monitor:PI 自带的性能监控接口,可将 PI 内部计数器暴露给 PerfMon 或第三方监控。
  • PI SQL / PI Web API:对归档事件数、压缩比等做周期性统计,形成趋势数据。

一个可参考的采集配置示例如下:

采样间隔:60 秒
采集周期:连续 7 天
采集对象:
  - PhysicalDisk(_Total)\Avg. Disk Queue Length
  - PhysicalDisk(_Total)\Avg. Disk sec/Write
  - Processor(_Total)\% Processor Time
  - Memory\Available MBytes
  - PI Archive Subsystem\Events Written/sec
  - PI Archive Subsystem\Archive Free Space
输出格式:.blg + 每日 CSV 汇总

采集完成后,不要只看平均值。应同时记录 P50、P95 和最大值,并标注采集时的业务背景(如是否有批量补数、是否有接口重启)。这样在后续对比时,才能区分“基线本身波动”和“真实性能劣化”。

建立基线的目的不是追求“好看的数字”,而是形成一条可复现的参照线。只要采集条件一致,即使绝对值不完美,趋势对比依然有效。
不要在系统已经出现明显卡顿后才开始采集基线,此时得到的是“故障态”而非“健康态”。若确实没有历史基线,可先临时采集 24 小时作为过渡参照,并明确标注其局限性。

把上述计数器、采集周期和工具固定下来后,后续每次调整压缩偏差、扩容归档磁盘或升级接口,都可以用同一口径重新采集,并与基线逐项对比。这样,性能优化就从“凭感觉”变成了“有依据的验证”。