onstat -g spi 命令:打印使用长自旋的自旋锁

可以使用 onstat -g spi 命令显示有关使用长自旋的自旋锁的信息。

语法:

服务器中的许多资源由两个或更多的线程访问。在一些访问(诸如更新共享值)中,服务器必须确保每次只有一个线程在访问该资源。spin lock 是用来为一些资源提供互斥存取的机制。有了这类锁,在第一次尝试时由于另一个线程占用锁而没有成功获取锁的线程重复尝试获取锁,直至成功为止。

自旋锁的成本很低,而且自旋锁通常用于在短期内获取互斥的资源。然而,如果自旋锁被高度使用,那么循环重试机可能会变得更贵。

onstat -g spi 命令对于帮助识别由于高度使用自旋锁而形成的性能瓶颈很有帮助。该选项列出了带有等待的自旋锁,在线程第一次尝试时没有成功为其获取锁而循环重试的自旋锁。

示例输出

图: onstat -g spi 命令输出

              Spin locks with waits:
              
              Num Waits   Num Loops   Avg Loop/Wait    Name
              114         117675      1032.24          lockfr3
              87         256461      2947.83          fast mutex, lockhash[832]
              1             11        11.00          fast mutex, 1:bhash[16668]
              4          51831     12957.75          fast mutex, 1:lru-4
              1            490       490.00          fast mutex, 1:bf[994850] 0xe00002 0x14eb32000
            

输出描述

Num Waits (decimal)
为该自旋锁等待的线程总数
Num Loops (decimal)
在线程成功获取自旋锁前的尝试总数
Avg Loop/Wait (floating point)
用来获取自旋锁的尝试的平均数。以 Num Loops / Num Waits 计算
Name (string)
使用以下代码命名自旋锁:
lockfr
锁可用列表。lockfr 后的数字是锁可用列表数组中的索引。
lockhash[]
锁哈希桶。方括号内的字段是该锁哈希桶存储数组的索引
:bhash []
缓冲区哈希桶。冒号之前的字段是缓冲池的索引;方括号内在 bhash 之后的字段是该缓冲区哈希桶数组的索引
:lru-
LRU latch 。冒号之前的字段是缓冲池的索引;lru- 之后的字段标识缓冲区链对正在被使用
:bf[]
缓冲区 latch 。冒号之前的字段是缓冲池的索引;方括号内 bf 后的字段是该缓冲区数组的位置。接下来的两个字段分别是以十六进制表示的缓冲区内存的分区号和页头地址