Skip to content

Commit 367c362

Browse files
committed
TritonDataCenter#52 add support for stacked statemaps
TritonDataCenter#53 add vdev-statemap.d TritonDataCenter#54 add spa-sync-statemap.d TritonDataCenter#55 add license, README for icons
1 parent 6953c28 commit 367c362

15 files changed

+1048
-389
lines changed

README.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,18 @@ as input to the `statemap` command:
7474
<td>SmartOS</td>
7575
<td>PostgreSQL processes, with ZFS-specific states</td>
7676
</tr>
77+
<tr>
78+
<td><a href="./contrib/spa-sync-statemap.d">spa-sync-statemap.d</a></td>
79+
<td>DTrace</td>
80+
<td>SmartOS</td>
81+
<td>ZFS SPA sync thread state</td>
82+
</tr>
83+
<tr>
84+
<td><a href="./contrib/vdev-statemap.d">vdev-statemap.d</a></td>
85+
<td>DTrace</td>
86+
<td>SmartOS</td>
87+
<td>I/O activity by ZFS vdev</td>
88+
</tr>
7789
</table>
7890

7991
### Data format
@@ -117,7 +129,8 @@ second (the 1st element). The start time should be expressed in UTC.
117129
In addition, the metadata can contain the following optional fields are
118130
optional:
119131

120-
- `title`: The title of the statemap.
132+
- `title`: The title of the statemap, such that it can meaningfully be
133+
in the clause "statemap of `title` activity."
121134

122135
- `host`: The host on which the data was gathered.
123136

@@ -247,3 +260,22 @@ the zoomed statemap at the specified time. To clear the time, click on
247260
the time label above the statemap; to select another time, simply click
248261
on the statemap.
249262

263+
## Stacked statemaps
264+
265+
To render a single SVG that contains multiple statemaps, multiple data
266+
files can be provided:
267+
268+
statemap data-1.out data-2.out > statemap.svg
269+
270+
The resulting statemaps will be stacked in the order of the data files as
271+
provided on the command line, with the first data file dictating the time
272+
bounds of the resulting stack. The statemaps can be similar statemaps from
273+
dissimilar entities (e.g., different machines), or they can be dissimilar
274+
statemaps (e.g., different statemaps), or any mix of these. Legends for
275+
similar statemaps will be shared.
276+
277+
When statemaps are stacked, the coalescing factor applies to *each* statemap
278+
rather than to the entire stack of statemaps. When stacking many statemaps,
279+
low coalescing factors will be needed to prevent the resulting SVG from
280+
becoming excessively large.
281+

contrib/cpu-statemap-tagged.d

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ BEGIN
2525
wall = walltimestamp;
2626
printf("{\n\t\"start\": [ %d, %d ],\n",
2727
wall / 1000000000, wall % 1000000000);
28-
printf("\t\"title\": \"Statemap for CPU activity on %s\",\n",
29-
`utsname.nodename);
28+
printf("\t\"title\": \"CPU\",\n");
3029
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
3130
printf("\t\"entityKind\": \"CPU\",\n");
3231
printf("\t\"states\": {\n");

contrib/cpu-statemap.d

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ BEGIN
2424
wall = walltimestamp;
2525
printf("{\n\t\"start\": [ %d, %d ],\n",
2626
wall / 1000000000, wall % 1000000000);
27-
printf("\t\"title\": \"Statemap for CPU activity on %s\",\n",
28-
`utsname.nodename);
27+
printf("\t\"title\": \"CPU\",\n");
2928
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
3029
printf("\t\"states\": {\n");
3130

contrib/io-statemap.d

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#pragma D option quiet
88
#pragma D option destructive
99

10-
inline int STATE_MAXIO = 9;
10+
inline int STATE_MAXIO = 20;
1111

1212
#define STATE_METADATA(_state, _str, _color) \
1313
printf("\t\t\"%s\": {\"value\": %d, \"color\": \"%s\" }%s\n", \
@@ -18,21 +18,31 @@ BEGIN
1818
wall = walltimestamp;
1919
printf("{\n\t\"start\": [ %d, %d ],\n",
2020
wall / 1000000000, wall % 1000000000);
21-
printf("\t\"title\": \"Statemap for device I/O on %s\",\n",
22-
`utsname.nodename);
21+
printf("\t\"title\": \"disk I/O\",\n");
2322
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
2423
printf("\t\"states\": {\n");
2524

2625
STATE_METADATA(0, "no I/O", "#e0e0e0")
27-
STATE_METADATA(1, "1 I/O", "#ffffcc");
28-
STATE_METADATA(2, "2 I/Os", "#ffeda0");
29-
STATE_METADATA(3, "3 I/Os", "#fed976");
30-
STATE_METADATA(4, "4 I/Os", "#feb24c");
31-
STATE_METADATA(5, "5 I/Os", "#fd8d3c");
32-
STATE_METADATA(6, "6 I/Os", "#fc4e2a");
33-
STATE_METADATA(7, "7 I/Os", "#e31a1c");
34-
STATE_METADATA(8, "8 I/Os", "#bd0026");
35-
STATE_METADATA(STATE_MAXIO, ">8 I/Os", "#800026");
26+
STATE_METADATA(1, "1 I/O", "#DFE500");
27+
STATE_METADATA(2, "2 I/Os", "#DDD800");
28+
STATE_METADATA(3, "3 I/Os", "#DBCC01");
29+
STATE_METADATA(4, "4 I/Os", "#D9C002");
30+
STATE_METADATA(5, "5 I/Os", "#D8B403");
31+
STATE_METADATA(6, "6 I/Os", "#D6A804");
32+
STATE_METADATA(7, "7 I/Os", "#D49C05");
33+
STATE_METADATA(8, "8 I/Os", "#D39006");
34+
STATE_METADATA(9, "9 I/Os", "#D18407");
35+
STATE_METADATA(10, "10 I/Os", "#CF7808");
36+
STATE_METADATA(11, "11 I/Os", "#CE6C09");
37+
STATE_METADATA(12, "12 I/Os", "#CC600A");
38+
STATE_METADATA(13, "13 I/Os", "#CA540B");
39+
STATE_METADATA(14, "14 I/Os", "#C9480C");
40+
STATE_METADATA(15, "15 I/Os", "#C73C0D");
41+
STATE_METADATA(16, "16 I/Os", "#C5300E");
42+
STATE_METADATA(17, "17 I/Os", "#C4240F");
43+
STATE_METADATA(18, "18 I/Os", "#C21810");
44+
STATE_METADATA(19, "19 I/Os", "#C00C11");
45+
STATE_METADATA(STATE_MAXIO, ">=20 I/Os", "#BF0012");
3646

3747
printf("\t}\n}\n");
3848
start = timestamp;

contrib/lx-cmd-statemap.d

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ BEGIN
2828
wall = walltimestamp;
2929
printf("{\n\t\"start\": [ %d, %d ],\n",
3030
wall / 1000000000, wall % 1000000000);
31-
printf("\t\"title\": \"Statemap for all %s LX processes on %s\",\n",
32-
$$1, `utsname.nodename);
31+
printf("\t\"title\": \"all %s LX processes\",\n", $$1);
3332
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
3433
printf("\t\"states\": {\n");
3534

contrib/lx-statemap.d

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ BEGIN
2828
wall = walltimestamp;
2929
printf("{\n\t\"start\": [ %d, %d ],\n",
3030
wall / 1000000000, wall % 1000000000);
31-
printf("\t\"title\": \"Statemap for LX process ID %s on %s\",\n",
32-
$$1, `utsname.nodename);
31+
printf("\t\"title\": \"LX process ID %s\",\n", $$1);
3332
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
3433
printf("\t\"states\": {\n");
3534

contrib/postgres-statemap.d

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ BEGIN
2929
wall = walltimestamp;
3030
printf("{\n\t\"start\": [ %d, %d ],\n",
3131
wall / 1000000000, wall % 1000000000);
32-
printf("\t\"title\": \"PostgreSQL statemap on %s, by process ID\",\n",
33-
`utsname.nodename);
32+
printf("\t\"title\": \"PostgreSQL\",\n");
3433
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
3534
printf("\t\"entityKind\": \"Process\",\n");
3635
printf("\t\"states\": {\n");

contrib/postgres-zfs-statemap.d

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ BEGIN
3131
wall = walltimestamp;
3232
printf("{\n\t\"start\": [ %d, %d ],\n",
3333
wall / 1000000000, wall % 1000000000);
34-
printf("\t\"title\": \"PostgreSQL statemap on %s, by process ID\",\n",
35-
`utsname.nodename);
34+
printf("\t\"title\": \"PostgreSQL\",\n");
3635
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
3736
printf("\t\"entityKind\": \"Process\",\n");
3837
printf("\t\"states\": {\n");

contrib/spa-sync-statemap.d

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
#!/usr/sbin/dtrace -Cs
2+
3+
/*
4+
* Copyright 2018, Joyent, Inc.
5+
*/
6+
7+
#pragma D option quiet
8+
9+
typedef enum {
10+
STATE_ON_CPU = 0,
11+
STATE_OFF_CPU_WAITING,
12+
STATE_OFF_CPU_BLOCKED,
13+
STATE_OFF_CPU_ZIO_WAIT,
14+
STATE_OFF_CPU_ZIO_WAIT_MOS,
15+
STATE_OFF_CPU_ZIO_WAIT_SYNC,
16+
STATE_OFF_CPU_OBJSET_SYNC,
17+
STATE_OFF_CPU_CV,
18+
STATE_OFF_CPU_PREEMPTED,
19+
STATE_MAX
20+
} state_t;
21+
22+
#define STATE_METADATA(_state, _str, _color) \
23+
printf("\t\t\"%s\": {\"value\": %d, \"color\": \"%s\" }%s\n", \
24+
_str, _state, _color, _state < STATE_MAX - 1 ? "," : "");
25+
26+
BEGIN
27+
{
28+
wall = walltimestamp;
29+
printf("{\n\t\"start\": [ %d, %d ],\n",
30+
wall / 1000000000, wall % 1000000000);
31+
printf("\t\"title\": \"SPA sync\",\n");
32+
printf("\t\"host\": \"%s\",\n", `utsname.nodename);
33+
printf("\t\"entityKind\": \"SPA sync thread for pool\",\n");
34+
printf("\t\"states\": {\n");
35+
36+
STATE_METADATA(STATE_ON_CPU, "on-cpu", "#DAF7A6")
37+
STATE_METADATA(STATE_OFF_CPU_WAITING, "off-cpu-waiting", "#f9f9f9")
38+
STATE_METADATA(STATE_OFF_CPU_BLOCKED, "off-cpu-blocked", "#C70039")
39+
STATE_METADATA(STATE_OFF_CPU_ZIO_WAIT, "off-cpu-zio-wait", "#FFC300")
40+
STATE_METADATA(STATE_OFF_CPU_ZIO_WAIT_MOS,
41+
"off-cpu-zio-wait-mos", "#FF5733")
42+
STATE_METADATA(STATE_OFF_CPU_ZIO_WAIT_SYNC,
43+
"off-cpu-zio-wait-sync", "#BB8FCE")
44+
STATE_METADATA(STATE_OFF_CPU_OBJSET_SYNC,
45+
"off-cpu-objset-sync", "#338AFF")
46+
STATE_METADATA(STATE_OFF_CPU_CV, "off-cpu-cv", "#66FFCC")
47+
STATE_METADATA(STATE_OFF_CPU_PREEMPTED, "off-cpu-preempted", "#CCFF00")
48+
49+
printf("\t}\n}\n");
50+
start = timestamp;
51+
}
52+
53+
fbt::spa_sync:return
54+
{
55+
self->state = STATE_OFF_CPU_WAITING;
56+
}
57+
58+
fbt::spa_sync:entry
59+
{
60+
self->spa = args[0];
61+
self->state = STATE_ON_CPU;
62+
}
63+
64+
fbt::zio_wait:entry
65+
/self->spa != NULL && self->state == STATE_ON_CPU/
66+
{
67+
self->state = STATE_OFF_CPU_ZIO_WAIT;
68+
69+
}
70+
71+
fbt::zio_wait:return
72+
/self->state == STATE_OFF_CPU_ZIO_WAIT/
73+
{
74+
self->state = STATE_ON_CPU;
75+
}
76+
77+
fbt::vdev_config_sync:entry
78+
/self->state == STATE_ON_CPU/
79+
{
80+
self->state = STATE_OFF_CPU_ZIO_WAIT_SYNC;
81+
}
82+
83+
fbt::vdev_config_sync:return
84+
/self->state == STATE_OFF_CPU_ZIO_WAIT_SYNC/
85+
{
86+
self->state = STATE_ON_CPU;
87+
}
88+
89+
fbt::dsl_pool_sync_mos:entry
90+
/self->state == STATE_ON_CPU/
91+
{
92+
self->state = STATE_OFF_CPU_ZIO_WAIT_MOS;
93+
}
94+
95+
fbt::dsl_pool_sync_mos:return
96+
/self->state == STATE_OFF_CPU_ZIO_WAIT_MOS/
97+
{
98+
self->state = STATE_ON_CPU;
99+
}
100+
101+
fbt::dmu_objset_sync:entry
102+
/self->state == STATE_ON_CPU/
103+
{
104+
self->state = STATE_OFF_CPU_OBJSET_SYNC;
105+
}
106+
107+
fbt::dmu_objset_sync:return
108+
/self->state == STATE_OFF_CPU_OBJSET_SYNC/
109+
{
110+
self->state = STATE_ON_CPU;
111+
}
112+
113+
sched:::off-cpu
114+
/self->spa != NULL/
115+
{
116+
printf("{ \"time\": \"%d\", \"entity\": \"%s\", ",
117+
timestamp - start, self->spa->spa_name);
118+
119+
printf("\"state\": %d }\n",
120+
self->state != STATE_ON_CPU ? self->state :
121+
curthread->t_sobj_ops == NULL ? STATE_OFF_CPU_PREEMPTED :
122+
curthread->t_sobj_ops == &`cv_sobj_ops ? STATE_OFF_CPU_CV :
123+
STATE_OFF_CPU_BLOCKED);
124+
}
125+
126+
sched:::on-cpu
127+
/self->spa != NULL/
128+
{
129+
printf("{ \"time\": \"%d\", \"entity\": \"%s\", ",
130+
timestamp - start, self->spa->spa_name);
131+
printf("\"state\": %d }\n", STATE_ON_CPU);
132+
}
133+
134+
tick-1sec
135+
/timestamp - start > 300 * 1000000000/
136+
{
137+
exit(0);
138+
}
139+

0 commit comments

Comments
 (0)