事件监视器命名管道管理
使用某些事件监视器,您可以将事件数据写入到命名管道中。接下来的一些指南是关于如何高效使用命名管道事件监视器。
管道事件监视器允许通过命名管道处理事件监视数据流。如果需要实时处理事件记录,那么最好使用管道事件监视器。另一个很重要的优点是,应用程序在读完管道时可以忽略不想要的数据,从而可以大幅降低存储器要求。
在 AIX® 上,可使用 mkfifo 命令来创建命名管道。在 Linux 和其他 UNIX 类型(如 Solaris 操作系统)上,使用 pipe() 例程。在 Windows 上,可通过使用 CreateNamedPipe() 例程来创建命名管道。
将数据引导至管道时,I/O 总是会分块并且唯一的缓冲将由管道执行。在事件监视器写入事件数据时,将由监视应用程序迅速读取管道中的数据。如果事件监视器无法将数据写至管道(例如,因为管道已满),那么监视数据将会丢失。
此外,命名管道中必须有足够的空间用来处理入局事件记录。如果应用程序从命名管道读取数据时不够快,管道将填满并溢出。管道缓冲区越小,溢出的机率越大。
当发生管道溢出时,监视器将创建溢出事件记录以指示发生溢出。事件监视器不会关闭,但监视数据会丢失。如果释放监视器时存在明显的溢出事件记录,那么会记录诊断消息。否则,溢出事件记录可能时将写至管道。
一次可写至管道的数据量由底层操作系统确定。如果操作系统允许定义管道缓冲区的大小,那么使用的管道缓冲区至少应该为 32K。对于高容量事件监视器,应将监视应用程序的进程优先级设置为等于或高于代理进程优先级。
来自活动事件监视器或统计事件监视器的单次写操作的数据流包含的数据可多于写至命名管道的数据。在这类情况下,该数据流会分割为可装入到缓冲区中的块,每个块用头标识:第一个块用带有元素标识 SQLM_ELM_EVENT_STARTPIPEBLOCK 的逻辑头标识。最后一个块用带有元素标识 SQLM_ELM_EVENT_ENDPIPEBLOCK 的逻辑头标识。之间的所有块用带有元素标识 SQLM_ELM_EVENT_MIDPIPEBLOCK 的逻辑头标识。正读取该管道的监视应用程序必须识别这些头,并且将这些块重新聚集成完整数据流(根据需要剥离块头并重新聚集这些块以形成完整的有效数据流)。db2evmon 工具提供此功能;它提供写至命名管道的事件监视器为所有事件生成的有格式输出(根据需要重新聚集这些块)。如果只想处理所选事件或监视元素,那么可编写您自己的应用程序来完成此任务。