检测根节点争用

您可以分析 onstat -g spi 命令的输出来标识森林树索引可缓解的性能瓶颈。

要检测根节点争用并确定是否需要森林树索引:

  1. 运行 onstat -g spi | sort -nr 命令来显示有关具有长自旋的自旋锁定的信息。

    onstat -g spi 命令的输出显示具有等待的自旋锁定,当多个线程并发在某个索引中读取或写入且特定线程在第一次尝试获取锁定失败时,会发生这种情况。

  2. 分析 onstat -g spi 输出。查找这些列中的循环和等待信息:
    • Num Waits:线程等待自旋锁定的总次数。
    • Num Loops:线程成功获取自旋锁定之前的尝试总数。
    • Avg Loop/Wait:获取自旋锁定的平均尝试数,计算方式为 Num Loops / Num Waits
    例如,以下输出片段显示具有大量等待和循环的自旋锁定:
    Spin locks with waits:
    Num Waits   Num Loops   Avg Loop/Wait    Name
    332480    1568908   4.72  fast mutex, 3:bf[1234] 0x2d00008  0x1028a0d8000
    39722     498769    12.56 mutex lock, name = log
    20761     101831    4.90  fast mutex, 7:bf[62] 0x1300003  0x109da128000
    14818     77680     5.24  mutex lock, name = MGM mutex
    6523      34350     5.27  fast mutex, 3:bf[362] 0x20008e   0x10289a08000
  3. 查询 sysmaster:systabnames,其中部件号的十六进制表示法如 onstat -g spi 输出中所示。如果 tabname 表示索引名,那么该索引为森林树候选值。

    例如,运行此查询:

    echo "select tabname, hex(partnum) from systabnames
     where hex(partnum) =  '0x02d00008'" | dbaccess sysmaster -
    
    tabname       daily_market_idx
    (expression)  0x02d00008
    
    $ echo 'select tabname, hex(partnum) from systabnames'
     where hex(partnum) = 0x01300003 | dbaccess sysmaster -
    
    tabname       trade_history_idx
    (expression)  0x01300003
    
    $ echo 'select tabname, hex(partnum) from systabnames'
     where hex(partnum) = 0x0020008E | dbaccess sysmaster -
    
    tabname       trade_request_idx2
    (expression)  0x0020008E