Skip to content

统计与监控

kaven276 edited this page Jan 8, 2016 · 1 revision

采样时刻 ======有专门的采样程序连接 dispatcher 取得当前时间点的累积统计数据, 通过 pid+startTime 判断统计数据是否来自同一个 dispatcher 生命周期。

dispatcher 实现数据统计

统计归口到哪里?确认归到 client 中

每个 oSlot/client/total 的 对每个 oSlot 进行统计有没有意义呢? 因为每个 oSlot 都可以用于任何请求, 因此认为 oSlot 上面的统计信息没有意义。 对每个 client 进行统计有没有意义呢?有意义。 对每个 client cSlot 进行统计和对 oSlot 统一一样,也没有意义。

直接在 dispatcher 中记录计量的数据

  • 请求量
  • 请求和响应产生的数据流量,仅仅是通过 dispatcher 的
  • 请求处理总计时间(从收到请求第一个frame到收到响应结束frame)
  • 请求在db侧的总计时间
  • 在dispatcher等待oSlot的时间

需要进一步解析标识的统计量

  • get/post 请求数量
  • 只读请求/写请求的分别数量 上述内容可能需要在 handlerHTTP 中统计 间接通过 dispatcher 获得 比较复杂

需要 db 侧配合的

  • db 侧的结束包增加包体,包含统计信息
    • db time
    • cpu time
    • idle time
    • responde time 然后 dispatcher 将上述信息进行汇总

执行时间的刨除问题

  • in db pipe wait
  • in db call out response wait
  • repeated call-out wait

特别的

  • 执行时间超过时限(通常是3s)的请求的数量

监控客户端的状态信息 (DBDriver)

当前的 queue length, 等待 cSlot,开始等待时间,等待时长, 获取所有非空闲的 cSlot,看看他们的时间, 包括占用cSlot的时间,发送请求结束frame的时间,等待响应的时间。 用于发现一些长期没有响应回复的情况。 可能发现的问题:

  1. 占用 cSlot 后,长期没有向dispatcher发送请求结束,导致 cSlot 被长期占用
  2. 占用 cSlot 后,也发送了请求给 dispatcher,但是长期没有响应
  • 如果是 OSP 异常退出,导致永远不能响应,那么应该由 dispatcher 识别发现并通知 client 释放资源
  • 如果仅仅是 servlet 执行时间长,那么可以等
  1. 占用 cSlot 后,也有了响应,但是响应结束总不到达 处理规则同上(第2条)

要看 OSP 进程被 kill 是否会发送 socket end/fin 包, 或者 kill session 是否会发送 socket end/fin 包。

active socket 上如果 OSP 服务端异常, 那么

实时状态信息

每个 oSlot 当前处于 free 还是 busy,busy 的话, 正在执行什么? 这个完全可以在 oracle 侧通过设置 v$session 中的 module/action 来实现, 这样可以方便的通过 v$session 查看状态。 这样就不必在 dispatcher 中拆包查看当前目的程序。

可以考虑对每个来自客户端的head frame现在dispatcher中保存, 这样如果有监控需求的话, 就可以轻易的将入参全部显示出来。 但是这样会增加 dispatcher的内存开销。 特别是对于大表单提交大量数据的情况。

比如如果头部有 1000 字节,共有 100 个并发,就要占用 100K 空间, 其实也不是特别大。 另外大表单的占比也不会特别大。

这样对于实时状态监控就有的放矢了。 但是当oSlot比较多的时候, 监控程序一揽子

考虑增加 meta frame

请求头中增加关于 cache 方面的信息,

这样 dispatcher cache 可以判断是否直接返回 cache 中的信息。包括:

  • 资源 ID
  • vary 每个资源ID和vary组合构成一个唯一的可缓存资源

响应头中增加关于性能计量方面的信息

包括 db-time cpu-time wait-time idle-time 等等信息

noradle 应用使用单独的 service,用于 oracle 内置的性能统计

repeated NDBC call 的性能计量问题

系统必须能够识别出是否调用的是 repeated NDBC call。 同时,servlet 中进行同步call-out等待外部回复的时间应该从计量中排除, 不作为 db 压力的一部分。

考虑完全靠 oracle 自己的性能统计来对 noradle 程序进行测量

  • 一方面利用 hprof
  • 一方面利用 snapshot
  • 利用 v$session_long_ops