1-- Maps non-aggregated Blink GC events in timeline to telemetry friendly 2-- names. 3-- 4-- This includes the old style or the new naming scheme one which only occur on 5-- the main thread. 6DROP VIEW IF EXISTS blink_non_aggregated_gc_event_name; 7CREATE VIEW blink_non_aggregated_gc_event_name AS 8SELECT 9 'BlinkGC.AtomicPauseMarkEpilogue' AS name, 10 'blink-gc-atomic-pause-mark-epilogue' AS old_event_name, 11 'blink:gc:main_thread:cycle:full:atomic:mark:epilogue' AS new_event_name 12UNION ALL 13SELECT 14 'BlinkGC.AtomicPauseMarkPrologue', 15 'blink-gc-atomic-pause-mark-prologue', 16 'blink:gc:main_thread:cycle:full:atomic:mark:prologue' 17UNION ALL 18SELECT 19 'BlinkGC.AtomicPauseMarkRoots', 20 'blink-gc-atomic-pause-mark-roots', 21 'blink:gc:main_thread:cycle:full:atomic:mark:roots' 22UNION ALL 23SELECT 24 'BlinkGC.IncrementalMarkingStartMarking', 25 'blink-gc-incremental-start', 26 'blink:gc:main_thread:cycle:full:incremental:mark:start' 27UNION ALL 28SELECT 29 'BlinkGC.IncrementalMarkingStep', 30 'blink-gc-incremental-step', 31 'blink:gc:main_thread:cycle:full:incremental:mark:step' 32UNION ALL 33SELECT 34 'BlinkGC.UnifiedMarkingStep', 35 'blink-gc-unified-marking-by-v8', 36 'unified:gc:main_thread:cycle:full:mark:step' 37UNION ALL 38SELECT 39 'BlinkGC.CompleteSweep', 40 'blink-gc-complete-sweep', 41 'blink:gc:main_thread:cycle:full:sweep:complete' 42UNION ALL 43SELECT 44 'BlinkGC.LazySweepInIdle', 45 'blink-gc-sweep-task-foreground', 46 'blink:gc:main_thread:cycle:full:sweep:idle' 47UNION ALL 48SELECT 49 'BlinkGC.LazySweepOnAllocation', 50 'blink-gc-sweep-allocation', 51 'blink:gc:main_thread:cycle:full:sweep:on_allocation' 52UNION ALL 53SELECT 54 'BlinkGC.AtomicPauseSweepAndCompact' AS name, 55 'blink-gc-atomic-pause-sweep-and-compact' AS old_event_name, 56 'blink:gc:main_thread:cycle:full:atomic:sweep:compact' AS new_event_name; 57 58-- Get all the slices we care about. These are ones that start with V8.GC or 59-- BlinkGC. If you need more you need to modify the where clause for 60-- blink_gc_cpu_slice. 61DROP TABLE IF EXISTS blink_gc_cpu_slice; 62CREATE TABLE blink_gc_cpu_slice AS 63SELECT 64 CASE WHEN dur != 0 THEN cpuDurNs/1e6 ELSE 0.0 END AS cpuDurMs, 65 * 66FROM ( 67 SELECT 68 COALESCE(EXTRACT_ARG(arg_set_id, 'debug.forced'), FALSE) OR 69 -- This subquery replaces 70 -- metrics.v8.utils.isForcedGarbageCollectionEvent(event) 71 ( 72 SELECT 73 id 74 FROM ANCESTOR_SLICE(slice.id) AS ancestor 75 WHERE ancestor.name = 'V8.GCLowMemoryNotification' LIMIT 1 76 ) IS NOT NULL AS forced, 77 -- upid replaces pid, because its more fool proof ensuring uniqueness. 78 thread.upid || ':' || EXTRACT_ARG(arg_set_id, 'debug.epoch') AS epoch, 79 slice.thread_dur AS cpuDurNs, 80 slice.* 81 FROM thread_slice as slice 82 INNER JOIN thread_track ON slice.track_id = thread_track.id 83 INNER JOIN thread ON thread_track.utid = thread.id 84 WHERE 85 slice.dur >= 0 AND ( 86 slice.name GLOB "V8.GC*" OR (slice.name GLOB "BlinkGC*" AND NOT forced) 87 ) 88); 89 90-- This grabs all the single events for "BlinkGC.*", and restricts to only 91-- forced events. 92DROP TABLE IF EXISTS blink_slice; 93CREATE TABLE blink_slice AS 94SELECT 95 event_name.old_event_name AS blink_non_aggregated_gc_event_name, 96 event_name.new_event_name AS blink_non_aggregated_gc_events_new_name, 97 blink_gc_cpu_slice.* 98FROM 99 blink_gc_cpu_slice LEFT JOIN 100 blink_non_aggregated_gc_event_name AS event_name ON 101 event_name.name = blink_gc_cpu_slice.name 102WHERE 103 blink_gc_cpu_slice.name GLOB "BlinkGC*" AND NOT forced; 104 105-- This groups all the events by name and epoch for from "blink_slice" for easy 106-- access. 107DROP TABLE IF EXISTS blink_per_epoch_slice; 108CREATE TABLE blink_per_epoch_slice AS 109SELECT 110 name, 111 epoch, 112 blink_non_aggregated_gc_event_name, 113 blink_non_aggregated_gc_events_new_name, 114 SUM(cpuDurMs) AS cpuDurPerEpochMs 115FROM blink_slice 116GROUP BY 1, 2, 3, 4; 117 118-- All events that should be summed up to 'blink-gc-mark-roots'. 119DROP VIEW IF EXISTS blink_top_gc_roots_marking_event; 120CREATE VIEW blink_top_gc_roots_marking_event AS 121SELECT * FROM blink_slice WHERE name in ( 122 'BlinkGC.VisitRoots' 123); 124 125-- All events that should be summed up to 126-- 'blink-gc-atomic-pause-mark-transitive-closure'. 127DROP VIEW IF EXISTS blink_gc_atomic_pause_transitive_closure_event; 128CREATE VIEW blink_gc_atomic_pause_transitive_closure_event AS 129SELECT * FROM blink_slice WHERE name in ( 130 'BlinkGC.AtomicPauseMarkTransitiveClosure' 131); 132 133-- All events that should be summed up to 'blink-gc-mark-transitive-closure'. 134DROP VIEW IF EXISTS blink_gc_foreground_marking_transitive_closure_event; 135CREATE VIEW 136 blink_gc_foreground_marking_transitive_closure_event AS 137SELECT * FROM blink_slice WHERE name in ( 138 'BlinkGC.AtomicPauseMarkTransitiveClosure', 139 'BlinkGC.IncrementalMarkingStep', 140 'BlinkGC.UnifiedMarkingStep' 141); 142 143-- Names of Blink GC foreground marking events in timeline. 144DROP VIEW IF EXISTS blink_top_gc_foreground_marking_event; 145CREATE VIEW blink_top_gc_foreground_marking_event AS 146SELECT * FROM blink_slice WHERE name in ( 147 'BlinkGC.AtomicPauseMarkEpilogue', 148 'BlinkGC.AtomicPauseMarkPrologue', 149 'BlinkGC.AtomicPauseMarkRoots', 150 'BlinkGC.IncrementalMarkingStartMarking' 151) 152UNION ALL 153SELECT * FROM blink_gc_foreground_marking_transitive_closure_event; 154 155-- Names of Blink GC foreground marking events in timeline. 156DROP VIEW IF EXISTS blink_gc_forced_foreground_marking_event; 157CREATE VIEW blink_gc_forced_foreground_marking_event AS 158SELECT * FROM blink_slice WHERE name in ( 159 'BlinkGC.AtomicPauseMarkEpilogue', 160 'BlinkGC.AtomicPauseMarkPrologue', 161 'BlinkGC.AtomicPauseMarkRoots', 162 'BlinkGC.IncrementalMarkingStartMarking', 163 'BlinkGC.MarkBailOutObjects', 164 'BlinkGC.MarkFlushV8References', 165 'BlinkGC.MarkFlushEphemeronPairs' 166); 167 168-- Names of Blink GC background marking events in timeline. 169DROP VIEW IF EXISTS blink_top_gc_background_marking_event; 170CREATE VIEW blink_top_gc_background_marking_event AS 171SELECT * FROM blink_slice WHERE name in ( 172 'BlinkGC.ConcurrentMarkingStep' 173); 174 175-- Names of Blink GC foreground sweeping events in timeline. 176DROP VIEW IF EXISTS blink_top_gc_foreground_sweeping_event; 177CREATE VIEW blink_top_gc_foreground_sweeping_event AS 178SELECT * FROM blink_slice WHERE name in ( 179 'BlinkGC.CompleteSweep', 180 'BlinkGC.LazySweepInIdle', 181 'BlinkGC.LazySweepOnAllocation' 182); 183 184-- Names of Blink GC background sweeping events in timeline. 185DROP VIEW IF EXISTS blink_top_gc_background_sweeping_event; 186CREATE VIEW blink_top_gc_background_sweeping_event AS 187SELECT * FROM blink_slice WHERE name in ( 188 'BlinkGC.ConcurrentSweepingStep' 189); 190 191-- Names of all Blink Unified GC events in timeline. 192DROP VIEW IF EXISTS blink_top_gc_event; 193CREATE VIEW blink_top_gc_event AS 194SELECT * FROM blink_slice WHERE name in ( 195 SELECT name FROM blink_non_aggregated_gc_event_name 196) OR name in ( 197 SELECT name FROM blink_gc_atomic_pause_transitive_closure_event 198); 199 200-- All events that should be summed up to 'blink-gc-atomic-pause'. Note that 201-- this events need to have an epoch counter in args.epoch. 202DROP VIEW IF EXISTS atomic_pause_event; 203CREATE VIEW atomic_pause_event AS 204SELECT * FROM blink_slice WHERE name in ( 205 'BlinkGC.AtomicPauseMarkEpilogue', 206 'BlinkGC.AtomicPauseMarkPrologue', 207 'BlinkGC.AtomicPauseMarkRoots', 208 'BlinkGC.AtomicPauseMarkTransitiveClosure', 209 'BlinkGC.AtomicPauseSweepAndCompact' 210); 211 212-- This is a more complex variable so benefits from additional comments so we 213-- pull it out of the proto filling. 214DROP VIEW IF EXISTS unified_gc_total; 215CREATE VIEW unified_gc_total AS 216SELECT 217 * 218FROM blink_gc_cpu_slice 219WHERE ( 220 -- This subclause replaces 221 -- metrics.v8.utils.isNotForcedTopGarbageCollectionEvent() 222 223 -- These names are found in isTopGarbageCollectionEvent(). 224 name in ( 225 'V8.GCCompactor', 226 'V8.GCFinalizeMC', 227 'V8.GCFinalizeMCReduceMemory', 228 'V8.GCIncrementalMarking', 229 'V8.GCIncrementalMarkingFinalize', 230 'V8.GCIncrementalMarkingStart', 231 'V8.GCPhantomHandleProcessingCallback', 232 'V8.GCScavenger' 233 ) AND ( 234 -- This replaces isForcedGarbageCollectionEvent. 235 SELECT name FROM ANCESTOR_SLICE(blink_gc_cpu_slice.id) AS ancestor 236 WHERE ancestor.name == 'V8.GCLowMemoryNotification' 237 LIMIT 1 238 ) IS NULL 239) OR ( 240 -- This subclause replaces isNonNestedNonForcedBlinkGarbageCollectionEvent(). 241 name IN ( 242 -- This subquery replaces isNonForcedBlinkGarbageCollectionEvent(). 243 SELECT name FROM blink_top_gc_event 244 ) AND ( 245 -- This subquery replaces metrics.v8.utils.isGarbageCollectionEvent(). 246 SELECT name FROM ANCESTOR_SLICE(blink_gc_cpu_slice.id) AS ancestor 247 WHERE 248 ancestor.name GLOB "V8.GC*" AND 249 ancestor.name != 'V8.GCLowMemoryNotification' 250 LIMIT 1 251 ) IS NULL 252); 253 254-- This table name is just "file_name" + "_output" used by TBMv3 to know which 255-- view to extract the proto BlinkGcMetric out of. 256DROP VIEW IF EXISTS blink_gc_metric_output; 257CREATE VIEW blink_gc_metric_output AS 258SELECT BlinkGcMetric( 259 'blink_gc_atomic_pause_mark_epilogue', 260 ( 261 SELECT 262 RepeatedField(cpuDurMs) 263 FROM blink_slice 264 WHERE 265 blink_non_aggregated_gc_event_name = 'blink-gc-atomic-pause-mark-epilogue' 266 ), 267 'blink_gc_main_thread_cycle_full_atomic_mark_epilogue', 268 ( 269 SELECT 270 RepeatedField(cpuDurPerEpochMs) 271 FROM blink_per_epoch_slice 272 WHERE 273 blink_non_aggregated_gc_events_new_name = 274 'blink:gc:main_thread:cycle:full:atomic:mark:epilogue' 275 ), 276 'blink_gc_atomic_pause_mark_prologue', 277 ( 278 SELECT 279 RepeatedField(cpuDurMs) 280 FROM blink_slice 281 WHERE 282 blink_non_aggregated_gc_event_name = 283 'blink-gc-atomic-pause-mark-prologue' 284 ), 285 'blink_gc_main_thread_cycle_full_atomic_mark_prologue', 286 ( 287 SELECT 288 RepeatedField(cpuDurPerEpochMs) 289 FROM blink_per_epoch_slice 290 WHERE 291 blink_non_aggregated_gc_events_new_name = 292 'blink:gc:main_thread:cycle:full:atomic:mark:prologue' 293 ), 294 'blink_gc_atomic_pause_mark_roots', 295 ( 296 SELECT 297 RepeatedField(cpuDurMs) 298 FROM blink_slice 299 WHERE 300 blink_non_aggregated_gc_event_name = 'blink-gc-atomic-pause-mark-roots' 301 ), 302 'blink_gc_main_thread_cycle_full_atomic_mark_roots', 303 ( 304 SELECT 305 RepeatedField(cpuDurPerEpochMs) 306 FROM blink_per_epoch_slice 307 WHERE 308 blink_non_aggregated_gc_events_new_name = 309 'blink:gc:main_thread:cycle:full:atomic:mark:roots' 310 ), 311 'blink_gc_atomic_pause_sweep_and_compact', 312 ( 313 SELECT 314 RepeatedField(cpuDurMs) 315 FROM blink_slice 316 WHERE 317 blink_non_aggregated_gc_event_name = 318 'blink-gc-atomic-pause-sweep-and-compact' 319 ), 320 'blink_gc_main_thread_cycle_full_atomic_sweep_compact', 321 ( 322 SELECT 323 RepeatedField(cpuDurPerEpochMs) 324 FROM blink_per_epoch_slice 325 WHERE 326 blink_non_aggregated_gc_events_new_name = 327 'blink:gc:main_thread:cycle:full:atomic:sweep:compact' 328 ), 329 'blink_gc_complete_sweep', 330 ( 331 SELECT 332 RepeatedField(cpuDurMs) 333 FROM blink_slice 334 WHERE blink_non_aggregated_gc_event_name = 'blink-gc-complete-sweep' 335 ), 336 'blink_gc_main_thread_cycle_full_sweep_complete', 337 ( 338 SELECT 339 RepeatedField(cpuDurPerEpochMs) 340 FROM blink_per_epoch_slice 341 WHERE 342 blink_non_aggregated_gc_events_new_name = 343 'blink:gc:main_thread:cycle:full:sweep:complete' 344 ), 345 'blink_gc_incremental_start', 346 ( 347 SELECT 348 RepeatedField(cpuDurMs) 349 FROM blink_slice 350 WHERE blink_non_aggregated_gc_event_name = 'blink-gc-incremental-start' 351 ), 352 'blink_gc_main_thread_cycle_full_incremental_mark_start', 353 ( 354 SELECT 355 RepeatedField(cpuDurPerEpochMs) 356 FROM blink_per_epoch_slice 357 WHERE 358 blink_non_aggregated_gc_events_new_name = 359 'blink:gc:main_thread:cycle:full:incremental:mark:start' 360 ), 361 'blink_gc_incremental_step', 362 ( 363 SELECT 364 RepeatedField(cpuDurMs) 365 FROM blink_slice 366 WHERE blink_non_aggregated_gc_event_name = 'blink-gc-incremental-step' 367 ), 368 'blink_gc_main_thread_cycle_full_incremental_mark_step', 369 ( 370 SELECT 371 RepeatedField(cpuDurPerEpochMs) 372 FROM blink_per_epoch_slice 373 WHERE 374 blink_non_aggregated_gc_events_new_name = 375 'blink:gc:main_thread:cycle:full:incremental:mark:step' 376 ), 377 'blink_gc_sweep_allocation', 378 ( 379 SELECT 380 RepeatedField(cpuDurMs) 381 FROM blink_slice 382 WHERE blink_non_aggregated_gc_event_name = 'blink-gc-sweep-allocation' 383 ), 384 'blink_gc_main_thread_cycle_full_sweep_on_allocation', 385 ( 386 SELECT 387 RepeatedField(cpuDurPerEpochMs) 388 FROM blink_per_epoch_slice 389 WHERE 390 blink_non_aggregated_gc_events_new_name = 391 'blink:gc:main_thread:cycle:full:sweep:on_allocation' 392 ), 393 'blink_gc_sweep_task_foreground', 394 ( 395 SELECT 396 RepeatedField(cpuDurMs) 397 FROM blink_slice 398 WHERE blink_non_aggregated_gc_event_name = 'blink-gc-sweep-task-foreground' 399 ), 400 'blink_gc_main_thread_cycle_full_sweep_idle', 401 ( 402 SELECT 403 RepeatedField(cpuDurPerEpochMs) 404 FROM blink_per_epoch_slice 405 WHERE 406 blink_non_aggregated_gc_events_new_name = 407 'blink:gc:main_thread:cycle:full:sweep:idle' 408 ), 409 'blink_gc_unified_marking_by_v8', 410 ( 411 SELECT 412 RepeatedField(cpuDurMs) 413 FROM blink_slice 414 WHERE blink_non_aggregated_gc_event_name = 'blink-gc-unified-marking-by-v8' 415 ), 416 'unified_gc_main_thread_cycle_full_mark_step', 417 ( 418 SELECT 419 RepeatedField(cpuDurPerEpochMs) 420 FROM blink_per_epoch_slice 421 WHERE 422 blink_non_aggregated_gc_events_new_name = 423 'unified:gc:main_thread:cycle:full:mark:step' 424 ), 425 'blink_gc_atomic_pause', 426 ( 427 SELECT 428 RepeatedField(cpuDurMs) 429 FROM atomic_pause_event 430 ), 431 'blink_gc_main_thread_cycle_full_atomic', 432 ( 433 SELECT RepeatedField(val) FROM ( 434 SELECT 435 SUM(cpuDurMs) as val 436 FROM atomic_pause_event 437 GROUP BY epoch 438 ) 439 ), 440 'blink_gc_atomic_pause_mark_transitive_closure', 441 ( 442 SELECT 443 RepeatedField(cpuDurMs) 444 FROM blink_gc_atomic_pause_transitive_closure_event 445 ), 446 'blink_gc_main_thread_cycle_full_atomic_mark_transitive_closure', 447 ( 448 SELECT RepeatedField(val) FROM ( 449 SELECT 450 SUM(cpuDurMs) as val 451 FROM blink_gc_atomic_pause_transitive_closure_event 452 GROUP BY epoch 453 ) 454 ), 455 'blink_gc_total', 456 ( 457 SELECT 458 RepeatedField(cpuDurMs) 459 FROM blink_top_gc_event 460 ), 461 'blink_gc_main_thread_cycle_full', 462 ( 463 SELECT RepeatedField(val) FROM ( 464 SELECT 465 SUM(cpuDurMs) as val 466 FROM blink_top_gc_event 467 GROUP BY epoch 468 ) 469 ), 470 'blink_gc_mark_roots', 471 ( 472 SELECT 473 RepeatedField(cpuDurMs) 474 FROM blink_top_gc_roots_marking_event 475 ), 476 'blink_gc_main_thread_cycle_full_mark_roots', 477 ( 478 SELECT RepeatedField(val) FROM ( 479 SELECT 480 SUM(cpuDurMs) as val 481 FROM blink_top_gc_roots_marking_event 482 GROUP BY epoch 483 ) 484 ), 485 'blink_gc_mark_transitive_closure', 486 ( 487 SELECT 488 RepeatedField(cpuDurMs) 489 FROM blink_gc_foreground_marking_transitive_closure_event 490 ), 491 'blink_gc_main_thread_cycle_full_mark_transitive_closure', 492 ( 493 SELECT RepeatedField(val) FROM ( 494 SELECT 495 SUM(cpuDurMs) as val 496 FROM blink_gc_foreground_marking_transitive_closure_event 497 GROUP BY epoch 498 ) 499 ), 500 'blink_gc_mark_foreground', 501 ( 502 SELECT 503 RepeatedField(cpuDurMs) 504 FROM blink_top_gc_foreground_marking_event 505 ), 506 'blink_gc_main_thread_cycle_full_mark', 507 ( 508 SELECT RepeatedField(val) FROM ( 509 SELECT 510 SUM(cpuDurMs) as val 511 FROM blink_top_gc_foreground_marking_event 512 GROUP BY epoch 513 ) 514 ), 515 'blink_gc_mark_foreground_forced', 516 ( 517 SELECT 518 RepeatedField(cpuDurMs) 519 FROM blink_gc_forced_foreground_marking_event 520 ), 521 'blink_gc_main_thread_cycle_full_mark_forced', 522 ( 523 SELECT RepeatedField(val) FROM ( 524 SELECT 525 SUM(cpuDurMs) as val 526 FROM blink_gc_forced_foreground_marking_event 527 GROUP BY epoch 528 ) 529 ), 530 'blink_gc_mark_background', 531 ( 532 SELECT 533 RepeatedField(cpuDurMs) 534 FROM blink_top_gc_background_marking_event 535 ), 536 'blink_gc_concurrent_thread_cycle_full_mark', 537 ( 538 SELECT RepeatedField(val) FROM ( 539 SELECT 540 SUM(cpuDurMs) as val 541 FROM blink_top_gc_background_marking_event 542 GROUP BY epoch 543 ) 544 ), 545 'blink_gc_sweep_foreground', 546 ( 547 SELECT 548 RepeatedField(cpuDurMs) 549 FROM blink_top_gc_foreground_sweeping_event 550 ), 551 'blink_gc_main_thread_cycle_full_sweep', 552 ( 553 SELECT RepeatedField(val) FROM ( 554 SELECT 555 SUM(cpuDurMs) as val 556 FROM blink_top_gc_foreground_sweeping_event 557 GROUP BY epoch 558 ) 559 ), 560 'blink_gc_sweep_background', 561 ( 562 SELECT 563 RepeatedField(cpuDurMs) 564 FROM blink_top_gc_background_sweeping_event 565 ), 566 'blink_gc_concurrent_thread_cycle_full_sweep', 567 ( 568 SELECT RepeatedField(val) FROM ( 569 SELECT 570 SUM(cpuDurMs) as val 571 FROM blink_top_gc_background_sweeping_event 572 GROUP BY epoch 573 ) 574 ), 575 'unified_gc_total', 576 ( 577 SELECT 578 RepeatedField(cpuDurMs) 579 FROM unified_gc_total 580 ) 581); 582