Monitoring Block Collisions Using ^BLKCOL
A block collision occurs when a process is forced to wait for access to a block. Excessive block collisions slow application performance. This page describes how to monitor block collisions by using the ^BLKCOL utility.
Using ^BLKCOL
In InterSystems IRIS® data platform, the ^BLKCOL utility samples block collisions over a specified period (10 seconds by default), recording the latest block collision within a specified interval (10 milliseconds by default) during this time. For each recorded collision, ^BLKCOL identifies not only the block, but the global involved and its first and last references in the block, as well as the routine and line that created the process attempting to access the block.
The irisstat -D option, as described in Running irisstat with Options, also samples block collisions, but identifies only the blocks involved.
The output of irisstat -D is included in the reports generated by the ^SystemPerformance utility, as described in Monitoring Performance Using ^SystemPerformance.
When running ^BLKCOL, you can specify the following:
-
The length of the sampling period in seconds
-
The interval between samples in milliseconds
-
Whether to collect routine details (default is yes)
-
Whether to format the output as:
-
a list of the blocks with the highest collision counts (default)
-
a list of all blocks involved in collisions
-
comma-separated values from all block collisions detected, sorted and counted by block number and routine
-
comma-separated values from all block collisions detected, unsorted (raw)
-
a list of collision hot spots in routines
-
-
the number of blocks to display (if applicable)
-
whether to send output to a file
^BLKCOL Ouput
Use of the ^BLKCOL utility is shown in the following sample terminal session:
%SYS>do ^BLKCOL
Block Collision Analysis
How many seconds should we sample: <10>
How long to wait (ms) between each sample: <10>
Collect routine details? <Y>
Format for 'T'op counts, 'D'isplay all, 'S'orted CSV, 'H'ot spot, or 'R'aw CSV: <T>
Number of blocks to display: <10>
Output to file: <0>
Sampling ... (any key to interrupt)
625 block collisions in 735 samples.
Block # (count) - Global refs (first - last in block) - Routine refs (SFN)
767 (395) in c:\InterSystems\iris\mgr\user\
^acctest - ^acctest(10220," 167") (T/BPtr)
325 at ^AccessTest+156(4)
25 at ^AccessTest+121(4)
24 at ^AccessTest+92(4)
8 at ^AccessTest+109(4)
8 at ^AccessTest+127(4)
4 at ^AccessTest+170(4)
1 at ^AccessTest+163(4)
3890 (11) in c:\InterSystems\iris\mgr\user\
^acctest(2552," 371") - ^acctest(2552," 38") (Data)
6 at ^AccessTest+164(4)
3 at ^AccessTest+163(4)
1 at ^AccessTest+134(4)
1 at ^AccessTest+156(4)
15572 (9) in c:\InterSystems\iris\mgr\user\
^acctest(6980," 4795") - ^acctest(6988," 3259") (Data)
7 at ^AccessTest+134(4)
1 at ^AccessTest+164(4)
1 at ^AccessTest+170(4)
15818 (8) in c:\InterSystems\iris\mgr\user\
^acctest(9124," 173") - ^acctest(9124," 1743") (Data)
5 at ^AccessTest+164(4)
3 at ^AccessTest+170(4)
971 (7) in c:\InterSystems\iris\mgr\user\
^acctest(484," 3927") - ^acctest(484," 3938") (Data)
5 at ^AccessTest+170(4)
2 at ^AccessTest+164(4)
1137 (7) in c:\InterSystems\iris\mgr\user\
^acctest(756," 4063") - ^acctest(756," 4073") (Data)
3 at ^AccessTest+109(4)
2 at ^AccessTest+134(4)
1 at ^AccessTest+156(4)
1 at ^AccessTest+163(4)
2999 (7) in c:\InterSystems\iris\mgr\user\
^acctest(2092," 666") - ^acctest(2092," 674") (Data)
3 at ^AccessTest+170(4)
1 at ^AccessTest+109(4)
1 at ^AccessTest+121(4)
1 at ^AccessTest+134(4)
1 at ^AccessTest+164(4)
6173 (7) in c:\InterSystems\iris\mgr\user\
^acctest(3684," 528") - ^acctest(3684," 536") (Data)
3 at ^AccessTest+163(4)
1 at ^AccessTest+109(4)
1 at ^AccessTest+156(4)
1 at ^AccessTest+164(4)
1 at ^AccessTest+170(4)
14617 (7) in c:\InterSystems\iris\mgr\user\
^acctest(9688," 18") - ^acctest(9688," 26") (Data)
4 at ^AccessTest+170(4)
2 at ^AccessTest+164(4)
1 at ^AccessTest+134(4)
15282 (7) in c:\InterSystems\iris\mgr\user\
^acctest(8700," 4889") - ^acctest(8760," 1402") (Data)
4 at ^AccessTest+170(4)
3 at ^AccessTest+164(4)
%SYS>d ^BLKCOL
Block Collision Analysis
How many seconds should we sample: <10>
How long to wait (ms) between each sample: <10>
Collect routine details? <Y>
Format for 'T'op counts, 'D'isplay all, 'S'orted CSV, 'H'ot spot, or 'R'aw CSV: <T> H
Number of blocks to display: <10>
Output to file: <0>
Sampling ... (any key to interrupt)
571 block collisions in 768 samples.
Sorted by routine/line that waits for block ownership
_____________________________________________________
(571) AccessTest
(324) +156^AccessTest : s @G@($J,node)=$$getdata($E(Str,1,$r(1000))) ;SMLXXX+, AFH
(54) +164^AccessTest : k @G@($J,node)
(43) +134^AccessTest : . k @G@($J,node)
(31) +92^AccessTest : . . k @G@($j)
(28) +109^AccessTest : . s x=$O(@G@($J,x))
Sorted by routine that owns the block
_____________________________________
(472) AccessTest
(472) +AccessTest