Merge "ui: Add a command to show uninterruptible thread count" into main
diff --git a/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql b/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql
index e7081ee..50331e6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql
@@ -37,6 +37,24 @@
FROM intervals_overlap_count!(runnable, ts, dur)
ORDER BY ts;
+-- The count of threads in uninterruptible sleep over time.
+CREATE PERFETTO TABLE sched_uninterruptible_sleep_thread_count(
+ -- Timestamp when the thread count changed to the current value.
+ ts INT,
+ -- Number of threads in uninterrutible sleep, covering the range from this timestamp to the
+ -- next row's timestamp.
+ uninterruptible_sleep_thread_count INT
+) AS
+WITH
+uninterruptible_sleep AS (
+ SELECT ts, dur FROM thread_state
+ where state = 'D'
+)
+SELECT
+ ts, value as uninterruptible_sleep_thread_count
+FROM intervals_overlap_count!(uninterruptible_sleep, ts, dur)
+ORDER BY ts;
+
-- The count of active CPUs over time.
CREATE PERFETTO TABLE sched_active_cpu_count(
-- Timestamp when the number of active CPU changed.
diff --git a/ui/src/plugins/dev.perfetto.Sched/index.ts b/ui/src/plugins/dev.perfetto.Sched/index.ts
index a72c0f3..68d3d0b 100644
--- a/ui/src/plugins/dev.perfetto.Sched/index.ts
+++ b/ui/src/plugins/dev.perfetto.Sched/index.ts
@@ -17,7 +17,10 @@
import {Trace} from '../../public/trace';
import {PerfettoPlugin} from '../../public/plugin';
import {ActiveCPUCountTrack, CPUType} from './active_cpu_count';
-import {RunnableThreadCountTrack} from './runnable_thread_count';
+import {
+ RunnableThreadCountTrack,
+ UninterruptibleSleepThreadCountTrack,
+} from './thread_count';
import {getSchedTable} from './table';
import {extensions} from '../../public/lib/extensions';
@@ -40,6 +43,26 @@
addPinnedTrack(ctx, runnableThreadCountUri, 'Runnable thread count'),
});
+ const uninterruptibleSleepThreadCountUri = `/uninterruptible_sleep_thread_count`;
+ ctx.tracks.registerTrack({
+ uri: uninterruptibleSleepThreadCountUri,
+ title: 'Uninterruptible Sleep thread count',
+ track: new UninterruptibleSleepThreadCountTrack({
+ trace: ctx,
+ uri: uninterruptibleSleepThreadCountUri,
+ }),
+ });
+ ctx.commands.registerCommand({
+ id: 'dev.perfetto.Sched.AddUninterruptibleSleepThreadCountTrackCommand',
+ name: 'Add track: uninterruptible sleep thread count',
+ callback: () =>
+ addPinnedTrack(
+ ctx,
+ uninterruptibleSleepThreadCountUri,
+ 'Uninterruptible Sleep thread count',
+ ),
+ });
+
const uri = uriForActiveCPUCountTrack();
const title = 'Active CPU count';
ctx.tracks.registerTrack({
diff --git a/ui/src/plugins/dev.perfetto.Sched/runnable_thread_count.ts b/ui/src/plugins/dev.perfetto.Sched/thread_count.ts
similarity index 77%
rename from ui/src/plugins/dev.perfetto.Sched/runnable_thread_count.ts
rename to ui/src/plugins/dev.perfetto.Sched/thread_count.ts
index 9b5e9c5..88fe892 100644
--- a/ui/src/plugins/dev.perfetto.Sched/runnable_thread_count.ts
+++ b/ui/src/plugins/dev.perfetto.Sched/thread_count.ts
@@ -18,7 +18,7 @@
} from '../../frontend/base_counter_track';
import {NewTrackArgs} from '../../frontend/track';
-export class RunnableThreadCountTrack extends BaseCounterTrack {
+abstract class ThreadCountTrack extends BaseCounterTrack {
constructor(args: NewTrackArgs) {
super(args);
}
@@ -35,7 +35,9 @@
`INCLUDE PERFETTO MODULE sched.thread_level_parallelism`,
);
}
+}
+export class RunnableThreadCountTrack extends ThreadCountTrack {
getSqlSource() {
return `
select
@@ -45,3 +47,14 @@
`;
}
}
+
+export class UninterruptibleSleepThreadCountTrack extends ThreadCountTrack {
+ getSqlSource() {
+ return `
+ select
+ ts,
+ uninterruptible_sleep_thread_count as value
+ from sched_uninterruptible_sleep_thread_count
+ `;
+ }
+}