功能:完善通用云管工作台、审计与诊断能力

This commit is contained in:
songyiming committed 2026-11-11 18:46:16 +08:00
1 parent 5ac692724d
commit 9f05aa20ea
225 files changed
+14266 -141

No files matched your search

@@ -0,0 +1,16 @@
{
"time": "2026-11-11T07:17:20.960Z",
"realAPI": true,
"themes": [
"dark",
"light"
],
"viewportWidths": [
1440,
390
],
"scriptErrors": [],
"failedResponses": [],
"blockedWrites": [],
"screenshots": 3
}
@@ -0,0 +1,19 @@
{
"time": "2026-11-11T07:09:39.915702+00:00",
"backup": ".local/live/backups/before-admin-sessions-20261111-150936.dump",
"backupBytes": 256037,
"oldImageTag": "before-admin-sessions-20261111-150936",
"oldImages": {
"api": "sha256:92138b1111fab09270b192ce465ba66fa98393158bace1a359a7553f92dda046",
"console": "sha256:828b045abf8c6eca17592a1bfbd2b62f8e50b723f4dbd6439d7f3ebfbccc3fd7"
},
"deployedAt": "2026-11-11T07:14:11.930124+00:00",
"baselineBinarySHA256": "78f454b057fd2de9510fa966ada07654692c609181faa62dc72c96391f0d95ec",
"baselineMatchesLiveBinary": true,
"existingGPUConfigurationPreserved": true,
"activeJobsBeforeDeployment": 0,
"newImages": {
"api": "sha256:4bc0609343b3c9382c859444579c0246bc12bb6ff787c2d0fb784ec7942db3b7",
"console": "sha256:52c38fa17705374202f557edd959271e0fae1c88d9f104a356b266dbd54b5e83"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

@@ -0,0 +1,16 @@
{
"time": "2026-11-11T07:17:17.750800+00:00",
"mode": "production",
"realDatabase": true,
"twoSessionsCreated": true,
"selectedSessionRevoked": true,
"otherSessionValid": true,
"sessionsHideCredentials": true,
"auditRecorded": true,
"accountDisableRevokedSessions": true,
"authenticationEnforced": true,
"administratorsUsersBindingsDeviceIdentityUnchanged": true,
"alertRulesUnchanged": true,
"vmConfigAndPowerUnchanged": true,
"businessTaskAndSnapshotCountsUnchanged": true
}
@@ -0,0 +1,17 @@
{
"time": "2026-11-11T02:22:58.470Z",
"realAPI": true,
"themes": [
"dark",
"light"
],
"viewportWidths": [
1440,
390
],
"downloaded": true,
"scriptErrors": [],
"failedResponses": [],
"blockedWrites": [],
"screenshots": 4
}
@@ -0,0 +1,20 @@
{
"time": "2026-11-11T02:18:16.487141+00:00",
"backup": ".local/live/backups/before-audit-history-20261111-101812.dump",
"backupBytes": 206044,
"oldImageTag": "before-audit-history-20261111-101812",
"oldImages": {
"api": "sha256:040ca70d5ecf42a0db2c43d089bc3e1da85d98730a2eb22cfb043babe94fc2d4",
"console": "sha256:919d26c7ee5e0292fb22d1fcbb7b6144a6eb110cce6271351cc5bdc2a80d1034"
},
"deployedAt": "2026-11-11T02:22:33.443673+00:00",
"baselineBinarySHA256": "8c87f4e2183bd6f96ff5d67544f0467dc832c6af524ba8f1426aa5ec54d82d75",
"baselineMatchesLiveBinary": true,
"concurrentGPUCodeExcluded": true,
"composeGPUConfigurationExcluded": true,
"activeJobsBeforeDeployment": 0,
"newImages": {
"api": "sha256:4b01050834124b526eba7b5ee32839bfffccfa43a674f86c53c9e3f29199bfb3",
"console": "sha256:b4d15d6fa16c3576ca2beba1132369917554dcc3978e8609547a46483cf0324d"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

@@ -0,0 +1,23 @@
{
"time": "2026-11-11T02:22:54.883217+00:00",
"mode": "production",
"realDatabase": true,
"matchingRecords": 187,
"pageSize": 2,
"pages": 94,
"csvRows": 187,
"csvMatchesAllPages": true,
"exportAudited": true,
"authenticationEnforced": true,
"invalidRangeRejected": true,
"administratorsUsersBindingsDeviceIdentityUnchanged": true,
"alertRulesUnchanged": true,
"vmConfigAndPowerUnchanged": true,
"vmPowerStates": [
"running",
"stopped",
"running"
],
"businessTaskAndSnapshotCountsUnchanged": true,
"taskCount": 8
}
@@ -0,0 +1,140 @@
{
".dockerignore": "1ec5c1cbf7804fe50681775ff7204bd0a753ace315c071e089fb35b6cc38e24a",
"console/.env.example": "ab72c957a6f5895d608a924ddd6bcc4c92044ed854465ccd38490bf2896d7128",
"console/Dockerfile": "0ec09a6f15331a85b24d5ef278719827ea2a9bb6eb0759cfa4ddf6377f4c88a7",
"console/eslint.config.js": "d55522173395ade075e0ae7bac6567ad25ed218e5862184e9edffc011e23a72a",
"console/index.html": "04a80010b9d643f1e922b53b76242632d1bb23a55151f87e370644e2868e624f",
"console/package-lock.json": "bdf4236cdb3ffd48a8a8d2394a5324c3b3beabc6c82f382c5ecd82ca1f402a1b",
"console/package.json": "cd2cb1bf4e74cfd35547ae47cae6b77296ce62a6a6aaa986ed6d0c0695530851",
"console/playwright.config.ts": "0d3eab93c9da1dcb9c4ae3106af46784edafe9ef45c9104ee2fa07c1ab281aa1",
"console/playwright.live.config.ts": "6d965bfed9446c0b398083d70ac12b4cddbd702ce3bbbcf6dcb70ce10527eb06",
"console/README.md": "b8fb84bb09b8b634d2dfb53aeb6f9a984cc6aacb71b39820f91e5cc573515cec",
"console/tsconfig.json": "becebae4321654e60c434896219fbada01bd8a8ddf3325e39e70a460a7667cea",
"console/vite.config.ts": "22fb15d5fd246e1511318444e59126a03a152b7385e3fd19518c85e9d4a5e5a9",
"console/vitest.config.ts": "74ef7d84fb000f03870f49b271d17f329d1c8c4b043db3f31dede2b12a88e069",
"deploy/compose.dev.yml": "60e2545268c994f4efa410abc7a0a4878d80c1e93ae3094cf37548f4615595da",
"deploy/compose.live.yml": "70b60e5dfc89369e7f26665b1310a73638a259798a77d07fcc5a9f0d464c6c9d",
"deploy/nginx.conf": "c81448d1329fd13bc50fe8e5969b8fe049477bc3c7ff43eefa74d6c0c769d803",
"deploy/nginx.live.conf": "3c5bd01b9e9d5e50cae6fd36568fdcb2b96a7480d2690f30928e8b458befb493",
"platform/.env.example": "4d979ea700686c54830ca039ef4649ff0f653545720db29c37cf4227e4758572",
"platform/Dockerfile": "61ae69a5b8ed1b19d31b5f47e628ac978d95a54ca15936aeb688504c9a5961ca",
"platform/go.mod": "559117ddf04023e338455ab192790b813a4a153f1ea5bd936ea0907bd2b572a8",
"platform/go.sum": "25fa1de5f07dd2cce19db1534dd066262c32e93dcbb6118cac87ff8996854097",
"platform/README.md": "52ce4e99d72ac4333fad8b2342a22f88dc7bf4c49c08a6f13fab7f8e28fa2d71",
"platform/pkg/proxmox/client.go": "8e8c256adb8ca37c85f453bc592087b80742ffccb76f640da264e28367e2995b",
"platform/pkg/proxmox/client_test.go": "5a2ce7031fd0b402608a4d10d5f5d2cf4c41938f6fedc8ecfa0723de837b13ef",
"platform/pkg/proxmox/gpu.go": "946fa364aabba8b96679c8ee184e407f7e09c1a5667930fdbedd1480ccc615d4",
"platform/pkg/proxmox/gpu_test.go": "b72fe8a8f06fcead0b73dd71bea3803b4ff51e1513abff95fa71ed578dab119e",
"platform/pkg/proxmox/hardware.go": "d35be1f147872101f88ccec84e60050da46579d2563b7b0fd013a77cb4bc3a2b",
"platform/pkg/proxmox/hardware_test.go": "60ebff73c6ae9d9356638f84b5e1b41464529ac71988bc1f98a8262551923c5a",
"platform/pkg/proxmox/provision.go": "eea12dd036f325adf8ca6d3add8a075a873f837f191cc24d5d61c49bcb496f66",
"platform/pkg/proxmox/provision_test.go": "dc100d228fa1cda0fe02bf5052660b6bd348932e717bd8caf4bfe096cac05163",
"platform/pkg/proxmox/snapshots.go": "5620699da3345bea052d2b31dc5005496ed610918d7a63668b1986ee4d71d0ea",
"platform/pkg/proxmox/snapshots_test.go": "5c2aaab24c87894316a473ad97b1488b84e0108c1db56b07fc242f03b39e3969",
"platform/internal/config/config.go": "ee4bec0d50f50d2fab8b87f2b1bff23392a8913a090396c0995f65195f49966f",
"platform/internal/model/model.go": "f5eb9f9f68e8ea655fa7061ee9dc994a88eeb73df0fa3256cf627479baf50989",
"platform/internal/server/admin.go": "1771c904df180e846794a81f447a9889bd03301e9e8d783e798ad137b4fee2b3",
"platform/internal/server/administrators.go": "400989e699329c4643bb37fdbdb5a89acaba4959fc7d1587524bc84c73b12fc4",
"platform/internal/server/administrators_test.go": "750b4f915d290d181503d836c6585aca48a8f011f4600b9ab50fbde4dfa1d97b",
"platform/internal/server/audits.go": "6706dd7fdbfaae6bd9dab9e43549eb498f9921862a10ece84c0c3a67c265f43f",
"platform/internal/server/audits_test.go": "5ce668bb6e4d4d49d85e637168ddb76d85ac02ef7b4d5b039d7a96796686b119",
"platform/internal/server/catalog.go": "5970c170a02204f92b46db4e2657aa184dc6b7489061c40e4a5b16afb86ad890",
"platform/internal/server/catalog_test.go": "5fbdf7c1bad6ffe445d027270a04072ae273c3b3b64206a5dc61f58953e1cadb",
"platform/internal/server/compute_connection.go": "87ee2de5cad7b2222d185048442f173dbfb349fa721ada90c095f38e259b2975",
"platform/internal/server/configuration_test.go": "7d66f7f672f7b6978235d3178a219943fd05f5a9a79c939f0470342a894c5729",
"platform/internal/server/gpu.go": "f1a46be6bd8995fb1388a5bd57e1fc6f91494bc662368faa900183ed5e65e212",
"platform/internal/server/gpu_test.go": "3f06e25b64ca6edebb382493751b52d846b36d2e31c449116fac7a565bda467b",
"platform/internal/server/hardware.go": "63675368f7bdde9173d8cdcb82a2633b16c8757c05d77860e936dd40d29b9040",
"platform/internal/server/imports.go": "413854f1565f01c91a3bdb58ce5a9517925dd7d841b0d08a5302f68094283db7",
"platform/internal/server/lifecycle.go": "32ba57fbb74655f2eb10c4896adc09e8e6115d75ec1e7a54fa4e119bde157cde",
"platform/internal/server/lifecycle_test.go": "c2a905d7415ac9da0522f6793a540dcfb4f743ccf008b98e6d7d5baf0fac4a58",
"platform/internal/server/login_limits.go": "4c18db415396140522a6a7d7bd99f5475e527bab9ac62291af6b5cfb4ebb7f96",
"platform/internal/server/maintenance.go": "1e3fd3e712a2e40175b30e9aa4f1c4a884534ecdf22c22be8d860fd7bee6851c",
"platform/internal/server/observability.go": "90b3667ab5a12304714a6e0dba52ee910ec8f536c4b28a8106f0468e0e0d28eb",
"platform/internal/server/operations_test.go": "9dd8eb57118f55cc19949edb2725c18b2912a42eab7eb011d0f68237a9224077",
"platform/internal/server/policies.go": "f1b2fbe06c7467a14b923b5deda4ca5405431a1c246d20e589a1f8d70396da9b",
"platform/internal/server/policies_test.go": "146f79f9271e222c5bda54fe171a838fafe3cf18c9bccd9dc52bfc213b98f8ec",
"platform/internal/server/power_batches.go": "69220167981a712e415a1ff5d2e5dbd857f186cf4063bfdd1be6f7baef7c8ffe",
"platform/internal/server/power_batches_test.go": "f3be4c6398885ff5579b9dc45dddb6c9a4a8b219be2fdafa92254419917d2e6b",
"platform/internal/server/power_batch_worker.go": "ecab67a9aff19efac3e674881d947c80395a6e88776dd923a2ec9d0dfdd0b454",
"platform/internal/server/provision_worker.go": "9d3d6419f47a32d15bae2c8fac3a02fbf8e5858488a05015beab58f73d7d0010",
"platform/internal/server/server.go": "990095f61c16169312a74fc3a7ac70df9ac2762be29bdc17477579bd2f442ff9",
"platform/internal/server/server_test.go": "25d6323570f7a454ca5ca9cb1683e28be66f75de4521b0908153bcef138fec1d",
"platform/internal/server/session_history.go": "4098d126d1a7e841a1c4b5b1be4fe101dd884b08a71c78b8ca98e73309008c78",
"platform/internal/server/snapshots.go": "97dd570e5b7e0352dd6c0037dca529f4ff764a6718e36d6c9e2b682ff75aceb6",
"platform/internal/server/snapshots_test.go": "90523abace16f3cca1a0b538b6896072294a05163b8a54ee760fba360eddb0de",
"platform/internal/server/terminal.go": "0143bf616243a9d0292aaec1ea134ced43f0ed4900765894d61e592f23f83dff",
"platform/internal/server/terminal_alerts.go": "eb44d842b9f7430ac71f7d361f0dcf27f3d4490b7e51685629323f9ee2dfc2fb",
"platform/internal/server/terminal_alerts_test.go": "cec76be6fea3bc37c3ad01c72c476e059140696af3fa4f735bc5b23329699c50",
"platform/internal/server/terminal_metrics.go": "8c1c02d8085772b078cd91243a75099ddb592d8b655db8d96af8059b2075d03b",
"platform/internal/server/terminal_metrics_test.go": "1d0ac4d73694104c9d9f3da9274b6e8c6e1f7f29609d51f1daa5d703e1eafbd0",
"platform/internal/store/schema.sql": "a8ccab01ae90d9070cb793ab02be7509ce174a1660581cb25d7aa2c9e876d349",
"platform/internal/store/store.go": "333bc9798f1a671c8376ae55ce80ca83a7305fc12116ef3ddc248d824742658f",
"platform/cmd/api-gateway/main.go": "271660f003afff20b968938ba084b11f314126d90409def2d213f9587fdfb827",
"console/e2e/administrators.spec.ts": "225b8e96781d2abd648b798b70d9443c80e2831473ca37a9b00066e4bf5cdd9b",
"console/e2e/audits.spec.ts": "2fcc63e8534416e5f2a918cf7a5d4d1da78dae552ee631bb81de691587737485",
"console/e2e/batch-operations.spec.ts": "76f6a04870aa335bdcd5e44cc65ba43ab961f776cb0e28daaeffcf3831415669",
"console/e2e/catalog.spec.ts": "af2fa3783ac2b6de920af227c925650d2416c66194ff0de98e5c0fd1789224a4",
"console/e2e/configuration.spec.ts": "0cd3e4fa5a3020fa19d251cdc1bd1a953f94e9b4a7ab406ed790532196d0d2f9",
"console/e2e/console.spec.ts": "705de4025cab9525bafee455ed27cecb96550c887464f69a179795240d21dbc3",
"console/e2e/gpus.spec.ts": "d7953d1d14fe22bb550ad754a4412cf172186fd770d7083438f55e73d953c91c",
"console/e2e/lifecycle.spec.ts": "6374ab61a67fd0b51a132a1e4079f3e2dd351ce747dba8a6180f38fb611638ed",
"console/e2e/live.spec.ts": "3af8b236e0ca7ebb3fb3a6a434372c71f53d4577f4b7cf30332e684b39d5a961",
"console/e2e/operations.spec.ts": "eea905df578b1ea7f26a13c112748ed80816606487db450c8627a26a36ca73aa",
"console/e2e/policies.spec.ts": "156b74f615e0817f368cb12607cbc56821956300eb6aac94ca404b8518bd0abc",
"console/e2e/snapshots.spec.ts": "d16dae0fb17634105f4aeca103bb19af20c1bb5fb19f4719f625edf93663ac97",
"console/e2e/terminal-alerts.spec.ts": "e5419fcff8c97917d7f013fe366a62b24379b3d1822bd16a99742af66982809e",
"console/e2e/terminal-metrics.spec.ts": "02a24fa7aa0fadbdc712027d7ee06505d7a0f4ff570710b1da3cef012d0667cb",
"console/e2e/ui.spec.ts": "dcc8ed295dce67f54036b6ae4843cc5cb28b9d3c00fd40e2daa377d971b7ecee",
"console/public/mockServiceWorker.js": "26171599d94d5445297303f3a1f1cedec26835ea3d0057dcfa92ec520cb35cca",
"console/src/App.vue": "51aa88af1efacc8189f3cb8e5d1491af4f40997466c8036a8933246dd443380d",
"console/src/main.ts": "1954e1e7c6e278b800b1d687547039a888392402934311c0c0f3a83fccba41e5",
"console/src/api/audit-labels.ts": "3a01ba5a9f105bbdba132a360ecc6ff6bd6e533dd87901fd6f671dcd962d6a75",
"console/src/api/index.ts": "e9bfa7618c47d28e03a2baaa580db974a2294f276c1add55df8f10107a894610",
"console/src/api/schema.d.ts": "5e745e0505eaaebbed4b3fb088b0bc52d43d96316c437ffe08f359c6b975b549",
"console/src/assets/brand-mark.svg": "30ccb90d95e4fa305fad1a6045251f91d9a75efe97908de562c104d547792956",
"console/src/assets/kylinsoft.png": "98397497b49338607a7a4e1c1db562ce6fd1cdc1a6f35cb1f5f3a0b524876086",
"console/src/assets/ubuntu.svg": "b0aca674c881a07bb60b26afbcee07093ae419e29ee38e376f938817fa66ae03",
"console/src/components/AdministratorAccounts.vue": "fa42b4a3877175385efdc7dad32c6500f93f4c50c70bc30d3f9999386349dfa1",
"console/src/components/AuditHistory.vue": "36d4ceb12d5616e10f6672d28178eeb3397d1cc3a3f5515b0415f59284ce1273",
"console/src/components/ChangePasswordDialog.vue": "af9708676717dbeee3284a0ed8d7a57d4c5b43ffde17889ef8509078f528b2d7",
"console/src/components/CloneDesktopDialog.vue": "a098994d5285cbb9e9a718eb8182a7d4e1065e5c8029ed856d2923d5cef1a0af",
"console/src/components/CsvImportDialog.vue": "91f2ced2ee35c5808122421acb4c1c0588a6ac37fa2777fd44e4830c4f98fc86",
"console/src/components/DesktopBatchDialog.vue": "aaf9729b1d3c71b040689ce38486d084a37e64a64c672ca7d992cdb03900721b",
"console/src/components/DesktopHardwareDialog.vue": "ce7a1689c8bc6b0959a3322969c7669a9af1e0a18a7b0af00c5bfc0bd6dd237d",
"console/src/components/DesktopSnapshotsDialog.vue": "c005c73e6861ad6a68c3e91d8dc608cadc5d8459b8859c21c437264e572d48b6",
"console/src/components/PveConnectionDialog.vue": "0a1df39a83dc88e4bb1816f23765aa40dc11b36be9d005c5ed9b1fdc15f4df7c",
"console/src/components/ResourceTrend.vue": "6b9150b93658fc2508d25e434757a3e96d8e7ac21920c77b61e65bb077d30fd7",
"console/src/components/SessionHistory.vue": "d67ae011dd6236e15646760952b8d53d9402ae4cb806217d79ecdb6fb644311d",
"console/src/components/StatusTag.vue": "c1119aabc24c740ed45d7e8c6c1450f6ab9ceed67a4076667e1e8d1fbfe7712b",
"console/src/components/SystemIcon.vue": "c2c1c81950305cafa40c8618ef2b8a0d00b629ad43f4113adc86e0ce486510e6",
"console/src/components/TerminalMetrics.vue": "3cffab8fc3027579892fee34604e84f58691086a5d622c4043ad9004989a10da",
"console/src/components/TerminalMetricTrend.vue": "643ed690201b3a2596fce822cc42dc2669c930af8ad6e5bab7a078ee199040a4",
"console/src/components/ThemeToggle.vue": "20321bee998e83377e969ff3cb2004efc629b3fa6b72080282bfc9e98fc8bb25",
"console/src/composables/useAction.ts": "2567143620249766e9940f1e63e263cca180332b0fcdd15fdd31ca9fa09815b8",
"console/src/composables/useTheme.ts": "2de0fde65c75a8cf9ade9b2d93d162fa245e027507ea36d0046e5161292dd61e",
"console/src/layouts/ConsoleLayout.vue": "4622c695cfac6298cd7aedc3d3f8b32a5c5deed58b48256e0572be57873a8db3",
"console/src/mocks/browser.ts": "1b751209d7fbfcf39bb47376cd893ca42c71281e4ca39188aece1d768464d543",
"console/src/mocks/handlers.ts": "46ebab4dbad545cd5799facb2647e10e3560e4054dbab11e2788d5cecc77aa18",
"console/src/router/index.ts": "b9f806c59aa317c204c404a5a5f9385746daf4dbaef6991aa84ff9f01fc898d4",
"console/src/stores/auth.test.ts": "26adb951ebfa12196fdebd586083f88b18c67fc648225d64233d49eac7f98633",
"console/src/stores/auth.ts": "32d5ad0394ec136b167447b8a3d8be8cda7ba574e78f8f7b7f21d0f069ff0675",
"console/src/stores/platform.ts": "cde4cd50b1c7a39a525651a601d07f8cd09740bc7dc0bbfe118e899fa41a90c2",
"console/src/styles/tokens.css": "64c09a6c5b54c3fc8121a80cd29d79542a3926ee638235755f41f7599f3c8bbc",
"console/src/views/Desktops.vue": "291b4acde5d476812bfac78c19f773c5707e6d3601a4c47ab68d6722f64c5c7a",
"console/src/views/Forbidden.vue": "6391073f7b441e547f6918d27c8e628341e7be04b850644b9e0089280455b6be",
"console/src/views/GPUs.vue": "e08261a1f7aa5ccf9422acff112f239c44f477b255847c03ca884ddcf462c716",
"console/src/views/Login.vue": "e58aaa254cc0d9b9d578d8a7348aabb454ffb6646538b7f4073eafec500c06c0",
"console/src/views/Monitor.vue": "f3cb6760f85c88a4faccac4ae35540ac2ad2be669cf50d4229223ffabc4dd63f",
"console/src/views/NotFound.vue": "924455b640a9adb9f3c921b8bc5d4004f4d5915cecc503f0e0829db3d4497224",
"console/src/views/Overview.vue": "bff2ea6496b70a44265b182cdfee95a0ceed3245613fe875685f2131673a0183",
"console/src/views/Pools.vue": "04f0d8dc390c34a94da4dda5c25ce2b80e15966a96f8dec0b03de75327e07908",
"console/src/views/Resources.vue": "e98f825f0c7f7f411cd97a0455faa4ca2dd05d98b793256f6eb71d3d7f7b837e",
"console/src/views/Sessions.vue": "367555f4bb152907cac7b7f71231c81a95e887a1b6fb60cdf842c74a6282edef",
"console/src/views/Settings.vue": "8841e5d9a667403bbb5a956cb1bd7b77ccaea388b879367e7432133efa96fa00",
"console/src/views/Tasks.vue": "2ebae81b54544fe3f43edf6eefbf6a8b7099f508f576f1246dcf0cc22be86d51",
"console/src/views/Templates.vue": "db39841af85c3a73d288c374065d38f0c3f1b1a6e2f3d46c927c53076ae29e59",
"console/src/views/TerminalPolicies.vue": "f0b3b77b73749f02e265b0cbab4e0e4d28be1b18f139dc77e2950bb934a1acfb",
"console/src/views/Terminals.vue": "8bcf6aad71ce73c3b83d9ee913ea6bd287c528676a8b00c1e6904d05d6296c4a",
"console/src/views/Users.vue": "a2a9fda424660ce7e5865dc3bcbd902b5b86e7da07edc2b4ace22dd30a7959c6"
}
@@ -0,0 +1,28 @@
{
"time": "2026-11-11T02:22:38.197918+00:00",
"goFullSuite": "passed on isolated database; both workspace and GPU-excluded release",
"goVet": "passed for release",
"frontendLint": "passed",
"frontendBuild": "passed",
"frontendUnitTests": 3,
"safeFixtureE2E": 65,
"newAuditE2E": 4,
"goAuditTests": 3,
"dedicatedTestDatabase": "vdi_audit_test on temporary container vdi-audit-test-db",
"liveDatabaseNeverTruncated": true,
"limitsTested": {
"queryBeyond1000": true,
"export10000": true,
"rejectExport10001": true,
"csvFormulaInjection": true,
"literalWildcards": true,
"anonymous401": true,
"threeRoles": true
},
"expectedBuildWarnings": [
"Existing Vite chunk size warning"
],
"deployed": true,
"realAPIAcceptance": "passed",
"realBrowserAcceptance": "passed"
}
@@ -0,0 +1,19 @@
# 日志与诊断验收证据
日期:2026-11-11。真实服务:本机 5182。
| 文件 | 范围 |
| --- | --- |
| `live-verification.json` | 采集前真实设备/桌面查询、全分页与导出一致、三角色和未登录权限 |
| `browser-verification.json` | 真实两版入口、查询/详情/筛选/下载、角色守卫及深浅窄屏 |
| `state-verification.json` | 第一阶段只读验收及临时账号清理后,配置一致、任务仍为 63 |
| `collection-verification.json` | 随后通过真实页面提交一次日志采集,设备成功回执、展示及下载 |
| `collection-state-verification.json` | 采集后唯一新增任务与原配置一致性、ZIP 含实际日志 |
| `deployment.json` / `manifest.json` | 备份、镜像、基线二进制校验及隔离发布文件 |
| `live-*.png` | 真实页面,日志原文收起;较早的总览图中日志数为采集前的 0 |
各核验 JSON 的时间戳标明先后阶段:只读阶段没有提交业务命令,随后采集阶段新增一条 `collect-logs`,不是相互矛盾的任务计数。原始诊断 ZIP 仅保存在被忽略的 `.local/diagnostics-review/`,未将设备原始日志纳入公共证据。
隔离测试结果:后端 6 项专项、Go 全量/vet;前端检查、6 项单元测试、生产构建;诊断 9 项/版本 12 项/GPU 4 项共 25 项浏览器测试通过。浏览器原始结果位于 `.local/diagnostics-review/e2e-final/`,视觉复验位于 `e2e-visual/`;用例源代码见 `console/e2e/diagnostics.spec.ts`,后端见 `platform/internal/server/diagnostics_test.go`。
测试数据库使用 `127.0.0.1:55441` 一次性容器;不使用真实业务库。现场验收没有发电源、GPU、重启或重置会话命令。功能范围与未实现项见[实施说明](../../cloud-diagnostics-20261111.md)。
@@ -0,0 +1,26 @@
{
"time": "2026-11-11T09:52:22.239Z",
"realAPI": true,
"defaultCommonNavigationEntries": 5,
"advancedOperatorNavigationEntries": 14,
"terminalAndDesktopDeepLinks": true,
"actualPageTwoRead": true,
"detailsExpanded": true,
"actualZIPDownload": true,
"filterChangesInvalidateOldResults": true,
"viewerNavigationHiddenAndDeepLinkForbidden": true,
"themes": [
"dark",
"light"
],
"viewportWidths": [
1440,
390
],
"scriptErrors": [],
"failedAPIResponses": [],
"blockedBusinessWrites": [],
"terminalCommandsSubmitted": 0,
"vmPowerActionsSubmitted": 0,
"gpuSwitchesSubmitted": 0
}
@@ -0,0 +1,8 @@
{
"time": "2026-11-11T10:00:00.705662+00:00",
"temporaryDatabaseAndAnonymousVolumeRemoved": true,
"temporaryVite5183Stopped": true,
"temporaryAdministratorsAndSessionsRemoved": true,
"privateAccountCredentialFilesRemoved": true,
"sourceFilesMatchReleaseManifest": true
}
@@ -0,0 +1,19 @@
{
"time": "2026-11-11T09:57:30.567493+00:00",
"collectedZIPContainsDeviceReceipt": true,
"logsInArchive": 1,
"logTailCharacters": 11981,
"knownConfiguredSecretsAbsent": true,
"businessIdentityConfigurationAndBindingsStillUnchanged": true,
"alertRulesStillUnchanged": true,
"onlyAddedTaskIsSuccessfulLogCollection": true,
"newTasks": [
{
"id": "task_f4e4f72e2303be996e6c8bf75303c01c",
"kind": "terminal",
"action": "collect-logs",
"status": "success"
}
],
"rawZIPKeptPrivate": true
}
@@ -0,0 +1,30 @@
{
"time": "2026-11-11T09:56:38.177Z",
"realTerminal": true,
"submittedViaBrowser": true,
"confirmedBeforeSubmission": true,
"actualDeviceReceipt": "success",
"taskId": "task_f4e4f72e2303be996e6c8bf75303c01c",
"terminalAgentVersion": "qt-platform/0.4.0",
"logSourceVisible": true,
"deviceMetadataExpanded": true,
"actualCollectedZIPDownload": true,
"submittedCommands": [
"collect-logs"
],
"commandCount": 1,
"vmPowerActionsSubmitted": 0,
"gpuSwitchesSubmitted": 0,
"sessionResetCommandsSubmitted": 0,
"scriptErrors": [],
"failedAPIResponses": [],
"blockedBusinessWrites": [],
"beforeCounts": {
"tasks": 63,
"snapshots": 0
},
"afterCounts": {
"tasks": 64,
"snapshots": 0
}
}
@@ -0,0 +1,20 @@
{
"deployedAt": "2026-11-11T09:48:30.313383+00:00",
"backup": ".local\\live\\backups\\before-diagnostics-20261111-174813.dump",
"backupBytes": 285675,
"oldImageTag": "before-diagnostics-20261111-174813",
"oldImages": {
"api": "sha256:106f7df40c654b281650a0011e39c365e7b7e8c6a1fae56eea8b81a4e5d164ca",
"console": "sha256:2859db73b4eb6531549ee67e288d1d84ffd9e68d7b8beaefc9000d1ec1911069"
},
"newImages": {
"api": "sha256:00b12a4ba144776b53a33bcc39f8eddae9639f3cd711b38faf0c4327b93d40fb",
"console": "sha256:7e54468e502d50b945fc8d9abb787bf10efb1233bdbb092366f70ccfebe818ec"
},
"baselineBinarySHA256": "d195f248d7393f35321f1b0d4d92cda4a14abcf73ea92a6bb0223ed6ff37a034",
"databaseRestarted": false,
"databaseSchemaChanged": false,
"terminalFilesIncluded": false,
"sourceBaseline": ".local/editions-review/release",
"overlayManifest": ".local/diagnostics-review/manifest.json"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

@@ -0,0 +1,74 @@
{
"time": "2026-11-11T09:49:33.002253+00:00",
"realDatabase": true,
"realAPI": true,
"targets": [
{
"kind": "terminal",
"total": 352,
"counts": {
"alerts": 5,
"audits": 55,
"logs": 0,
"sessions": 182,
"tasks": 110
},
"archiveBytes": 15237,
"allPagesEqualExport": true
},
{
"kind": "desktop",
"total": 182,
"counts": {
"alerts": 2,
"audits": 30,
"logs": 0,
"sessions": 90,
"tasks": 60
},
"archiveBytes": 8705,
"allPagesEqualExport": true
},
{
"kind": "desktop",
"total": 65,
"counts": {
"alerts": 2,
"audits": 10,
"logs": 0,
"sessions": 33,
"tasks": 20
},
"archiveBytes": 4495,
"allPagesEqualExport": true
},
{
"kind": "desktop",
"total": 106,
"counts": {
"alerts": 2,
"audits": 15,
"logs": 0,
"sessions": 59,
"tasks": 30
},
"archiveBytes": 5943,
"allPagesEqualExport": true
}
],
"roleChecks": {
"super_admin": "read/export allowed",
"operator": "read/export allowed",
"viewer": "both 403",
"anonymous": "both 401"
},
"databasePaginationAndSourceFilters": true,
"zipCompleteTwoFilesAndAuditRecorded": true,
"subjectAndDetailsWhitelisted": true,
"knownConfiguredSecretsAbsent": true,
"businessIdentityAndAuthorizationUnchangedBeforeTests": true,
"vmPowerActionsSubmitted": 0,
"gpuSwitchesSubmitted": 0,
"terminalCommandsSubmitted": 0,
"temporaryAccountsRemovedAfterBrowserCheck": true
}
@@ -0,0 +1,70 @@
[
{
"path": "tools/generate-platform-openapi.mjs",
"sha256": "91f1ae26bf9ee4c87f884e61b53569dcbe31d72e087566b8da4731ffdae47190"
},
{
"path": "platform/internal/server/admin.go",
"sha256": "7028dca5236de2238ada6c27fca34f66228e5588d215acee0253186b0c5767e2"
},
{
"path": "platform/internal/server/server.go",
"sha256": "9e4c9c487f154c018f31ed1f266703de017767d071ac9de93bad9ff1cef40d42"
},
{
"path": "docs/openapi/platform.v1.json",
"sha256": "4da7ace4959419d05a8cf60f821da64af5f60b31e53c81eb5a8f2c84dd2b7d12"
},
{
"path": "console/src/api/audit-labels.ts",
"sha256": "632f6895d6fb4f1b93e8bd2f0cce88ae0565a98cca0e860fdd192aa8f7fc9f4b"
},
{
"path": "console/src/api/index.ts",
"sha256": "59e8195ab5f00ef1cc2dc932527766f482063e11800ab49b010ea987ddd01b4a"
},
{
"path": "console/src/api/schema.d.ts",
"sha256": "c532951545d9259e738e198deb237c67a225e3201ce0124951829e1166be1f9e"
},
{
"path": "console/src/components/TaskHistory.vue",
"sha256": "fd3ed85e0c319816731609afad4b8d79aea9e08658ffb57b0b58de37402b7348"
},
{
"path": "console/src/layouts/ConsoleLayout.vue",
"sha256": "98dab479e76de2fd288cc70da642dd1f7916e061e09270084ef05e9859b2f14e"
},
{
"path": "console/src/router/index.ts",
"sha256": "25b0229cc0ebbf5d86fa61014c2b6f3afb510edd16384b4e0cb283e654f04ba2"
},
{
"path": "console/src/views/Desktops.vue",
"sha256": "dc20e3589a2bcb31d910c0c794758ddb172ba10a21d1579a69564ce18fca0c4e"
},
{
"path": "console/src/views/Settings.vue",
"sha256": "935456d69378c23ffb7ccbda06d231bec819ea6e4a7f330bade57682c9cb3019"
},
{
"path": "console/src/views/Terminals.vue",
"sha256": "596c2ae31d57a34d41e273dcfb4efa6d84b4c1564d761315656a63bac9bfe499"
},
{
"path": "platform/internal/server/diagnostics.go",
"sha256": "c87778e8901670d096fda36ecae629fbe75ce0f4e3456004a880d2cd66aaeae7"
},
{
"path": "platform/internal/server/diagnostics_test.go",
"sha256": "c477fc4b8efe5a003b75a6cfc7576f3ccc8162407750c43fefa96e104b2ba11a"
},
{
"path": "console/src/views/Diagnostics.vue",
"sha256": "272481cd97c5fe4378937a40f21eb06ff473bf882aea92db78dd345bcc36785a"
},
{
"path": "console/e2e/diagnostics.spec.ts",
"sha256": "1f603315ae0440f52976af34e8b5e183b165a57e98262855917fc54c42945f9c"
}
]
@@ -0,0 +1,19 @@
{
"time": "2026-11-11T09:54:41.570631+00:00",
"existingAdministratorPasswordsRolesAndStatesUnchanged": true,
"existingUsersBindingsDesktopConnectionAndDeviceIdentityUnchanged": true,
"alertRulesUnchanged": true,
"temporaryAdministratorsAndSessionsRemoved": true,
"databaseFsync": "on",
"beforeCounts": {
"tasks": 63,
"snapshots": 0
},
"afterCounts": {
"tasks": 63,
"snapshots": 0
},
"noBusinessTasksSubmitted": true,
"deployedImagesStillMatchRelease": true,
"databaseNotRestarted": true
}
@@ -0,0 +1,28 @@
{
"time": "2026-11-11T09:13:10.454Z",
"realAPI": true,
"defaultCommon": true,
"commonNavigationEntries": 5,
"advancedNavigationEntries": 13,
"perAccountModeRemembered": true,
"actualUICreateEmployee": true,
"actualUIPreviewHasNoWrite": true,
"actualUIAdditiveGrant": true,
"actualUISelectiveRevoke": true,
"authorizationAuditVerified": true,
"temporaryUserRemoved": true,
"themes": [
"dark",
"light"
],
"viewportWidths": [
1440,
390
],
"scriptErrors": [],
"failedAPIResponses": [],
"blockedBusinessWrites": [],
"vmPowerActionsSubmitted": 0,
"gpuSwitchesSubmitted": 0,
"terminalCommandsSubmitted": 0
}
@@ -0,0 +1,18 @@
{
"time": "2026-11-11T09:18:05.152Z",
"realAPI": true,
"summaryUsesActualRunningState": true,
"commonPagesReadOnlyVerified": 5,
"professionalTasksReadOnlyVerified": true,
"viewportWidths": [
1440,
390
],
"themes": [
"dark",
"light"
],
"scriptErrors": [],
"failedAPIResponses": [],
"businessWrites": []
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

@@ -0,0 +1,7 @@
{
"businessIdentityAndConfigurationUnchanged": true,
"alertRulesUnchanged": true,
"liveDatabaseFsync": "on",
"apiImageUnchanged": true,
"temporaryUsersRemaining": 0
}
@@ -0,0 +1,22 @@
{
"time": "2026-11-11T07:55:38.379Z",
"realAPI": true,
"temporaryViewerAccount": true,
"actualUIEnrollmentAndConfirmation": true,
"recoveryDownloaded": true,
"actualUILoginChallengeAndRecoveryLogin": true,
"actualUIDisable": true,
"themes": [
"dark",
"light"
],
"viewportWidths": [
1440,
390
],
"scriptErrors": [],
"failedResponses": [],
"blockedWrites": [],
"screenshots": 3,
"screenshotsContainNoActiveSecrets": true
}
@@ -0,0 +1,19 @@
{
"time": "2026-11-11T07:48:31.875276+00:00",
"backup": ".local/live/backups/before-mfa-20261111-154828.dump",
"backupBytes": 265458,
"oldImageTag": "before-mfa-20261111-154828",
"oldImages": {
"api": "sha256:4bc0609343b3c9382c859444579c0246bc12bb6ff787c2d0fb784ec7942db3b7",
"console": "sha256:52c38fa17705374202f557edd959271e0fae1c88d9f104a356b266dbd54b5e83"
},
"deployedAt": "2026-11-11T07:52:43.214467+00:00",
"baselineBinarySHA256": "ac04d8f5423b07aa2afa442013a4ddeaee55bbf0343a0876c50a8e829c6a4779",
"baselineMatchesLiveBinary": true,
"existingGPUConfigurationPreserved": true,
"activeJobsBeforeDeployment": 0,
"newImages": {
"api": "sha256:106f7df40c654b281650a0011e39c365e7b7e8c6a1fae56eea8b81a4e5d164ca",
"console": "sha256:458f32152b048eb53d9841119a9fc99854c7394a9e35b988add3eb5c8915aba4"
}
}
@@ -0,0 +1,10 @@
{
"time": "2026-11-11T08:00:18.903056+00:00",
"deployedImagesMatchTestedRelease": true,
"originalBusinessIdentityAndAuthorizationSnapshotUnchanged": true,
"temporaryAccountsRemaining": 0,
"MFARowsRemainingAfterTemporaryTests": 0,
"rootMFAEnabled": false,
"terminalOnline": true,
"livePostgreSQLFsync": "on"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

@@ -0,0 +1,78 @@
{
"time": "2026-11-11T07:55:02.694317+00:00",
"realDatabase": true,
"temporaryViewerFullMFALifecycle": true,
"passwordAloneRejected": true,
"authenticatorLoginPassed": true,
"TOTPReplayRejected": true,
"recoveryLoginPassed": true,
"recoveryReplayRejected": true,
"rotationInvalidatedOldCodesAndOtherSessions": true,
"disableRestoredPasswordLogin": true,
"auditsHideSecrets": true,
"temporaryAccountCleaned": true,
"existingAccountsDeviceIdentityBindingsUnchanged": true,
"alertRulesUnchanged": true,
"vmConfigUnchanged": true,
"vmPowerStatesUnchanged": false,
"beforeVMs": [
{
"id": "desk_29cf3c79d9fc1b4a25e1bfe55c5c943f",
"vmid": 102,
"digest": "2fbb5c2e41737a6a640b0733c1ac5d20551c771a",
"powerState": "stopped"
},
{
"id": "desk_38010c040399376117ea116029767c25",
"vmid": 100,
"digest": "e83a4e40c5c927dc016e5f6d76b9081a420baef4",
"powerState": "stopped"
},
{
"id": "desk_bbec6e55af36b91f042f66df80902007",
"vmid": 101,
"digest": "5a71f3c510bf41641380dc9697bd1190f8847c31",
"powerState": "running"
}
],
"afterVMs": [
{
"id": "desk_29cf3c79d9fc1b4a25e1bfe55c5c943f",
"vmid": 102,
"digest": "2fbb5c2e41737a6a640b0733c1ac5d20551c771a",
"powerState": "stopped"
},
{
"id": "desk_38010c040399376117ea116029767c25",
"vmid": 100,
"digest": "e83a4e40c5c927dc016e5f6d76b9081a420baef4",
"powerState": "running"
},
{
"id": "desk_bbec6e55af36b91f042f66df80902007",
"vmid": 101,
"digest": "5a71f3c510bf41641380dc9697bd1190f8847c31",
"powerState": "stopped"
}
],
"beforeTaskCounts": {
"tasks": 61,
"snapshots": 0
},
"afterTaskCounts": {
"tasks": 62,
"snapshots": 0
},
"onlyConcurrentDevicePreparationTasksAdded": true,
"concurrentDeviceTasks": [
{
"id": "task_56e8d83030b6231eb805636061fc887e",
"kind": "gpu-prepare",
"action": "prepare-desktop",
"actor": "device:term_8f55853c7c3b1454018c4b9e20f3fa49",
"status": "success",
"created_at": "2026-11-11T07:51:04.237141+00:00"
}
],
"existingAccountsMFADefaultUnchanged": true
}
@@ -0,0 +1,18 @@
{
"goFullSuite": "passed",
"goVet": "passed",
"mfaAndLoginLimitTargeted": "passed",
"superAdminRestartAndPasswordChange": "passed",
"frontendLint": "passed",
"frontendTypecheck": "passed",
"frontendUnitTests": 3,
"productionDockerBuilds": "passed",
"newMFABrowserTests": 6,
"existingAccountSessionAndUIBrowserTests": 12,
"liveAPILifecycle": "passed",
"realBrowserLifecycle": "passed",
"testDatabase": "isolated disposable PostgreSQL, fsync disabled during testing",
"liveVMWritesFromThisWork": 0,
"liveTerminalCommandsFromThisWork": 0,
"concurrentDeviceVMPreparationObserved": true
}
@@ -0,0 +1,18 @@
{
"time": "2026-11-11T07:02:20.102Z",
"realAPI": true,
"themes": [
"dark",
"light"
],
"viewportWidths": [
1440,
390
],
"downloaded": true,
"details": true,
"scriptErrors": [],
"failedResponses": [],
"blockedWrites": [],
"screenshots": 4
}
@@ -0,0 +1,19 @@
{
"time": "2026-11-11T06:55:25.820094+00:00",
"backup": ".local/live/backups/before-task-history-20261111-145521.dump",
"backupBytes": 253717,
"oldImageTag": "before-task-history-20261111-145521",
"oldImages": {
"api": "sha256:d91b71e4c202737a1866bfbd1e9dec646b4e385b243fa99888951165637f66c1",
"console": "sha256:b4d15d6fa16c3576ca2beba1132369917554dcc3978e8609547a46483cf0324d"
},
"deployedAt": "2026-11-11T07:01:41.250632+00:00",
"baselineBinarySHA256": "913056171c513393c24d15abfabcd7efd142a0d0bef3db6ae934f7ffa2cd8a8a",
"baselineMatchesLiveBinary": true,
"existingGPUConfigurationPreserved": true,
"activeJobsBeforeDeployment": 0,
"newImages": {
"api": "sha256:92138b1111fab09270b192ce465ba66fa98393158bace1a359a7553f92dda046",
"console": "sha256:828b045abf8c6eca17592a1bfbd2b62f8e50b723f4dbd6439d7f3ebfbccc3fd7"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

@@ -0,0 +1,24 @@
{
"time": "2026-11-11T07:02:14.355093+00:00",
"mode": "production",
"realDatabase": true,
"matchingRecords": 51,
"pageSize": 2,
"pages": 26,
"csvRows": 51,
"csvMatchesAllPages": true,
"combinedFiltersAndActiveQueryPassed": true,
"exportAudited": true,
"authenticationEnforced": true,
"invalidFiltersRejected": true,
"administratorsUsersBindingsDeviceIdentityUnchanged": true,
"alertRulesUnchanged": true,
"vmConfigAndPowerUnchanged": true,
"vmPowerStates": [
"stopped",
"running",
"stopped"
],
"businessTaskAndSnapshotCountsUnchanged": true,
"taskCount": 51
}
@@ -0,0 +1,20 @@
{
"time": "2026-11-11T01:42:40.100Z",
"themes": [
"dark",
"light"
],
"viewportWidths": [
1440,
390
],
"scriptErrors": [],
"failedResponses": [],
"blockedWrites": [],
"source": "real terminal temperature with temporary 1C threshold and 60s hold; no physical overheating implied",
"finalRuleDisabled": true,
"finalEventResolvedByRuleChange": true,
"celsiusUnits": true,
"temperatureMaximum": 150,
"screenshots": 6
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

@@ -0,0 +1,146 @@
{
"time": "2026-11-11T01:42:43.541798+00:00",
"source": "real SoC temperature; temporarily lowered threshold 1C for validation, without heating/stressing the device",
"holdSeconds": 60,
"activatedAt": "2026-11-11 01:37:24.979235+00",
"observedDurationSeconds": 102.073948,
"sourceSamples": [
{
"sampled_at": "2026-11-11T01:37:26.316973+00:00",
"soc_temperature_c": 48.954
},
{
"sampled_at": "2026-11-11T01:37:56.312707+00:00",
"soc_temperature_c": 48.954
},
{
"sampled_at": "2026-11-11T01:38:26.31113+00:00",
"soc_temperature_c": 49.579
},
{
"sampled_at": "2026-11-11T01:38:56.30759+00:00",
"soc_temperature_c": 50.204
}
],
"firingEvent": {
"id": "alert_b20dcebcb3a28f413872433638e59087",
"ruleId": "rule_aaf4b97ba280dfd5d043deddee55dda8",
"ruleName": "终端温度链路验收",
"metric": "terminal_temperature",
"targetId": "term_8f55853c7c3b1454018c4b9e20f3fa49",
"targetName": "RK3528 联调终端",
"value": 50.829,
"threshold": 1,
"status": "firing",
"startedAt": "2026-11-11T01:37:26.316973Z",
"openedAt": "2026-11-11T01:39:08.390921Z",
"resolvedAt": null,
"resolveReason": "",
"acknowledgedAt": null,
"acknowledgedBy": "",
"dataFresh": true
},
"acknowledgedEvent": {
"id": "alert_b20dcebcb3a28f413872433638e59087",
"ruleId": "rule_aaf4b97ba280dfd5d043deddee55dda8",
"ruleName": "终端温度链路验收",
"metric": "terminal_temperature",
"targetId": "term_8f55853c7c3b1454018c4b9e20f3fa49",
"targetName": "RK3528 联调终端",
"value": 50.829,
"threshold": 1,
"status": "firing",
"startedAt": "2026-11-11T01:37:26.316973Z",
"openedAt": "2026-11-11T01:39:08.390921Z",
"resolvedAt": null,
"resolveReason": "",
"acknowledgedAt": "2026-11-11T01:40:08.101518Z",
"acknowledgedBy": "root",
"dataFresh": true
},
"finalEvent": {
"id": "alert_b20dcebcb3a28f413872433638e59087",
"ruleId": "rule_aaf4b97ba280dfd5d043deddee55dda8",
"ruleName": "终端温度链路验收",
"metric": "terminal_temperature",
"targetId": "term_8f55853c7c3b1454018c4b9e20f3fa49",
"targetName": "RK3528 联调终端",
"value": 52.704,
"threshold": 1,
"status": "resolved",
"startedAt": "2026-11-11T01:37:26.316973Z",
"openedAt": "2026-11-11T01:39:08.390921Z",
"resolvedAt": "2026-11-11T01:41:18.276284Z",
"resolveReason": "rule_changed",
"acknowledgedAt": "2026-11-11T01:40:08.101518Z",
"acknowledgedBy": "root",
"dataFresh": true
},
"finalRule": {
"id": "rule_aaf4b97ba280dfd5d043deddee55dda8",
"name": "终端 SoC 温度",
"metric": "terminal_temperature",
"threshold": 80,
"hold_seconds": 120,
"enabled": false
},
"latestTerminalMetrics": {
"cpuPercent": 45.50165281872599,
"memoryPercent": 16.847853703299627,
"socTemperatureC": 61.592,
"uptimeSeconds": 87935,
"sampledAt": "2026-11-11T01:42:26.324146Z",
"supported": true,
"online": true,
"fresh": true
},
"originalRulesUnchanged": true,
"businessSnapshotUnchanged": true,
"vmConfigurationDigestsUnchanged": true,
"vmPowerStatesPreserved": [
{
"vmid": 102,
"powerState": "running",
"configurationDigestUnchanged": true
},
{
"vmid": 100,
"powerState": "stopped",
"configurationDigestUnchanged": true
},
{
"vmid": 101,
"powerState": "stopped",
"configurationDigestUnchanged": true
}
],
"taskCountsBefore": {
"tasks": 7,
"snapshots": 0
},
"taskCountsAfter": {
"tasks": 8,
"snapshots": 0
},
"concurrentTaskNote": "One resource sync task was added by separate activity during validation; preserved, no terminal/desktop task was submitted by this work",
"terminalUpdated": false,
"powerWrites": 0,
"snapshotWrites": 0,
"diskWrites": 0,
"gpuWrites": 0,
"physicalCoolingRecoveryTested": false,
"images": {
"api": "sha256:040ca70d5ecf42a0db2c43d089bc3e1da85d98730a2eb22cfb043babe94fc2d4",
"console": "sha256:919d26c7ee5e0292fb22d1fcbb7b6144a6eb110cce6271351cc5bdc2a80d1034"
},
"deployment": {
"time": "2026-11-11T01:25:32.594530+00:00",
"backup": ".local/live/backups/before-terminal-alerts-20261111-092529.dump",
"backupBytes": 195633,
"oldImageTag": "before-terminal-alerts-20261111-092529",
"oldImages": {
"api": "sha256:525a99894a7e1efade08087082e356888192a452b90e537fb6a278c59b1e62fe",
"console": "sha256:17af96c4ba2ff10b9ea4c1380179d54e1e325edf5fda7d63225aca1d5e37e78e"
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

@@ -0,0 +1,26 @@
{
"time": "2026-11-11T01:43:21.093936+00:00",
"goAll": "passed",
"goVet": "passed",
"legacySchemaRepeatUpgrade": "passed",
"frontendLint": "passed",
"frontendTypecheck": "passed",
"frontendUnitTests": 3,
"frontendProductionBuild": "passed locally and in Docker",
"browserFixtureTests": 61,
"newFixtureCases": 4,
"newBackendTests": 5,
"liveDatabaseUsedForTests": false,
"terminalAgentUpdated": false,
"liveEvidence": "live-verification.json",
"browserEvidence": "browser-verification.json",
"limitations": [
"No external notifications",
"No physical overheating or cooling test; temporarily lowered threshold for real source validation",
"Fresh samples prove sampled continuity, not all moments between samples",
"One unrelated resource sync task was preserved during validation"
],
"temporaryDatabaseRemoved": true,
"temporaryViteStopped": true,
"finalDeploymentVerified": true
}
+250
View File
@@ -0,0 +1,250 @@
# Ubuntu、麒麟 GPU 链路优化实施记录
实施日期:2026-11-11。依据桌面上的《麒麟与Ubuntu云桌面画质帧率及延迟对齐说明_20261110.docx》,以及用户补充的“允许三桌面轮流使用同一块 GPU”。原 Word 文档保留为实施前说明。
## 已实施的链路
宿主为 i7-4720HQ,4 个物理核、8 个逻辑线程,约 23.35 GiB 内存。GTX 965M 2 GiB 是本轮三桌面轮流使用的设备。HD 4600 没有可用 mdev,不按共享 vGPU 处理。Ubuntu、麒麟各配置 8 vCPU、8 GiB;8 vCPU 不等于新增 8 个物理核。
| 项目 | Ubuntu VM102 | 麒麟 VM101 |
| --- | --- | --- |
| 会话 | GNOME Xorg、test2 自动登录 | UKUI / ukui-kwin_x11、test1 自动登录 |
| 渲染 | GTX 965M,glxinfo 与进程显存使用均已核实 | GTX 965M,glxinfo 与进程显存使用均已核实 |
| 驱动 | Ubuntu 官方 580.178.04 | 麒麟官方 580.95.05 |
| 实际捕获/编码 | NvFBC / CUDA / h264_nvenc | NvFBC / CUDA / h264_nvenc |
| 显示路径 | NVIDIA 渲染,modesetting PRIME 输出;虚拟源屏测试提高至约 119.9 Hz | NVIDIA 固定 2560×1440 整屏,无 RandR 物理输出 |
| 串流交付档位 | 2560×1440、45 FPS、25 Mbps、H.264 SDR | 2560×1440、45 FPS、25 Mbps、H.264 SDR |
| 光标 | 保留系统原生形状、本地移动和租约协议 | 保留系统原生形状、本地移动和租约协议 |
Sunshine 固定为 v2025.924.154138。当前 2026 构建在 Maxwell 上实际出现 CUDA kernel 不兼容,不能仅因为版本更新就替换。私有程序位于 `/opt/vdi-sunshine-maxwell/`,用户服务为 `vdi-sunshine.service`。旧的软件编码绑核已清除;未将整个 Sunshine 改为 SCHED_FIFO,也未把关闭提示音、窗口居中当作视频优化。
Ubuntu 尝试无 RandR 输出的 NVIDIA 整屏路径时,GNOME 实际黑屏,已回退到可用 PRIME 输出;它仍含显示复制,不能称全程零拷贝。麒麟旧内核的 PRIME 显存导入失败,改用驱动实际报告的整屏 NvFBC 捕获。适配器只在真实屏幕为 2K、驱动可采集且没有输出时枚举整屏,不伪造物理显示器或硬件支持。麒麟重启后桌面曾自动改大屏幕,已通过 ServerFlags 禁用自动添加/绑定其他 GPU,并固定 X screen。
麒麟 glibc 2.31 与该官方 Sunshine 构建不兼容,因此程序使用私有 runtime 的加载器和依赖库,未替换系统 glibc。初始依赖经 Ubuntu APT 签名仓库核对;补充的 libwayland-client、libffi8、libva 来自 Ubuntu 官方 HTTPS 仓库并记录下载散列,但本轮未额外完成它们的 APT 签名索引校验。KYSEC 保持开启,仅对本轮文件进行 verified 认证。
## 操作方式与隔离
平台设置 `VDI_EXCLUSIVE_GPU_NODE=starhe`、`VDI_EXCLUSIVE_GPU_VMIDS=100,101,102`。盒子退出串流后,选择下一台即可正常关闭上一台、等待 PVE 原任务和实际 stopped 状态、启动目标,再等待 Sunshine 响应。不会为了快速切换强制断电。**退出串流并不立即关闭虚拟机;选择另一台时才正常关闭上一台,因此切换前须保存当前桌面的工作。**
准备任务需要该终端已有桌面授权。共享组锁、持久任务预约、会话占用检查阻止相互抢占;票据签发和消费再次查实际 PVE 电源状态,不能依赖旧缓存。正在使用或管理任务未完成时拒绝切换。已知 PVE 操作结果不明时保留占用,管理员仅核对原 UPID,不自动重复提交。终端不接收 PVE root 凭据。
准备接口:`POST /api/v1/terminal/desktop-prepare`、`GET /api/v1/terminal/desktop-prepare/:id`。已知任务核对:管理员 `POST /api/v1/tasks/:id/gpu-reconcile`。未知 UPID 须人工核对 PVE 与任务记录,不能凭“现在看起来已开机”重发电源操作。管理端对共用组的普通 start/reboot 入口拒绝执行,须从终端选择页准备;正常 shutdown 及规格、快照操作受同一组预约约束。
Ubuntu 为唯一 onboot=1 的桌面,Windows 与麒麟 onboot=0,避免宿主启动时争用显卡。该模式是整卡轮流直通,不是三会话同时使用。将来迁移算力服务器仍需提供真正可并发的 GPU/编码会话容量,不能只提高显卡算力或显存就默认支持多 VM 共享。
客户端新增受范围校验的 `VDI_MOONLIGHT_BITRATE_KBPS`;盒子 `~/.config/vdi-terminal/render.conf` 的 `bitrate_kbps=25000` 由启动脚本按允许字段读取,不执行配置内容。缺少配置时继续使用原分辨率对应默认码率;本轮最终实际命令行已核实 25000。25 Mbps 是客户端请求档位,不等于持续视频净码率;Ubuntu 本轮 Sunshine 记录的视频编码预算为 18,988,000 bit/s,不能将二者混同,也不能用启动探测时的 1 Mbps 当作实际串流档位。
## 测量口径
拖框使用同几何和逐帧序号的 GTK / WinForms 参考窗口;盒子通过 XTest 注入,XGetImage 观察首次解码回显。一次拖框发送 300 次移动并检查松键。读取画面本身会阻塞发送循环,不能称真正恒定 60 Hz,也不能把“观察到的新画面次数”当作 Moonlight 呈现 FPS。
悬停、点击、掩码输入各 100 次,实际控件触发后更新唯一标记。点击计时从按下开始,包含人为 40 ms 按住时间;`click_release` 字段不能误读为从松键起算。输入为合成字符,无真实密码;提交页没有后台认证,所以不代表真实网站登录耗时。结果不包含 USB、真实面板扫描和人眼感知,不能作为物理零延迟证明。
### 早期与中间结果(30 Mbps,非最终验收)
| 配置 / 证据 | 拖框 P50 | P95 | 说明 |
| --- | ---: | ---: | --- |
| Ubuntu GPU、60 FPS | 124.14 ms | 157.50 ms | `ubuntu-gpu-60-drag.json` |
| Ubuntu GPU、45 FPS、源屏约 60 Hz | 126.60 ms | 159.28 ms | `ubuntu-gpu-45-drag.json` |
| Ubuntu GPU、45 FPS、源屏约 120 Hz | 97.59 ms | 128.94 ms | `ubuntu-gpu-source120-drag.json`;源屏提高频率,传输仍 45 FPS |
| 麒麟 GPU、60 FPS | 83.26 ms | 106.79 ms | `kylin-gpu-60-drag.json` |
| 麒麟 GPU、45 FPS | 81.22 ms | 101.44 ms | `kylin-gpu-45-drag.json` |
| Windows 旧参考 | 125.64 ms | 160.10 ms | `windows-baseline-drag.json`;测量时另一 VM 在驱动编译,不能用于宣称追平 |
`kylin-gpu-45-response.json` 的悬停 / 点击 / 掩码输入 P50 分别为 97.36 / 140.17 / 78.58 ms,P95 为 118.29 / 163.32 / 99.56 ms。`ubuntu-gpu-45-response.json` 为源屏 60 Hz 的中间结果,且网络延迟变化较大;不能与不同阶段网络条件混用。源屏 120 Hz 的一次 100 事件复测被 Wi-Fi 断开打断,该失败轮次不计入成功结果。
### 同档最终复测(45 FPS、客户端请求 25 Mbps)
各项为 P50 / P95,单位 ms。Windows 窗口实际由 WinForms 生成,Linux 为 GTK;JSON 中通用 method 文本仍写 GTK,应按这里解释。各系统顺序测量,无线环境并非严格恒定,因此只代表本轮观测,不能把所有差值归因于单一设置。
| 配置 | 拖框 | 悬停(100 次) | 点击(100 次) | 掩码字符(100 次) |
| --- | ---: | ---: | ---: | ---: |
| Windows | 84.88 / 121.39 | 63.63 / 101.82 | 141.37 / 153.49 | 90.05 / 105.07 |
| 麒麟,保留 XRender | 80.61 / 100.55 | 98.34 / 116.50 | 139.13 / 159.49 | 80.01 / 104.13 |
| Ubuntu,源屏约 120 Hz、定时捕获 | 91.38 / 117.43 | 118.43 / 151.82 | 174.60 / 211.69 | 88.02 / 120.11 |
原始证据分别为 `windows-final25-*`、`kylin-final25-*`、`ubuntu-final25-*`。拖框延迟已接近同档 Windows;麒麟悬停仍慢约 35 ms,Ubuntu 定时捕获时悬停慢约 55 ms、点击慢约 33 ms,不能宣称所有交互均已追平。Windows 悬停最大值还出现 845.91 ms 的孤立尖峰;P95 不能代替长稳验收,也不能隐去最大值。
麒麟额外测试 OpenGL 合成及 MaxFPS/RefreshRate=120:必须通过实际 D-Bus `compositingType=gl2` 才能生效,单改 Backend=OpenGL 会被系统恢复。实际 supportInformation 曾确认 NVIDIA OpenGL;其 Placeholder 源屏仍报告 60 Hz,不能声称变成真实 120 Hz 输出。拖框 97.07 / 109.11 ms,悬停 98.99 / 119.18 ms,点击 143.34 / 165.30 ms,未见收益,已恢复 `kwin-before-opengl120.conf`,不作为最终方案。证据保留为 `kylin-opengl120-25-*`。
Ubuntu 又测试仅在原生光标租约内启用 NvFBC `bPushModel=true`,由画面 damage 事件生成可采集帧,保留原 direct-capture 参数,不提高视频传输帧率。接口边界 14 情形通过、真实采集成功;拖框 81.42 / 99.50 ms,但悬停 119.14 / 156.67 ms、点击 172.05 / 250.00 ms、掩码输入 79.85 / 123.18 ms,未形成一致收益。测试期间还发生 AP 切换和断流,不能将拖框改善单独归因于 push。该实验的服务环境、适配器与 manifest 均已恢复,实验选项没有留在生产代码中;原始数据为 `ubuntu-push25-*`,不得将其当作当前保留配置的性能。回退后再次实际连接、核验 manifest、`nvfbc-v1`、2K/119.9 Hz 与硬件编码负载均通过。
### GPU 切换实测
已从选择页完成 Ubuntu→麒麟、麒麟→Windows、Windows→麒麟、麒麟→Ubuntu 的完整轮转。准备任务分别约 33、66、34、30 秒,含正常关机、开机和 Sunshine 就绪。最后一次 Ubuntu 冷启动后核对真实 2560×1440、约 119.9 Hz 源屏、NvFBC receipt 和 NVENC 编码负载均正常;桌面实际截图见 `ubuntu-final-desktop.jpg`,麒麟见 `kylin-final-desktop.png`。任务记录见 `gpu-switch-tasks.csv`,其中同一台重连的短任务不代表冷启动耗时。
实验重启 Sunshine 时另有一次准备任务在最终归属复核处失败,正常释放失败任务后,重新由用户界面准备成功;没有绕过复核或重复发送未知电源任务。不能把全部准备尝试描述为零失败。收尾仅 Ubuntu 运行,Windows、麒麟停止,盒子退出至选择页。
## 仍限制体验的部分
盒子是 RK3528,使用 RKMPP 硬解、DRM PRIME / NV12 帧和 EGL 呈现。60 FPS 串流实际接收/解码约 60,但呈现约 43,约 28% 帧被丢弃;盒子 GPU 曾达到 800 MHz 下约 90% 使用率。45 FPS 测试实际呈现约 43~44,排队和丢帧更少。客户端将部分“丢弃旧帧”记在 network jitter 栏,不能把这一栏全解释为 Wi-Fi 丢包。当前不构成稳定 2K60,也未完成直接 DRM scanout 绕开 GPU 合成的实现。
盒子当前走 5 GHz Wi-Fi,有线端口 NO-CARRIER。串流期间已发生 Wi-Fi 真正断开和重新关联,wpa_supplicant 原始记录含 reason=34 与关联拒绝;不是 Linux 编码器重启的推测。12:33、12:44 等记录还显示同 SSID 下尝试 2.4 GHz 接入失败,再关联 5 GHz;本轮没有修改路由器或锁定 BSSID。无线驱动为 `aicwf_sdio`,省电已关闭。网络延迟在不同测试从约 5 ms 上升到 16~40 ms,原生光标通道因此超时并正常结束串流。没有通过延长超时掩盖断网。证据见 `wifi-final.log`、`client-final.log`。提高服务器 GPU 算力不能消除盒子断网;下一步应优先让宿主与盒子稳定有线连接,再做同条件验收。
本轮核查宿主温度曾达 87~88°C,盒子约 76°C,需结合持续负载观察。存储 local 约 74.2%,local-lvm 约 93.8%,后者仅约 3.9 GiB 余量;未创建大快照或继续堆积大备份。迁移/扩容和稳定散热是长期运行条件,不能用持续写满测试验证性能。
收尾清理 Ubuntu 可再生成的 APT 安装缓存,约 772 MiB 降到 40 KiB,并执行根分区 fstrim。fstrim 报告的是发出的逻辑范围(约 28.4 GiB),不是宿主实际回收量。复查发现 Ubuntu 磁盘实际在 local 的 qcow2 文件中,local-lvm 实际使用率仍为 94.04%,不能宣称薄卷空间已释放。未删除系统、用户文件、回退备份或擅自扩大薄卷逻辑容量。
尚未完成 Word 文档提出的 10 分钟统一业务动态场景、每类 100 次真实拖窗/应用启动、物理相机延迟,以及 2 小时 / 8 小时长期验收。存在已捕获的 Wi-Fi 断流,故不得宣称已完成长稳或“全部操作与 Windows 完全相同”。
## 代码验证与回退
- 专用空测试数据库 `vdi_gpu_test_20261111`:共享组授权/占用、先关后开、缓存滞后票据、电源结果不明不重放、硬拒绝、原 UPID 核对和管理操作互斥。见 `exclusive-gpu-test.log`。该测试会清空自己的 fixture,严禁改为 live 数据库运行。
- 实际盒子编译并运行 6 项 CTest,含关机桌面可点、准备成功前不签发票据、失败不连接和码率范围验证。见 `kiosk-tests.log`。
- 麒麟实际 glibc 上,NvFBC ABI / 原参数不变 / 租约光标 / 整屏枚举 / 错版本拒绝等 10 情形通过。
- 两台 Linux 分别通过 host 回归:显示管理器重启后的旧就绪标记清除、manifest 不完整时不触碰运行中的捕获服务;本地 4 项光标输入边界测试通过。
- OpenAPI 与 TypeScript 类型已更新;控制台 typecheck 通过。Hardware、Snapshot、PowerBatch、DeviceIdentity、TerminalLifecycle 的专用数据库回归完整通过(344 秒),见 `maintenance-regressions.log`。
## 当前结论和下一步条件
### 后续修复:Ubuntu 双光标(2026-11-11)
用户反馈“一支鼠标拖着另一支”。现场核对:原生光标租约、适配器和 `nvfbc-v1` 均生效,但盒子根窗口截图仍能看到视频内箭头。原先仅确认 NvFBC 关闭光标参数和捕获就绪,未覆盖 PRIME 路径已将服务端软件光标画入画面的情形;这使本地即时光标与有视频延迟的光标叠加。
已在 Ubuntu 部署 guard 生命周期内的 XFixes 服务端光标隐藏,原生形状读取和盒子本地显示继续保留。配置标记是 `/home/test2/vdi-terminal/native-cursor-v1/hide-server-cursor`,未修改光标主题、移速、分辨率或编码档位。结束时先停视频生产者,再恢复服务端光标,显示连接断开也会释放隐藏状态。变更前 Python 文件备份在 `/var/backups/vdi-gpu-20261111/host-before-serverhide.py`。
Ubuntu 真实运行 3 项 host 回归全部通过,含捕获失败时停止/恢复顺序。盒子在三处纯桌面背景比较移动前后同一位置:超过 25 的通道变化像素数均为 0,最大通道差 0/1/0;同时本地原生光标保持 24×24、热点 (3,1)、254 个非透明像素,位置正确。见 `ubuntu-double-cursor-check.json`;该截图口径排除本地 X11 光标,因此用于检查视频中是否还有箭头,不冒充相机拍摄。随后 300 次拖框移动全部收到且松键成功,见 `ubuntu-cursorfix-drag.json`。退出后检查普通捕获已恢复、lease ready/drop-in 已清理;重新连接后重复三处检查仍通过,见 `ubuntu-double-cursor-reconnect.json` 和 `ubuntu-cursorfix-tests.log`。收尾保留 Ubuntu 串流供用户使用。这些检查用于验证重复光标和输入功能,不替代物理延迟或长稳验收。
已经实现三台轮流直通同一块 GTX 965M,Ubuntu、麒麟实际使用 GPU 渲染、NvFBC 捕获和 NVENC 编码;本轮不再依赖 4 核 CPU 承担 2K 软件编码。2K 画幅与 H.264 SDR 档位已对齐,拖框测得接近同档 Windows;当前保留的 Ubuntu 悬停、点击和麒麟悬停仍有可测差距,且反复出现无线断流,尚不满足“所有交互及长期稳定性与 Windows 一致”。分辨率相同也不等于已完成色彩或文字画质的客观一致性验收。
下一步应先给盒子接通稳定有线网络,宿主也保持有线;在固定网络、相同业务场景下重测并区分 GNOME/UKUI 重绘、显示复制与客户端呈现耗时,再决定是否重新试验事件触发捕获。若目标保持真 2K60,现有 RK3528 的 EGL 呈现路径还需继续减少复制/合成,或换实测可稳定 2K60 呈现的终端。当前 GTX 965M 已能完成单桌面硬编码,继续只加 VM CPU 核数不能解决无线断流和盒子呈现上限。
未来要求三个桌面同时运行时,需规划各 VM 可独立使用的物理 GPU,或硬件、驱动及授权均支持的 vGPU/编码方案,并按并发会话数验证;当前轮流直通方案不能直接变成同时共享。正式迁移前还应处理薄卷池余量与散热,再补齐 Word 中的长期及物理延迟验收。
PVE 变更前配置保存在 `/root/vdi-linux-gpu-20261111/{100,101,102}.conf.before`;Linux 备份在各自 `/var/backups/vdi-gpu-20261111/`。Ubuntu 的 headless 失败试验、PRIME 配置和提高源屏频率前脚本均有独立备份。回退显示配置时先退出串流,恢复对应 Xorg 与显示脚本,再正常重启显示管理器;必须目视确认桌面,不能只查服务 active。
平台部署前 API 镜像保留为 `vdi-cloud-live-api:before-gpu-20261111`,环境备份为工作站 `.local/live/env.before-gpu-20261111.bak`,不含于报告或仓库。盒子变更前文件在 `~/vdi-build/gpu-opt-20261111/`。回退共享组前先确认只有一台持有显卡,停用两项 group 环境变量并恢复 API/客户端;不要在 GPU 仍被别台使用时直接开机。
## 官方依据
- [Sunshine 配置](https://docs.lizardbyte.dev/projects/sunshine/latest/md_docs_2configuration.html)、[发行记录](https://github.com/LizardByte/Sunshine/releases)。实际使用选项按已装版本核验。
- [NVIDIA Xorg 配置选项](https://download.nvidia.com/XFree86/Linux-x86_64/580.82.09/README/xconfigoptions.html)。
- [Proxmox PCI 直通说明](https://github.com/proxmox/pve-docs/blob/master/qm-pci-passthrough.adoc)。
设备能枚举、编码测试能启动和完整交互桌面可用是不同证据;本报告按真实串流、GPU 编码负载和画面核验分别记录。
## 补充:Windows 硬编码故障与恢复(2026-11-11)
用户反馈 Windows 鼠标卡顿后,实际查到 GTX 965M 的设备管理器错误码为 43,`nvidia-smi` 无法连接驱动;Sunshine 13:38 的真实连接日志为 `Creating encoder [libx264]`,并非 NVENC。这是独立于 Ubuntu 双光标的故障,不能用鼠标移速或无线网络解释全部表现。
与原 PVE 备份比对,Windows 的 CPU、内存、PCI 直通和 QEMU 参数一致,只有 `onboot: 1→0`。公共客户端请求码率曾从 30 改为 25 Mbps,对 Windows 也有影响;45 FPS 在 11 月 9 日的客户端日志中已存在。Windows 内曾执行临时交互参考测试,相关计划任务已清理。本次排障还重启过显卡设备、Sunshine 服务,并在用户允许后正常关开机;不能描述为“Windows 内完全没有操作”。Ubuntu 隐藏服务端重复光标的补丁没有部署到 Windows。
显卡设备重启、Windows 正常关开机和宿主侧专用 PCI 总线复位均未恢复 NVENC;总线复位后宿主曾显示 D0,但 Windows 启动后又报 Code 43,物理设备显示 D3hot,尚不能据此单独确定驱动失败的根因。用户随后明确同意正常重启整台 Proxmox 宿主;执行前再次检查三台 VM 和容器列表、备份 Ubuntu 配置,将仍为 1 的 Ubuntu `onboot` 改为 0,避免宿主恢复时自动争用显卡。先正常关闭 Windows,确认三台全部停止后提交宿主重启。
当前排他切换只核验电源归属和 Sunshine `serverinfo`,不能证明 NVIDIA 驱动与硬件编码健康。此前完成过轮转不代表已证明长期可重复可靠;在恢复后完成跨系统重切和真实 NVENC 验证前,不应宣称该共享显卡方案已通过稳定性验收。禁止仅凭“连接服务已响应”报告硬编码恢复。
### Windows 恢复结果(13:44—13:47)
宿主启动 ID 已从 `f078a704-350d-4c7d-8839-c192ebe7c4b5` 变为 `df157c5a-ae91-4225-b4b7-f6ab8c0ed8c9`,确认实际完成宿主重启。随后从盒子启动 Windows,NVIDIA 设备错误码恢复为 0,`nvidia-smi` 正常返回 GTX 965M / 582.78。13:44:44 实际连接为 `Creating encoder [h264_nvenc]`,随后明确创建 H.264 P1 编码器;连续检查 GPU 编码负载约 10%—11%,Sunshine CPU 采样为 0%,不再是此前的软件编码状态。日志中的 HEVC 10-bit 探测失败不是当前流,当前流已核对为 H.264 SDR。
盒子日志确认实际串流为 2560×1440 / 45 FPS、RKMPP H.264 硬解;画面可用。完成 30 步桌面背景拖框,画面出现对应选框,finally 中释放鼠标按键,未重建 Windows 临时计划任务。证据为 `windows-recovery-nvenc.log` 和 `windows-recovery-desktop-drag.jpg`。这是短时功能与硬编码恢复核验,没有重新完成物理输入延迟或长期稳定性验收。
本次收尾状态取代前文“保留 Ubuntu”的旧状态:Windows 正在运行并连接,Ubuntu、麒麟关闭;三台 onboot 均为 0。Ubuntu 自动启动改动前备份为 `/root/vdi-linux-gpu-20261111/102.conf.before-windows-recovery`。未更换 Windows 显卡驱动,未修改其 CPU、内存、鼠标速度或直通参数。宿主重启前的 `power/control=on` 是临时状态,没有创建持久化规则。
本次恢复表明整机重新初始化后显卡可以重新供 Windows 使用,但没有证明跨系统切换失败的唯一根因,也没有修复自动切换的硬编码健康校验缺口。当前先保留 Windows 使用;不得将这次恢复表述为“共享 GPU 切换问题已彻底解决”。
## 后续修复:Windows→Ubuntu 一直“进入中”(2026-11-11 14:07)
13:49 的 Ubuntu 准备任务在 `service-waiting` 阶段等待 180 秒后失败。Windows 已正常关闭,Ubuntu 已开机,但 Linux NVIDIA 驱动从开机起报告 `fallen off the bus and is not responding to commands`,GNOME/Xorg 会话反复失败,Sunshine 未启动。Ubuntu 内停止桌面并卸载、重载 NVIDIA 模块仍返回 `No such device`。该现象不能解释成单纯页面动画或需要重复点击。
确认 VM100/101 关闭、VM102 正常关机、VFIO 组无人持有,且上游桥只有 GTX 965M 后,对 GPU 执行 sysfs `remove`、等待两秒、桥 `rescan`,核验同一 PCI 身份、vfio-pci 驱动和 D0,再启动 Ubuntu。此次无需重启宿主即恢复 GNOME、NvFBC 与 NVENC。首次恢复任务耗时 25.41 秒。该实验与前一轮只写 PCI `reset` 不同;不能将两者混称为已重复验证过的同一方法。
为使此步骤在后续开机时自动执行,增加 `tools/pve-shared-gpu-hook.py` 并部署为 `local:snippets/vdi-shared-gpu-reset.py`,绑定 VM100/101/102。实现仅适用于 starhe 的指定 GTX 965M、PCI 桥和 IOMMU 拓扑。每次 pre-start 必须确认三台全部停止、VFIO 组无人使用;使用 flock 和开机阶段预留,避免两次准备同时穿过检查。初始化失败保留 failed 预留,后续启动被阻止,不自动重放结果未明的操作;post-start 记录归属,post-stop 核验后释放。GPU 返回 D0 只代表开机前设备条件,仍不替代来宾驱动和真实硬编码核验。
部署前备份:`/root/vdi-linux-gpu-20261111/{100,101,102}.conf.before-gpu-hook` 和 `storage.cfg.before-gpu-hook`。local 存储内容类型保留原值并增加 snippets。Windows PVE 配置此次新增 hookscript,未修改 Windows 来宾鼠标、应用、驱动或硬件资源配置;不能再用此前“仅 onboot 不同”的历史对比描述当前配置。
验证结果:4 项本地回归通过,覆盖运行/占用拦截、连续启动预留、初始化失败不重放、错误 VM 不能认领。宿主实测在 Windows 运行时调用另一个 VM 的 pre-start,会拒绝操作并报告运行者,未重置正在使用的 GPU。部署后从盒子完成 Ubuntu→Windows(73.88 秒)和 Windows→Ubuntu(41.01 秒),均未重启宿主。Windows 设备错误码为 0,实际串流 H.264 NVENC,编码负载约 11%;最终 Ubuntu 实际连接确认 NvFBC、2560×1440、H.264 NVENC,编码负载约 29%,服务 active。1 Mbps 日志属于编码探测,最终会话实际视频预算为 18.988 Mbps,客户端请求档位仍为 25 Mbps。双光标隐藏标记保持存在。
当前仅 Ubuntu 运行并留在盒子桌面,Windows、麒麟停止,GPU 预留归属 VM102/running。本轮验证了一次双向轮转,未重新测试麒麟轮转,也未完成数十次循环或长期稳定性验收;不据此保证任意次数切换均无故障。平台当前仍以 serverinfo 判断服务就绪,硬编码健康尚需另行加强,不能把本钩子说成编码健康检查。
证据:`gpu-hook-unit-tests.log`、`gpu-hook-active-guard-test.log`、`gpu-hook-switch-tasks.csv`、`gpu-hook-windows-nvenc.log`、`gpu-hook-ubuntu-nvenc.log`、`gpu-hook-final-state.log` 及两台最终桌面截图。
回退时先退出串流,并逐台确认 hookscript 当前仍为本次路径,再执行 `qm set <VMID> --delete hookscript`;此操作只去掉本次钩子,不整份覆盖其他 VM 配置。保留 snippets 内容类型不会重置显卡。如出现 failed/prepared 预留,必须先核对所有 VM 实际电源、原启动任务、VFIO 占用及 PCI 设备状态,再由管理员处理 `/run/vdi-shared-gpu/reservation.json`;不要直接清空预留并反复开机。
## 补充验证:麒麟共享显卡切换(2026-11-11 14:30)
用户要求验证麒麟。开始检查时,用户已从 Ubuntu 切到麒麟,平台初次准备耗时 37.68 秒;同机重连的 0.49 秒任务不计为冷启动。NVIDIA 580.95.05 正常,OpenGL renderer 为 GTX 965M,源画面为 2560×1440,实际连接日志确认 NvFBC 与 H.264 NVENC,GPU 编码负载约 25%。现场看到软件商店正在安装更新,先等待并核对 aptdaemon 无活动事务、包管理锁释放、`dpkg --audit` 无异常后,才开始关机轮转,未中断或主动执行软件更新。
随后从盒子完成以下四次正常关机、共享 GPU 初始化、开机和连接服务准备:
| 方向 | 准备耗时 | 结果 |
| --- | ---: | --- |
| 麒麟→Windows | 79.31 秒 | 实际 H.264 NVENC,GPU 编码负载约 10% |
| Windows→麒麟 | 40.75 秒 | NVIDIA OpenGL、NvFBC、实际 H.264 NVENC,编码负载约 22% |
| 麒麟→Ubuntu | 36.82 秒 | 真 2560×1440、NvFBC、实际 H.264 NVENC,编码负载约 29% |
| Ubuntu→麒麟 | 38.01 秒 | NVIDIA OpenGL、NvFBC、实际 H.264 NVENC,编码负载约 23% |
四次均成功,宿主启动 ID 始终为 `df157c5a-ae91-4225-b4b7-f6ab8c0ed8c9`,本轮没有重启宿主或修改三台 VM 的配置。耗时以平台数据库任务创建到完成计算,不包含人手退出、检查和再次点击的间隔;服务准备完成也不等于最终画面已经出现,因此另外核对实际 CLIENT CONNECTED、最终编码器、GPU 负载和桌面截图。
麒麟启动后显示过其自身锁屏,最终通过 logind 解锁当前测试会话,并核对实际桌面。未关闭锁屏策略或修改登录配置。麒麟开机早期来宾日志时间有八小时偏差,最终已核对 NTPSynchronized=yes、系统时间恢复;轮转顺序与耗时依据平台记录,日志按当前 boot 和实际 Sunshine PID 筛选,避免混入旧启动记录。未修改 RTC 或 NTP 配置。
最终盒子日志确认 2560×1440 / 45 FPS 串流、RKMPP H.264 硬解;45 是协商串流帧率,不代表重新实测了终端持续呈现 45 FPS。请求码率仍为 25 Mbps,最终视频预算为 18.988 Mbps,1 Mbps 记录属于编码器探测阶段。保留原有麒麟桌面与光标配置。
最后从盒子发送 30 步桌面背景拖框,实际解码画面显示对应选框,finally 中松开鼠标按键成功。此检查验证基本输入和视频回显,不是物理输入延迟、掉帧率或画质客观一致性测量。此次完成了麒麟与另外两台各一次双向切换,未据此宣称两小时/八小时长稳,或麒麟全部交互延迟已经与 Windows 完全一致。
收尾仅麒麟 VM101 运行并连接,GPU 预留为 VM101/running;Windows、Ubuntu 均停止。结果取代前文保留 Ubuntu 的收尾状态。
证据:`kylin-cycle-switch-tasks.csv`、`kylin-cycle-windows-nvenc.log`、`kylin-cycle-return-from-windows.log`、`kylin-cycle-ubuntu-nvenc.log`、`kylin-cycle-return-from-ubuntu.log`、`kylin-cycle-final-state.log`、`kylin-cycle-final-drag.jpg` 和 `kylin-cycle-final-desktop.jpg`。
## 补充优化:终端调度对照与无线扫描(2026-11-11 15:43)
本轮保持 2560×1440、45 FPS、客户端请求 25 Mbps、H.264 SDR。两台实际 NvFBC / NVENC 保持有效,未调整原生鼠标样式或移速。没有修改 Windows 来宾的驱动、鼠标、应用或资源配置;为测试按平台流程正常关闭 Windows 并切到 Linux。此次持久调整在共用盒子的网络配置中,因而也影响盒子连接 Windows 时的网络路径。
### 实际保留的调整
盒子三次无线断开记录中有 `reason=34`。15:22:58 断开后,反复尝试同名 2.4 GHz 热点并被拒绝,直到 15:23:25 才恢复 5 GHz。先仅设置 5 GHz,15:30:31 仍断开,15:30:44 恢复;说明限制频段不足以修复断开本身。
进一步将盒子现有 YXTech 配置固定到当前 5 GHz 接入点 `f8:ce:21:a7:b9:50`。NetworkManager 文档说明固定 BSSID 会禁用漫游及后台扫描;此前断开间隔约五分钟,扫描参与问题是推断,尚未证明是唯一根因。Wi-Fi 省电原本已关闭,本轮没有把它记为新增优化。
配置已通过 nmcli 写入 `/etc/netplan/90-NM-9212612f-4dd0-4cf0-a21b-85413c900acf.yaml`,核对 `band: 5GHz` 和 BSSID。每次试验前设置了 90 秒自动回退,重连和 SSH 验证成功后取消回退;没有留下活动回退定时器。配置备份位于盒子 `/var/backups/vdi-wifi-20261111/`,不是 PVE,备份不复制到仓库以免带入无线凭据。
15:32:29—15:43:09 的约 10 分 40 秒观察中,没有再次出现无线断开或关联拒绝,越过两个此前约五分钟的周期。期间主动切换麒麟、Ubuntu并重连,不是同一桌面连续串流十分钟,也不是长期稳定性验收。若移动盒子、更换接入点或该 AP 不可用,需解除 BSSID 限制;本轮没有改路由器。
### 未保留的调度试验
确认 SDL 渲染线程申请高优先级因权限失败。先由 root 仅把当前 Moonlight 的 PacerRender 线程从 nice 0 临时改为 -10,保持普通 TS 调度;未使用 SCHED_FIFO、文件 capabilities、全进程提权或更改用户权限上限。固定接入点后,两台分别在同一连接内顺序 A/B,每类 50 次。表内为 P50 / P95,单位 ms:
| 系统 | PacerRender nice | 悬停回显 | 点击回显(含40ms按住) | 掩码字符回显 |
| --- | ---: | ---: | ---: | ---: |
| Ubuntu | 0 | 122.5 / 141.6 | 173.0 / 195.6 | 83.7 / 120.5 |
| Ubuntu | -10 | 121.7 / 151.0 | 172.8 / 213.7 | 79.1 / 105.9 |
| 麒麟 | 0 | 103.1 / 127.6 | 147.0 / 165.5 | 81.9 / 103.6 |
| 麒麟 | -10 | 101.3 / 121.3 | 146.5 / 172.8 | 86.1 / 99.6 |
悬停及点击中位数没有稳定收益,部分 P95 反而上升,因此两台试验均恢复 nice 0,没有持久化提权。Ubuntu 固定 AP 前另有两轮 A/B,同样没有一致收益;被断网打断的 A2、B2 与麒麟第一次 B 不计为完整结果。不能把警告消失或某一类输入的单轮改善解释为整体延迟降低。
### 功能与呈现复查
| 系统 | 拖动回显 P50 / P95(ms) | 观察到的新位置更新/秒 | 输入验证 |
| --- | ---: | ---: | --- |
| Ubuntu | 90.9 / 109.8 | 35.4 | 300 次末位置可见,松键成功 |
| 麒麟 | 84.4 / 106.9 | 37.2 | 300 次末位置可见,松键成功 |
以上为 XTest 输入至首次观察到唯一解码标记,排除实体 USB 鼠标和屏幕扫描;更新/秒是 60 Hz 拖动下采样到的独特位置,不等于解码或显示帧率。GTK 的合成页面提交没有业务后端,不能代表真实密码认证或应用启动耗时。
Ubuntu 在来宾内部另测本地 X11 标记,悬停中位数约 21 ms、点击约 78 ms(含40ms按住)、掩码字符约 5 ms,每类30次。它与盒子端测量路径不同,只用于区分来宾处理与串流路径,不将差值当作可直接消除的延迟。
结束前的 Ubuntu 单会话统计:接收/解码约45.03 FPS、呈现44.18 FPS、平均网络6 ms(variance栏1 ms)、解码7.67 ms、排队4.62 ms。麒麟对应会话呈现43.85 FPS。无线条件不恒定,不能将这几次统计差异全归因于固定 AP。network jitter 栏还包含客户端丢弃旧帧,不能全当无线丢包。
Ubuntu 再次退出和重连后,三处背景检查均未发现视频内重复箭头,仍有24×24的本地原生光标。临时 GTK 参考窗口已停止,桌面实际截图核验通过。
### 深层显示链路和边界
盒子仍是 RKMPP 硬解、DRM PRIME / EGL 呈现。现场 GPU 约800 MHz、90%—93%负载,不能承诺真2K60。部署源码明确要求 DRM master 才能直接设置显示 plane;现有原生光标实现也显式要求 X11。改成 DRM 直出需要同时完成 VT/显示所有权、光标后端、退出恢复及快捷键验证。本轮没有停掉 X11 或把“Direct rendering disabled”当成一个可随意开启的选项;没有声称已实现新的直接扫描输出或完全零拷贝链路。
本轮主要消除已观察到的无效频段重试并测试固定 AP 的短期稳定性,尚未证明 Ubuntu/麒麟全部交互延迟与 Windows 相同。继续提高 CPU 核数不能解决盒子 GPU 呈现吞吐和无线驱动/AP层问题。两小时/八小时、物理相机延迟及统一真实业务场景验收仍未完成。
### 收尾与回退
仅 Ubuntu VM102 运行并留在盒子上,Windows、麒麟停止;宿主未重启,共享 GPU 钩子和三台 VM 配置未改。Ubuntu 双光标修复、麒麟原有合成设置均保留。PacerRender / InputSend / FFDecoder 最终均为 nice 0、TS。
在盒子上解除本轮网络限制(会短暂断网):
```sh
sudo nmcli connection modify uuid 9212612f-4dd0-4cf0-a21b-85413c900acf 802-11-wireless.bssid '' 802-11-wireless.band ''
sudo nmcli connection up uuid 9212612f-4dd0-4cf0-a21b-85413c900acf ifname wlan0
```
证据:`wifi-before-5ghz.log`、`wifi-fixed-ap-final.log`、`*-sched-fixed-ap.jsonl`、`*-fixed-ap-drag.json`、`ubuntu-local-screen-response.raw`、`ubuntu-fixed-ap-client-stats.log`、`ubuntu-fixed-ap-double-cursor.json`、`optimization-host-final-state.log`。测量脚本为 `box-sched-pair.py`、`response-probe-50.py`、`guest-local-response.py`。
依据:[NetworkManager 无线配置](https://networkmanager.dev/docs/api/latest/settings-802-11-wireless.html)、[SDL Linux线程优先级实现](https://github.com/libsdl-org/SDL/blob/release-2.30.11/src/core/linux/SDL_threadprio.c),以及现场部署的 Moonlight DRM / 原生光标源码。
@@ -0,0 +1,21 @@
"""Sequential single-connection A/B experiment. Always restore normal nice."""
import json
import pathlib
import subprocess
import time
pid = int(subprocess.check_output(['pgrep', '-x', 'moonlight']))
tasks = pathlib.Path('/proc') / str(pid) / 'task'
tids = [int(p.name) for p in tasks.iterdir() if (p / 'comm').read_text().strip() == 'PacerRender']
assert len(tids) == 1
tid = tids[0]
results = []
try:
for label, priority in [('A', 0), ('B', -10)]:
assert int(subprocess.check_output(['pgrep', '-x', 'moonlight'])) == pid
subprocess.run(['sudo', '-n', 'renice', '-n', str(priority), '-p', str(tid)], check=True, stdout=subprocess.DEVNULL)
begin = time.time()
data = json.loads(subprocess.check_output(['python3', '/tmp/vdi-response-50.py'], timeout=150))
results.append(dict(label=label, nice=priority, started=begin, ended=time.time(), data=data))
print(json.dumps(results[-1]), flush=True)
finally:
subprocess.run(['sudo', '-n', 'renice', '-n', '0', '-p', str(tid)], stdout=subprocess.DEVNULL)
@@ -0,0 +1,44 @@
"""Run on the box with a focused, live Ubuntu stream and clear wallpaper."""
import ctypes as C, json, subprocess, time, os
os.environ.update(DISPLAY=':0',XAUTHORITY='/home/armbian/.Xauthority')
import gi
gi.require_version('Gdk','3.0')
from gi.repository import Gdk
x=C.CDLL('libX11.so.6'); f=C.CDLL('libXfixes.so.3')
class Cursor(C.Structure):
_fields_=[('x',C.c_short),('y',C.c_short),('w',C.c_ushort),('h',C.c_ushort),
('hx',C.c_ushort),('hy',C.c_ushort),('serial',C.c_ulong),
('pixels',C.POINTER(C.c_ulong)),('atom',C.c_ulong),('name',C.c_char_p)]
x.XOpenDisplay.argtypes=[C.c_char_p]; x.XOpenDisplay.restype=C.c_void_p
x.XFree.argtypes=[C.c_void_p]; x.XCloseDisplay.argtypes=[C.c_void_p]
f.XFixesGetCursorImage.argtypes=[C.c_void_p];f.XFixesGetCursorImage.restype=C.POINTER(Cursor)
display=x.XOpenDisplay(None); assert display
pid=int(subprocess.check_output(['pgrep','-x','moonlight']).strip())
def focused():
assert int(subprocess.check_output(['xdotool','getwindowfocus','getwindowpid']).strip())==pid
def move(px,py):
subprocess.run(['xdotool','mousemove',str(px),str(py)],check=True)
time.sleep(.5)
def patch(px,py):
p=Gdk.pixbuf_get_from_window(Gdk.get_default_root_window(),px-8,py-8,64,64)
assert p and p.get_n_channels()==3
return bytes(p.get_pixels())
results=[]
try:
focused()
for px,py in [(900,900),(1300,900),(1800,900)]:
move(400,1100); before=patch(px,py)
move(px,py); after=patch(px,py)
diffs=[max(abs(a-b) for a,b in zip(before[i:i+3],after[i:i+3])) for i in range(0,len(before)-2,3)]
ptr=f.XFixesGetCursorImage(display); assert ptr
try:
c=ptr.contents
opaque=sum(((c.pixels[i]>>24)&255)>0 for i in range(c.w*c.h))
assert opaque>0 and (c.x,c.y)==(px,py)
results.append(dict(point=[px,py],video_pixels_changed_over_25=sum(v>25 for v in diffs),
max_video_channel_difference=max(diffs),local_shape=[c.w,c.h,c.hx,c.hy],
local_opaque_pixels=opaque))
finally:x.XFree(ptr)
focused()
print(json.dumps(dict(method='XGetImage-style root capture excludes local X11 cursor; compare clear wallpaper at identical coordinates',pid=pid,points=results)))
finally:x.XCloseDisplay(display)
@@ -0,0 +1,5 @@
target_name,status,message,created_at,updated_at,provider_ref
Ubuntu,success,桌面已启动,连接服务已响应,2026-11-11 06:05:36.799346+00,2026-11-11 06:06:17.812001+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":102,""upid"":""UPID:starhe:00002202:00021B5D:6AF405B8:qmstart:102:vdi-cloud@pve!console:""}"
Windows 10,success,桌面已启动,连接服务已响应,2026-11-11 06:02:43.720719+00,2026-11-11 06:03:57.601456+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":100,""upid"":""UPID:starhe:00001E19:0001D561:6AF40505:qmstart:100:vdi-cloud@pve!console:""}"
Ubuntu,success,桌面已启动,连接服务已响应,2026-11-11 05:56:30.141686+00,2026-11-11 05:56:55.554019+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":102,""upid"":""UPID:starhe:00001602:0001417C:6AF4038B:qmstart:102:vdi-cloud@pve!console:""}"
Ubuntu,failed,桌面准备失败,请检查桌面授权、占用状态及 PVE,2026-11-11 05:52:35.605684+00,2026-11-11 05:55:35.920613+00,"{""phase"":""service-waiting"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49""}"
1 target_name status message created_at updated_at provider_ref
2 Ubuntu success 桌面已启动,连接服务已响应 2026-11-11 06:05:36.799346+00 2026-11-11 06:06:17.812001+00 {"phase":"completed","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49","vmid":102,"upid":"UPID:starhe:00002202:00021B5D:6AF405B8:qmstart:102:vdi-cloud@pve!console:"}
3 Windows 10 success 桌面已启动,连接服务已响应 2026-11-11 06:02:43.720719+00 2026-11-11 06:03:57.601456+00 {"phase":"completed","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49","vmid":100,"upid":"UPID:starhe:00001E19:0001D561:6AF40505:qmstart:100:vdi-cloud@pve!console:"}
4 Ubuntu success 桌面已启动,连接服务已响应 2026-11-11 05:56:30.141686+00 2026-11-11 05:56:55.554019+00 {"phase":"completed","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49","vmid":102,"upid":"UPID:starhe:00001602:0001417C:6AF4038B:qmstart:102:vdi-cloud@pve!console:"}
5 Ubuntu failed 桌面准备失败,请检查桌面授权、占用状态及 PVE 2026-11-11 05:52:35.605684+00 2026-11-11 05:55:35.920613+00 {"phase":"service-waiting","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49"}
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

@@ -0,0 +1,19 @@
target_name,status,created_at,updated_at,preparation_seconds
Ubuntu,success,2026-11-11 03:34:20.35987+00,2026-11-11 03:34:21.14229+00,0.78
Ubuntu,success,2026-11-11 03:36:59.766672+00,2026-11-11 03:37:06.633399+00,6.87
Ubuntu,success,2026-11-11 03:38:47.341838+00,2026-11-11 03:38:51.653688+00,4.31
Ubuntu,success,2026-11-11 03:47:14.234108+00,2026-11-11 03:47:14.895746+00,0.66
Ubuntu,success,2026-11-11 03:49:34.251688+00,2026-11-11 03:49:34.916777+00,0.67
麒麟,success,2026-11-11 03:54:05.573564+00,2026-11-11 03:54:38.369174+00,32.80
麒麟,success,2026-11-11 03:55:39.205627+00,2026-11-11 03:55:39.683346+00,0.48
麒麟,success,2026-11-11 03:57:28.883582+00,2026-11-11 03:57:29.518772+00,0.64
Windows 10,success,2026-11-11 04:03:38.760355+00,2026-11-11 04:04:44.266771+00,65.51
麒麟,success,2026-11-11 04:20:51.146116+00,2026-11-11 04:21:25.024756+00,33.88
麒麟,success,2026-11-11 04:30:55.592276+00,2026-11-11 04:30:56.188834+00,0.60
Ubuntu,success,2026-11-11 04:35:02.584931+00,2026-11-11 04:35:32.576797+00,29.99
Ubuntu,success,2026-11-11 04:39:44.196344+00,2026-11-11 04:39:44.64925+00,0.45
Ubuntu,failed,2026-11-11 04:43:00.674407+00,2026-11-11 04:43:15.965217+00,15.29
Ubuntu,success,2026-11-11 04:43:37.274209+00,2026-11-11 04:43:37.695784+00,0.42
Ubuntu,success,2026-11-11 04:45:13.187294+00,2026-11-11 04:45:14.066786+00,0.88
Ubuntu,success,2026-11-11 04:49:09.862518+00,2026-11-11 04:49:10.780778+00,0.92
Ubuntu,success,2026-11-11 04:50:10.359961+00,2026-11-11 04:50:11.386161+00,1.03
1 target_name status created_at updated_at preparation_seconds
2 Ubuntu success 2026-11-11 03:34:20.35987+00 2026-11-11 03:34:21.14229+00 0.78
3 Ubuntu success 2026-11-11 03:36:59.766672+00 2026-11-11 03:37:06.633399+00 6.87
4 Ubuntu success 2026-11-11 03:38:47.341838+00 2026-11-11 03:38:51.653688+00 4.31
5 Ubuntu success 2026-11-11 03:47:14.234108+00 2026-11-11 03:47:14.895746+00 0.66
6 Ubuntu success 2026-11-11 03:49:34.251688+00 2026-11-11 03:49:34.916777+00 0.67
7 麒麟 success 2026-11-11 03:54:05.573564+00 2026-11-11 03:54:38.369174+00 32.80
8 麒麟 success 2026-11-11 03:55:39.205627+00 2026-11-11 03:55:39.683346+00 0.48
9 麒麟 success 2026-11-11 03:57:28.883582+00 2026-11-11 03:57:29.518772+00 0.64
10 Windows 10 success 2026-11-11 04:03:38.760355+00 2026-11-11 04:04:44.266771+00 65.51
11 麒麟 success 2026-11-11 04:20:51.146116+00 2026-11-11 04:21:25.024756+00 33.88
12 麒麟 success 2026-11-11 04:30:55.592276+00 2026-11-11 04:30:56.188834+00 0.60
13 Ubuntu success 2026-11-11 04:35:02.584931+00 2026-11-11 04:35:32.576797+00 29.99
14 Ubuntu success 2026-11-11 04:39:44.196344+00 2026-11-11 04:39:44.64925+00 0.45
15 Ubuntu failed 2026-11-11 04:43:00.674407+00 2026-11-11 04:43:15.965217+00 15.29
16 Ubuntu success 2026-11-11 04:43:37.274209+00 2026-11-11 04:43:37.695784+00 0.42
17 Ubuntu success 2026-11-11 04:45:13.187294+00 2026-11-11 04:45:14.066786+00 0.88
18 Ubuntu success 2026-11-11 04:49:09.862518+00 2026-11-11 04:49:10.780778+00 0.92
19 Ubuntu success 2026-11-11 04:50:10.359961+00 2026-11-11 04:50:11.386161+00 1.03
@@ -0,0 +1,66 @@
"""Run on box: XTest input to decoded marker. Excludes USB and scanout."""
import ctypes as C
import os
import json
import statistics
import subprocess
import time
os.environ.setdefault('DISPLAY', ':0')
x=C.CDLL('libX11.so.6'); t=C.CDLL('libXtst.so.6')
x.XOpenDisplay.restype=C.c_void_p
x.XDefaultRootWindow.argtypes=[C.c_void_p]; x.XDefaultRootWindow.restype=C.c_ulong
x.XSync.argtypes=[C.c_void_p,C.c_int]
x.XGetImage.argtypes=[C.c_void_p,C.c_ulong,C.c_int,C.c_int,C.c_uint,C.c_uint,C.c_ulong,C.c_int]; x.XGetImage.restype=C.c_void_p
x.XGetPixel.argtypes=[C.c_void_p,C.c_int,C.c_int]; x.XGetPixel.restype=C.c_ulong
x.XDestroyImage.argtypes=[C.c_void_p]
x.XStringToKeysym.argtypes=[C.c_char_p]; x.XStringToKeysym.restype=C.c_ulong
x.XKeysymToKeycode.argtypes=[C.c_void_p,C.c_ulong];x.XKeysymToKeycode.restype=C.c_uint
t.XTestFakeMotionEvent.argtypes=[C.c_void_p,C.c_int,C.c_int,C.c_int,C.c_ulong]
t.XTestFakeButtonEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
t.XTestFakeKeyEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
d=x.XOpenDisplay(None);assert d;root=x.XDefaultRootWindow(d)
pid=os.getpid()
def key(name):
code=x.XKeysymToKeycode(d,x.XStringToKeysym(name.encode()));assert code
t.XTestFakeKeyEvent(d,code,1,0);t.XTestFakeKeyEvent(d,code,0,0);x.XSync(d,0)
def move(px,py):
t.XTestFakeMotionEvent(d,-1,px,py,0);x.XSync(d,0)
def read():
im=x.XGetImage(d,root,40,1380,1320,1,0xffffffff,2);assert im
try:
def val(offset,n):
pixels=[x.XGetPixel(im,offset+20+i*40,0)&0xffffff for i in range(n)]
if any(0x404040<v<0xc0c0c0 for v in pixels):return -1
return sum((1<<i) for i,v in enumerate(pixels) if v>0xc0c0c0)
return val(0,16),val(760,8),val(1120,4)
finally:x.XDestroyImage(im)
def await_marker(m,s):
deadline=time.monotonic()+4
while time.monotonic()<deadline:
seen,magic,mode=read()
if (seen,magic,mode)==(s,0x5a,m):return
time.sleep(.002)
raise AssertionError(('marker timeout',m,s,read()))
def sample(m,s,action):
start=time.monotonic();action();await_marker(m,s);return (time.monotonic()-start)*1000
def stats(a):
b=sorted(a);return dict(samples_ms=a,p50=statistics.median(b),p95=b[int(len(b)*.95)],maximum=max(b))
result={'pid':pid,'method':'Guest XTest to local X11 screen marker; actual buttons/masked entry; submit has no backend; no USB/scanout'}
for m in [1,2,3]:
move(300,300);time.sleep(.4);key('F'+str(m));await_marker(m,0)
values=[]
for i in range(1,31):
px=750 if i%2 else 1750
if m==1: action=lambda:move(px,550)
elif m==2:
move(px,550);time.sleep(.12)
def action():
t.XTestFakeButtonEvent(d,1,1,0);x.XSync(d,0);time.sleep(.04)
t.XTestFakeButtonEvent(d,1,0,0);x.XSync(d,0)
else:action=lambda:key('a')
values.append(sample(m,i,action));time.sleep(.12)
result[{1:'hover',2:'click_release',3:'masked_character'}[m]]=stats(values)
if m==3:result['synthetic_submit_ms']=sample(m,1030,lambda:key('Return'))
print(json.dumps(result))
Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

@@ -0,0 +1,5 @@
id,target_name,status,message,created_at,updated_at,provider_ref
task_4413c7c5f9ae12c1962baa0cc01d0def,Windows 10,success,桌面已启动,连接服务已响应,2026-11-11 06:18:03.365066+00,2026-11-11 06:19:22.675588+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":100,""upid"":""UPID:starhe:000031D9:00033D71:6AF4089F:qmstart:100:vdi-cloud@pve!console:""}"
task_931dd4228fa63682af8a983edd492f6c,麒麟,success,桌面已启动,连接服务已响应,2026-11-11 06:21:26.026028+00,2026-11-11 06:22:06.77583+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":101,""upid"":""UPID:starhe:000035D0:00038DB3:6AF4096D:qmstart:101:vdi-cloud@pve!console:""}"
task_00ef62c391c917bff472447d5f287b9c,Ubuntu,success,桌面已启动,连接服务已响应,2026-11-11 06:24:13.177068+00,2026-11-11 06:24:49.994688+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":102,""upid"":""UPID:starhe:000039A6:0003CDD1:6AF40A11:qmstart:102:vdi-cloud@pve!console:""}"
task_94ab84cc16a78268cc8fcf9c0771a014,麒麟,success,桌面已启动,连接服务已响应,2026-11-11 06:25:57.956284+00,2026-11-11 06:26:35.971051+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":101,""upid"":""UPID:starhe:00003BF1:0003F6CE:6AF40A7A:qmstart:101:vdi-cloud@pve!console:""}"
1 id target_name status message created_at updated_at provider_ref
2 task_4413c7c5f9ae12c1962baa0cc01d0def Windows 10 success 桌面已启动,连接服务已响应 2026-11-11 06:18:03.365066+00 2026-11-11 06:19:22.675588+00 {"phase":"completed","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49","vmid":100,"upid":"UPID:starhe:000031D9:00033D71:6AF4089F:qmstart:100:vdi-cloud@pve!console:"}
3 task_931dd4228fa63682af8a983edd492f6c 麒麟 success 桌面已启动,连接服务已响应 2026-11-11 06:21:26.026028+00 2026-11-11 06:22:06.77583+00 {"phase":"completed","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49","vmid":101,"upid":"UPID:starhe:000035D0:00038DB3:6AF4096D:qmstart:101:vdi-cloud@pve!console:"}
4 task_00ef62c391c917bff472447d5f287b9c Ubuntu success 桌面已启动,连接服务已响应 2026-11-11 06:24:13.177068+00 2026-11-11 06:24:49.994688+00 {"phase":"completed","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49","vmid":102,"upid":"UPID:starhe:000039A6:0003CDD1:6AF40A11:qmstart:102:vdi-cloud@pve!console:"}
5 task_94ab84cc16a78268cc8fcf9c0771a014 麒麟 success 桌面已启动,连接服务已响应 2026-11-11 06:25:57.956284+00 2026-11-11 06:26:35.971051+00 {"phase":"completed","node":"starhe","members":[100,101,102],"terminal":"term_8f55853c7c3b1454018c4b9e20f3fa49","vmid":101,"upid":"UPID:starhe:00003BF1:0003F6CE:6AF40A7A:qmstart:101:vdi-cloud@pve!console:"}
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 MiB

@@ -0,0 +1 @@
{"pid": 992309, "sent": 300, "elapsed": 7.083299948993954, "frames": [{"seq": 0, "t": 96067.229110928, "age_ms": null}, {"seq": 1, "t": 96067.294004533, "age_ms": 66.1280229978729}, {"seq": 2, "t": 96067.313168356, "age_ms": 51.013105010497384}, {"seq": 3, "t": 96067.346768634, "age_ms": 69.02826500299852}, {"seq": 4, "t": 96067.366134597, "age_ms": 70.88485300482716}, {"seq": 5, "t": 96067.387801092, "age_ms": 59.50848299835343}, {"seq": 6, "t": 96067.432348668, "age_ms": 70.67017098597717}, {"seq": 7, "t": 96067.454095378, "age_ms": 74.94629999564495}, {"seq": 8, "t": 96067.475747289, "age_ms": 80.56185400346294}, {"seq": 9, "t": 96067.497234397, "age_ms": 86.2246610049624}, {"seq": 10, "t": 96067.517303033, "age_ms": 71.57148300029803}, {"seq": 11, "t": 96067.545228544, "age_ms": 83.50059798976872}, {"seq": 12, "t": 96067.566523139, "age_ms": 88.741334999213}, {"seq": 13, "t": 96067.588773592, "age_ms": 77.14736799243838}, {"seq": 14, "t": 96067.611016169, "age_ms": 82.40297999873292}, {"seq": 15, "t": 96067.632855052, "age_ms": 71.13628600200173}, {"seq": 16, "t": 96067.654722229, "age_ms": 75.60871999885421}, {"seq": 18, "t": 96067.676727081, "age_ms": 64.60979398980271}, {"seq": 19, "t": 96067.719775386, "age_ms": 73.90264299465343}, {"seq": 20, "t": 96067.741812033, "age_ms": 79.22301099461038}, {"seq": 21, "t": 96067.763942602, "age_ms": 85.50740299688186}, {"seq": 22, "t": 96067.785481048, "age_ms": 73.2168890099274}, {"seq": 23, "t": 96067.807269177, "age_ms": 78.5813000111375}, {"seq": 24, "t": 96067.8292154, "age_ms": 84.81989699066617}, {"seq": 25, "t": 96067.851838045, "age_ms": 72.89690698962659}, {"seq": 27, "t": 96067.87370668, "age_ms": 62.59540499013383}, {"seq": 28, "t": 96067.916499468, "age_ms": 70.27901899709832}, {"seq": 29, "t": 96067.943252982, "age_ms": 81.56204799888656}, {"seq": 30, "t": 96067.964581704, "age_ms": 86.76719799404964}, {"seq": 31, "t": 96067.986240908, "age_ms": 74.4142629991984}, {"seq": 32, "t": 96068.008371477, "age_ms": 79.53132399416063}, {"seq": 33, "t": 96068.02977458, "age_ms": 85.29243001248688}, {"seq": 34, "t": 96068.052108164, "age_ms": 73.03195900749415}, {"seq": 35, "t": 96068.072991772, "age_ms": 76.85772300465032}, {"seq": 38, "t": 96068.142937101, "age_ms": 81.29602900589816}, {"seq": 39, "t": 96068.165238017, "age_ms": 87.2869860031642}, {"seq": 47, "t": 96068.184570144, "age_ms": 88.09700100391638}, {"seq": 49, "t": 96068.248013486, "age_ms": 103.52577798767015}, {"seq": 50, "t": 96068.269693984, "age_ms": 91.15213199402206}, {"seq": 54, "t": 96068.292184788, "age_ms": 88.35602200997528}, {"seq": 55, "t": 96068.313174571, "age_ms": 84.10293600172736}, {"seq": 57, "t": 96068.333641652, "age_ms": 55.16381100460421}, {"seq": 58, "t": 96068.393686843, "age_ms": 99.23214800073765}, {"seq": 59, "t": 96068.41603472, "age_ms": 87.64722199703101}, {"seq": 62, "t": 96068.438851047, "age_ms": 88.29739299835637}, {"seq": 63, "t": 96068.460583173, "age_ms": 80.90108999749646}, {"seq": 64, "t": 96068.482137079, "age_ms": 86.05081999849062}, {"seq": 65, "t": 96068.505580824, "age_ms": 77.0972019963665}, {"seq": 66, "t": 96068.529173037, "age_ms": 83.57089899072889}, {"seq": 67, "t": 96068.54921163, "age_ms": 87.60084399546031}, {"seq": 68, "t": 96068.577981576, "age_ms": 82.82388900988735}, {"seq": 69, "t": 96068.597587306, "age_ms": 85.25743198697455}, {"seq": 70, "t": 96068.619340142, "age_ms": 73.91606499732006}, {"seq": 71, "t": 96068.642292687, "age_ms": 80.24392000515945}, {"seq": 72, "t": 96068.664580477, "age_ms": 84.44945998780895}, {"seq": 73, "t": 96068.68721304, "age_ms": 75.2070710004773}, {"seq": 74, "t": 96068.709612838, "age_ms": 80.62952900945675}, {"seq": 75, "t": 96068.731251333, "age_ms": 86.76457799447235}, {"seq": 77, "t": 96068.775727156, "age_ms": 80.59481799136847}, {"seq": 78, "t": 96068.797177222, "age_ms": 85.74804999807384}, {"seq": 79, "t": 96068.843668601, "age_ms": 98.47842999442946}, {"seq": 80, "t": 96068.863950752, "age_ms": 101.69252600462642}, {"seq": 81, "t": 96068.890346076, "age_ms": 112.10808000760153}, {"seq": 82, "t": 96068.909531776, "age_ms": 97.59257599944249}, {"seq": 83, "t": 96068.955357234, "age_ms": 126.70204599271528}, {"seq": 85, "t": 96068.97643044, "age_ms": 97.86822000751272}, {"seq": 94, "t": 96069.024455217, "age_ms": 97.72237700235564}, {"seq": 96, "t": 96069.046867849, "age_ms": 114.25693599449005}, {"seq": 98, "t": 96069.067271925, "age_ms": 88.34464600658976}, {"seq": 100, "t": 96069.092646053, "age_ms": 64.71101200440899}, {"seq": 101, "t": 96069.135808119, "age_ms": 73.66696499229874}, {"seq": 103, "t": 96069.155692702, "age_ms": 61.04946900450159}, {"seq": 104, "t": 96069.206973289, "age_ms": 78.10673299536575}, {"seq": 106, "t": 96069.228615286, "age_ms": 67.35690800996963}, {"seq": 107, "t": 96069.250570554, "age_ms": 87.38879299198743}, {"seq": 108, "t": 96069.270971132, "age_ms": 74.97722700645681}, {"seq": 109, "t": 96069.297978124, "age_ms": 86.72637199924793}, {"seq": 110, "t": 96069.3189Line truncated
@@ -0,0 +1 @@
{"pid": 992309, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [87.1113090106519, 102.87089900521096, 96.50190100364853, 108.63172699464485, 72.52722799603362, 85.02545600640588, 98.86107599595562, 100.82092399534304, 87.1536129998276, 97.57531699142419, 96.88722700229846, 104.92701399198268, 103.99390599923208, 109.76494300120976, 98.36491900205147, 73.20220400288235, 79.4314830127405, 103.4364949882729, 82.17859698925167, 79.94601999234874, 103.81190200860146, 110.54550900007598, 136.48703599756118, 106.79761599749327, 125.9253269963665, 98.79896399797872, 96.08101900084876, 109.67395300394855, 92.68694301135838, 84.92572199611459, 116.49623799894471, 100.4732549918117, 97.41899400250986, 96.09882000950165, 98.32381400337908, 100.45721600181423, 111.7297759919893, 108.82660999777727, 97.75590199569706, 105.75631000392605, 100.05790099967271, 78.97413498722017, 80.54487701156177, 81.65970600384753, 105.83069499989506, 95.72721899894532, 106.66842199862003, 100.05586800980382, 101.52218099392485, 80.98503699875437, 78.63811799325049, 104.90780200052541, 104.89992899238132, 92.74967899546027, 82.48752399231307, 104.4486879982287, 118.50308100110851, 98.12315399176441, 94.79266399284825, 72.79503700556234, 79.19641499756835, 81.32486400427297, 102.13561401178595, 76.83112300583161, 102.4570540030254, 106.38229599862825, 104.60621300444473, 99.12161000829656, 98.30371699354146, 78.30765000835527, 82.22706000378821, 76.31600899912883, 80.13740999740548, 66.9989199959673, 77.76102999923751, 85.79469700634945, 93.33715900720563, 105.40515500179026, 105.06213099870365, 95.37430599448271, 100.05210600502323, 101.07797200907953, 103.81517000496387, 108.07847800606396, 113.98719999124296, 121.13705200317781, 99.57607599790208, 98.3177349990001, 95.65404300519731, 102.52708499319851, 82.40092100459151, 75.12797799427062, 80.23980600410141, 106.1445989907952, 101.77599400049075, 112.86800500238314, 94.68302199093159, 97.40301099373028, 96.17063400219195, 106.07460199389607], "p50": 98.34436650271527, "p95": 116.49623799894471, "maximum": 136.48703599756118}, "click_release": {"samples_ms": [127.60758399963379, 145.76077400124632, 150.2157249924494, 156.89158799068537, 133.79953800176736, 161.30133099795785, 146.99345899862237, 143.52383599907625, 147.02817700162996, 114.89730200264603, 130.62569900648668, 144.6882629970787, 125.05650300590787, 136.80248700256925, 128.17873500171117, 158.4013959945878, 159.26800099259708, 161.86227400612552, 158.5848749964498, 142.51374700688757, 139.12317300855648, 140.18491699243896, 143.20184499956667, 149.1123229934601, 168.7099590053549, 159.49146100319922, 148.41023599728942, 140.70617499237414, 138.37209300254472, 154.04711100563873, 130.85763300477993, 134.86396700318437, 128.90332499227952, 127.60677699407097, 126.05674599763006, 150.15017898986116, 144.62852499855217, 150.20910000021104, 126.41699200321455, 148.3163419907214, 142.78302699676715, 146.12868799304124, 123.85743399499916, 123.07484001212288, 136.6254989989102, 126.70606700703502, 120.79588600317948, 131.11639200360514, 146.16487501189113, 122.72628300706856, 137.91885400132742, 157.55675699620042, 136.30232399736997, 150.22693399805576, 125.303648004774, 117.06316900381353, 136.13636400259566, 129.16035200760234, 128.00877199333627, 148.34701600193512, 154.81607399124186, 143.84394099761266, 142.5899739988381, 120.58152700774372, 139.13814201077912, 127.9066910065012, 145.02324600471184, 147.42267401015852, 151.29191800951958, 160.4693050030619, 152.86558000661898, 154.04400500119664, 157.05247600271832, 110.67902400100138, 121.40352399728727, 136.87087199650705, 134.37285899999551, 130.66696100577246, 132.13473600626457, 133.78511200426146, 151.62680301000364, 132.58102899999358, 121.09638898982666, 141.08053100062534, 130.46162801038008, 133.31287901382893, 148.30682300089393, 125.12986299407203, 141.18671500182245, 131.54729999951087, 153.9159940002719, 152.387550988351, 137.01295899227262, 131.8979140050942, 132.53204998909496, 129.04841698764358, 141.322659997968, 152.74809100083075, 132.7024009951856, 127.12970100983512], "p50": 139.1306575096678, "p95": 159.49146100319922, "maximum": 168.7099590053549}, "masked_character": {"samples_ms": [106.87107600097079, 60.395221997168846, 129.88790900271852, 81.40873699449003, 82.52940198872238, 78.23487700079568, 73.30126300803386, 74.75503800378647, 94.98682800040115, 87.79962999687996, 103.40087000804488, 104.13300999789499, 99.93590699741617, 87.83259299525525, 85.21673300128896, 68.77601699670777, 79.34446699800901, 80.91958401200827, 96.57157800393179, 104.11288699833676, 102.64832401298918, 100.73368200391997, 80.56197699625045, 75.79987400094979, 70.91701099125203, 94.71032100555021, 99.61739399295766, 91.05459200509358, 76.97158800147008, 78.9352349966066, 81.99767299811356, 77.3265750030987, 72.2535329987295, 77.20902499568183, 80.37442801287398, 78.1750999885844, 9Line truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

@@ -0,0 +1 @@
{"pid": 1192725, "sent": 300, "elapsed": 7.524139223998645, "frames": [{"seq": 0, "t": 109109.676613549, "age_ms": null}, {"seq": 1, "t": 109109.747257562, "age_ms": 77.29586301138625}, {"seq": 2, "t": 109109.769030145, "age_ms": 82.04231000854634}, {"seq": 3, "t": 109109.790895183, "age_ms": 70.94908700673841}, {"seq": 4, "t": 109109.812767805, "age_ms": 75.52170599228702}, {"seq": 5, "t": 109109.834917502, "age_ms": 82.2730119980406}, {"seq": 6, "t": 109109.855947815, "age_ms": 85.83795100275893}, {"seq": 7, "t": 109109.875336091, "age_ms": 71.58898501074873}, {"seq": 8, "t": 109109.905362604, "age_ms": 85.62329100095667}, {"seq": 9, "t": 109109.927642089, "age_ms": 91.41037399240304}, {"seq": 10, "t": 109109.950237148, "age_ms": 80.13924000260886}, {"seq": 11, "t": 109109.972660129, "age_ms": 85.62183199683204}, {"seq": 12, "t": 109109.997210174, "age_ms": 77.17365799180698}, {"seq": 13, "t": 109110.016767612, "age_ms": 80.01674299885053}, {"seq": 14, "t": 109110.040466307, "age_ms": 87.66810699307825}, {"seq": 15, "t": 109110.063882967, "age_ms": 77.01674599957187}, {"seq": 16, "t": 109110.087882361, "age_ms": 84.4347829988692}, {"seq": 17, "t": 109110.115056456, "age_ms": 95.75987499556504}, {"seq": 18, "t": 109110.138091627, "age_ms": 83.73101099277847}, {"seq": 19, "t": 109110.164087423, "age_ms": 94.47687001375016}, {"seq": 20, "t": 109110.213589711, "age_ms": 108.76696099876426}, {"seq": 22, "t": 109110.240553521, "age_ms": 86.96492199669592}, {"seq": 23, "t": 109110.266036582, "age_ms": 96.02003800682724}, {"seq": 24, "t": 109110.287689877, "age_ms": 83.64643401000649}, {"seq": 25, "t": 109110.312530123, "age_ms": 91.71661900472827}, {"seq": 26, "t": 109110.338124889, "age_ms": 83.04299299197737}, {"seq": 27, "t": 109110.359621856, "age_ms": 89.91329600394238}, {"seq": 28, "t": 109110.38763651, "age_ms": 84.11162800621241}, {"seq": 29, "t": 109110.409038105, "age_ms": 88.06039100454655}, {"seq": 30, "t": 109110.43359515, "age_ms": 80.2897379908245}, {"seq": 31, "t": 109110.457923828, "age_ms": 87.78156599146314}, {"seq": 32, "t": 109110.47986149, "age_ms": 75.99740300793201}, {"seq": 33, "t": 109110.501125713, "age_ms": 80.50468999135774}, {"seq": 35, "t": 109110.551046823, "age_ms": 80.55077301105484}, {"seq": 36, "t": 109110.572806282, "age_ms": 86.194068993791}, {"seq": 38, "t": 109110.595672585, "age_ms": 90.81218700157478}, {"seq": 39, "t": 109110.617865156, "age_ms": 110.78757200448308}, {"seq": 41, "t": 109110.640004938, "age_ms": 87.40299299824983}, {"seq": 42, "t": 109110.683985551, "age_ms": 97.41270499944221}, {"seq": 44, "t": 109110.706069918, "age_ms": 86.39472999493591}, {"seq": 46, "t": 109110.750537601, "age_ms": 79.92924899735954}, {"seq": 47, "t": 109110.799899018, "age_ms": 113.81498500122689}, {"seq": 48, "t": 109110.821887429, "age_ms": 101.75987301045097}, {"seq": 50, "t": 109110.844030419, "age_ms": 91.46637600497343}, {"seq": 51, "t": 109110.888398646, "age_ms": 101.81616300542373}, {"seq": 52, "t": 109110.912002844, "age_ms": 108.15214799367823}, {"seq": 53, "t": 109110.934274455, "age_ms": 97.4827030004235}, {"seq": 55, "t": 109110.9774533, "age_ms": 107.82986499543767}, {"seq": 56, "t": 109110.999278382, "age_ms": 95.96433000115212}, {"seq": 58, "t": 109111.02062952, "age_ms": 84.52986700285692}, {"seq": 59, "t": 109111.065194325, "age_ms": 94.49670599133242}, {"seq": 60, "t": 109111.087178944, "age_ms": 99.93846599536482}, {"seq": 61, "t": 109111.109252228, "age_ms": 106.28903500037268}, {"seq": 62, "t": 109111.133034337, "age_ms": 96.38256800826639}, {"seq": 63, "t": 109111.154361267, "age_ms": 101.17976400943007}, {"seq": 65, "t": 109111.198051391, "age_ms": 94.4450849929126}, {"seq": 66, "t": 109111.220509081, "age_ms": 100.19221200491302}, {"seq": 67, "t": 109111.242965313, "age_ms": 106.770857993979}, {"seq": 68, "t": 109111.266654676, "age_ms": 96.72060499724466}, {"seq": 69, "t": 109111.295130735, "age_ms": 108.40822799946181}, {"seq": 70, "t": 109111.317757295, "age_ms": 115.2411989896791}, {"seq": 72, "t": 109111.336481175, "age_ms": 83.07478700589854}, {"seq": 75, "t": 109111.366233823, "age_ms": 62.60299800487701}, {"seq": 76, "t": 109111.388178194, "age_ms": 68.87948499934282}, {"seq": 77, "t": 109111.408492779, "age_ms": 54.69555799209047}, {"seq": 78, "t": 109111.433998299, "age_ms": 64.71956300083548}, {"seq": 79, "t": 109111.476993984, "age_ms": 73.61659999878611}, {"seq": 81, "t": 109111.500385563, "age_ms": 63.600469002267346}, {"seq": 82, "t": 109111.541699838, "age_ms": 71.34691398823634}, {"seq": 83, "t": 109111.571631273, "age_ms": 84.95627499360126}, {"seq": 84, "t": 109111.594858649, "age_ms": 92.20427599211689}, {"seq": 85, "t": 109111.616495321, "age_ms": 79.5576800010167}, {"seq": 86, "t": 109111.638547897, "age_ms": 85.05252200120594}, {"seq": 87, "t": 109111.663801132, "age_ms": 77.20224700460676}, {"seq": 88, "t": 109111.682138857, "age_ms": 77.87831099994946}, {"seq": 89, "t": 109111.703820153, "age_ms": 84.54532899486367}, {"seq": 90, "tLine truncated
@@ -0,0 +1 @@
{"pid": 953865, "sent": 300, "elapsed": 7.319189985995763, "frames": [{"seq": 0, "t": 94358.472802896, "age_ms": null}, {"seq": 1, "t": 94358.53552988, "age_ms": 83.28451600391418}, {"seq": 2, "t": 94358.580303368, "age_ms": 94.20349900028668}, {"seq": 4, "t": 94358.602522256, "age_ms": 81.65320199623238}, {"seq": 5, "t": 94358.623950716, "age_ms": 87.12027700676117}, {"seq": 6, "t": 94358.647086908, "age_ms": 77.10022298851982}, {"seq": 7, "t": 94358.668776705, "age_ms": 83.21188999980222}, {"seq": 8, "t": 94358.712293967, "age_ms": 91.74442299990915}, {"seq": 10, "t": 94358.735776372, "age_ms": 83.36793300986756}, {"seq": 11, "t": 94358.757000955, "age_ms": 87.24569500191137}, {"seq": 13, "t": 94358.77889813, "age_ms": 59.182311000768095}, {"seq": 14, "t": 94358.823030817, "age_ms": 69.91637400642503}, {"seq": 16, "t": 94358.844720323, "age_ms": 57.29811800119933}, {"seq": 17, "t": 94358.866259618, "age_ms": 63.85691599280108}, {"seq": 19, "t": 94358.910305679, "age_ms": 57.354118005605415}, {"seq": 20, "t": 94358.930264994, "age_ms": 61.201545991934836}, {"seq": 22, "t": 94358.980826395, "age_ms": 61.07525299012195}, {"seq": 23, "t": 94359.002481192, "age_ms": 66.60970399389043}, {"seq": 24, "t": 94359.02434745, "age_ms": 86.54101900174282}, {"seq": 25, "t": 94359.046538045, "age_ms": 76.0114160075318}, {"seq": 26, "t": 94359.068795725, "age_ms": 83.11155500996392}, {"seq": 27, "t": 94359.089309798, "age_ms": 69.46720200357959}, {"seq": 28, "t": 94359.113318377, "age_ms": 76.26808699569665}, {"seq": 30, "t": 94359.135309469, "age_ms": 65.18139199761208}, {"seq": 31, "t": 94359.180451045, "age_ms": 76.83509300113656}, {"seq": 33, "t": 94359.202496388, "age_ms": 66.25794699357357}, {"seq": 34, "t": 94359.252085649, "age_ms": 81.69403299689293}, {"seq": 35, "t": 94359.276868029, "age_ms": 91.07299400784541}, {"seq": 36, "t": 94359.299706132, "age_ms": 80.02100900921505}, {"seq": 37, "t": 94359.321712975, "age_ms": 84.67024000128731}, {"seq": 39, "t": 94359.343381771, "age_ms": 87.70507300505415}, {"seq": 40, "t": 94359.36735914, "age_ms": 80.80064599926118}, {"seq": 41, "t": 94359.387642792, "age_ms": 84.83357600925956}, {"seq": 42, "t": 94359.411331991, "age_ms": 74.62160299473908}, {"seq": 43, "t": 94359.434819937, "age_ms": 81.20548499573488}, {"seq": 45, "t": 94359.477128223, "age_ms": 74.25993100332562}, {"seq": 46, "t": 94359.50165335, "age_ms": 81.74536700244062}, {"seq": 47, "t": 94359.521679748, "age_ms": 84.83415898808744}, {"seq": 48, "t": 94359.546005372, "age_ms": 76.20129099814221}, {"seq": 49, "t": 94359.567836045, "age_ms": 80.29867999721318}, {"seq": 50, "t": 94359.590263477, "age_ms": 87.10977400187403}, {"seq": 51, "t": 94359.614128553, "age_ms": 77.78535500983708}, {"seq": 52, "t": 94359.635944643, "age_ms": 82.8840489994036}, {"seq": 53, "t": 94359.658132612, "age_ms": 88.69646101084072}, {"seq": 55, "t": 94359.700865863, "age_ms": 81.53332199435681}, {"seq": 56, "t": 94359.724700022, "age_ms": 87.3673189926194}, {"seq": 58, "t": 94359.771153823, "age_ms": 84.65215600153897}, {"seq": 59, "t": 94359.791912607, "age_ms": 89.21913600352127}, {"seq": 60, "t": 94359.816619444, "age_ms": 80.09538600163069}, {"seq": 61, "t": 94359.838824039, "age_ms": 86.18371900229249}, {"seq": 63, "t": 94359.860314624, "age_ms": 56.547355008660816}, {"seq": 64, "t": 94359.881965337, "age_ms": 61.730343993986025}, {"seq": 65, "t": 94359.924834797, "age_ms": 71.22976399841718}, {"seq": 67, "t": 94359.955094169, "age_ms": 69.3277800019132}, {"seq": 68, "t": 94359.998721682, "age_ms": 79.10137200087775}, {"seq": 69, "t": 94360.020694399, "age_ms": 84.34444401063956}, {"seq": 70, "t": 94360.042012023, "age_ms": 71.60047799698077}, {"seq": 71, "t": 94360.063317689, "age_ms": 76.54837900190614}, {"seq": 72, "t": 94360.089008915, "age_ms": 86.33334600017406}, {"seq": 73, "t": 94360.110359499, "age_ms": 73.28896000399254}, {"seq": 74, "t": 94360.132210297, "age_ms": 79.17954000004102}, {"seq": 75, "t": 94360.154963524, "age_ms": 85.1617039879784}, {"seq": 76, "t": 94360.176429609, "age_ms": 72.74703499570023}, {"seq": 77, "t": 94360.198263198, "age_ms": 78.55711301090196}, {"seq": 78, "t": 94360.220895964, "age_ms": 84.99807499174494}, {"seq": 79, "t": 94360.242322965, "age_ms": 71.9006050057942}, {"seq": 80, "t": 94360.265077941, "age_ms": 78.76507300534286}, {"seq": 81, "t": 94360.286429982, "age_ms": 84.03381101379637}, {"seq": 82, "t": 94360.307926984, "age_ms": 70.53558599727694}, {"seq": 83, "t": 94360.327421083, "age_ms": 74.20713700412307}, {"seq": 85, "t": 94360.380293386, "age_ms": 76.55333400180098}, {"seq": 86, "t": 94360.402028974, "age_ms": 82.31762099603657}, {"seq": 88, "t": 94360.446102158, "age_ms": 75.77340700663626}, {"seq": 89, "t": 94360.466148098, "age_ms": 80.3398029966047}, {"seq": 91, "t": 94360.514563091, "age_ms": 77.33530399855226}, {"seq": 92, "t": 94360.536196302, "age_ms": 83.06779799750075}, {"seq": 94, "t": 94360.558434439, "age_ms": 86.90530899912119}, {"seq": 95, "t": 94360.580012Line truncated
@@ -0,0 +1 @@
{"pid": 942073, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [90.11059300974011, 95.53625600528903, 73.85868301207665, 98.86247200483922, 109.5367560046725, 77.73236199864186, 83.69032500195317, 101.4592139981687, 97.9124939913163, 101.30783700151369, 100.07610599859618, 104.77434199128766, 104.50833800132386, 145.1978980039712, 127.00374699488748, 104.85658700054046, 90.47312599432189, 87.9230459977407, 94.1251350013772, 85.079249998671, 106.44648100424092, 125.42638400918804, 106.34439600107726, 99.78092000528704, 111.13012699934188, 96.09449100389611, 104.00314800790511, 98.36222999729216, 104.9916150077479, 86.80943401122931, 102.22103400155902, 87.81978199840523, 104.41030999936629, 103.47229699254967, 76.5090710046934, 98.80206199886743, 81.59260298998561, 95.73630499653518, 98.34063400921877, 82.5037790054921, 99.18239600665402, 106.11191000498366, 96.1239300086163, 109.06449300819077, 74.6840789943235, 105.70035999990068, 74.16431899764575, 104.63809099746868, 111.12339200917631, 74.96932899812236, 101.17945699312259, 78.61900400894228, 75.76617099402938, 80.68811599514447, 81.96155099722091, 80.12052500271238, 77.07081000262406, 98.14694500528276, 80.96461700915825, 82.01200699841138, 87.31078999699093, 71.95460901129991, 106.90114900353365, 97.5411409890512, 82.28471499751322, 100.31813400564715, 106.70776599727105, 108.35862300882582, 100.73084800387733, 118.29118100285996, 75.48031900660135, 82.52183499280363, 85.25858299981337, 72.98361700668465, 79.00457699724939, 81.12706099927891, 78.51602499431465, 109.03178899025079, 69.95927898969967, 86.00758700049482, 96.32689600402955, 105.30831399955787, 97.18557499581948, 103.56441501062363, 107.02333301014733, 75.43976599117741, 81.53685099387076, 81.2349720072234, 105.16859900963027, 121.74570100614801, 77.40824700158555, 105.10821799107362, 102.46130599989556, 100.57769299601205, 77.43391201074701, 83.43591200537048, 100.67715200420935, 117.70605499623343, 95.96462298941333, 74.43640800192952], "p50": 97.36335799243534, "p95": 118.29118100285996, "maximum": 145.1978980039712}, "click_release": {"samples_ms": [147.9692130087642, 121.90376900252886, 136.30617599119432, 129.2976139957318, 130.54304900288116, 139.1522859921679, 135.91678299417254, 130.60750099248253, 165.12234299443662, 152.0616229972802, 133.89374400139786, 147.21492399985436, 162.64342700014822, 157.0716340065701, 154.23076300066896, 135.9199659927981, 125.18123700283468, 144.28128699364606, 142.43238099152222, 145.00316500198096, 146.37925999704748, 145.25545400101691, 141.46461099153385, 138.59689900709782, 150.72864599642344, 128.70226200902835, 139.12452499789651, 148.8170299999183, 129.21092800388578, 139.35872999718413, 132.99272599397227, 132.46946499566548, 151.6774289921159, 146.81294100591913, 145.65180000499822, 148.03970300999936, 114.19483699137345, 144.59478000935633, 139.4024549954338, 140.64030500594527, 152.98350600642152, 163.31680300936569, 136.47203501022886, 146.64112000900786, 163.83713499817532, 139.70723400416318, 154.4257970090257, 163.07790899008978, 148.72684200236108, 121.86166099854745, 131.9651219964726, 122.9326690081507, 144.27040300506633, 114.35521900421008, 162.27141900162678, 140.86426900757942, 133.6235439957818, 130.7707170053618, 130.89641999977175, 161.5305610030191, 158.03489000245463, 127.84583399479743, 132.06951299798675, 124.45953499991447, 124.20928198844194, 142.97243701003026, 134.2010280059185, 129.50134299171623, 142.37887698982377, 146.16271400882397, 156.3201339886291, 127.68743399647065, 146.20529201056343, 146.3785379892215, 162.2903179959394, 141.6610609885538, 132.11643599788658, 130.89521299116313, 125.41559898818377, 143.30402700579725, 132.71231300313957, 138.17733300675172, 129.5844349951949, 151.37832700565923, 149.84413600177504, 134.5681979873916, 138.18607000575867, 154.97956798935775, 186.83957900793757, 152.72640899638645, 128.67557299614418, 131.32539099024143, 143.22495300439186, 137.6269230095204, 131.19588399422355, 158.45071399235167, 174.2236489953939, 131.43767300061882, 119.33656499604695, 135.80746999650728], "p50": 140.17376950505422, "p95": 163.31680300936569, "maximum": 186.83957900793757}, "masked_character": {"samples_ms": [89.01831900584511, 79.5498299994506, 79.79541599343065, 77.84851799078751, 82.06548499583732, 81.1522620060714, 77.32584200857673, 79.88028900581412, 74.87377000506967, 57.43860299116932, 61.930904994369484, 52.16520500835031, 63.32392200420145, 76.34728398988955, 58.247986002243124, 88.12579700315837, 77.24620899534784, 74.87784799013752, 80.0328249897575, 76.18977999663912, 92.64318000350613, 75.61606100352947, 76.82503300020471, 74.45842299785, 86.56885800883174, 76.79440500214696, 78.14746299118269, 59.172863999265246, 79.0306390117621, 57.37355200108141, 57.74834800104145, 81.23741199960932, 75.99901698995382, 88.65662400785368, 72.62176899530459, 78.13841699680779, 85.57366799504962, Line truncated
@@ -0,0 +1 @@
{"pid": 927214, "sent": 300, "elapsed": 7.472922203989583, "frames": [{"seq": 0, "t": 92136.365663562, "age_ms": null}, {"seq": 1, "t": 92136.436387651, "age_ms": 83.4286930039525}, {"seq": 2, "t": 92136.458623772, "age_ms": 89.4368240115}, {"seq": 3, "t": 92136.483032841, "age_ms": 79.78455600095913}, {"seq": 4, "t": 92136.505498215, "age_ms": 85.48468200024217}, {"seq": 5, "t": 92136.531021176, "age_ms": 77.6600239914842}, {"seq": 7, "t": 92136.553035627, "age_ms": 67.25145400559995}, {"seq": 8, "t": 92136.598642469, "age_ms": 78.36032701015938}, {"seq": 9, "t": 92136.620093411, "age_ms": 84.27628899517003}, {"seq": 10, "t": 92136.666320637, "age_ms": 96.1793820024468}, {"seq": 11, "t": 92136.689076807, "age_ms": 102.00550999434199}, {"seq": 12, "t": 92136.711132383, "age_ms": 107.7730109973345}, {"seq": 13, "t": 92136.736310006, "age_ms": 99.76664300484117}, {"seq": 15, "t": 92136.758774214, "age_ms": 89.51790900027845}, {"seq": 16, "t": 92136.784340634, "age_ms": 81.16999299090821}, {"seq": 17, "t": 92136.805870911, "age_ms": 85.63868500641547}, {"seq": 18, "t": 92136.831589583, "age_ms": 78.50382900505792}, {"seq": 20, "t": 92136.853398697, "age_ms": 67.51512399932835}, {"seq": 21, "t": 92136.900460394, "age_ms": 80.42827399913222}, {"seq": 22, "t": 92136.924070868, "age_ms": 88.10038700175937}, {"seq": 23, "t": 92136.948382228, "age_ms": 78.44461900822353}, {"seq": 25, "t": 92136.970128341, "age_ms": 66.94169899856206}, {"seq": 26, "t": 92137.01634915, "age_ms": 79.61742799670901}, {"seq": 27, "t": 92137.039678746, "age_ms": 87.12795600877143}, {"seq": 28, "t": 92137.063626683, "age_ms": 76.7707189952489}, {"seq": 30, "t": 92137.086302061, "age_ms": 67.14324399945326}, {"seq": 31, "t": 92137.131005597, "age_ms": 77.76327600004151}, {"seq": 32, "t": 92137.154351526, "age_ms": 85.24171999306418}, {"seq": 33, "t": 92137.176440352, "age_ms": 73.12745600938797}, {"seq": 34, "t": 92137.223952677, "age_ms": 104.19566299242433}, {"seq": 36, "t": 92137.248492706, "age_ms": 78.25619599316269}, {"seq": 37, "t": 92137.269388889, "age_ms": 82.98184900195338}, {"seq": 38, "t": 92137.295340897, "age_ms": 92.0566080021672}, {"seq": 39, "t": 92137.319096914, "age_ms": 82.50467499601655}, {"seq": 40, "t": 92137.341451452, "age_ms": 88.78785099659581}, {"seq": 41, "t": 92137.362780766, "age_ms": 76.0129539994523}, {"seq": 42, "t": 92137.389681288, "age_ms": 86.4889009972103}, {"seq": 43, "t": 92137.415270457, "age_ms": 95.07977700559422}, {"seq": 44, "t": 92137.436607355, "age_ms": 83.09035100683104}, {"seq": 45, "t": 92137.458260132, "age_ms": 86.81323799828533}, {"seq": 46, "t": 92137.483234751, "age_ms": 79.97501299541909}, {"seq": 47, "t": 92137.505305784, "age_ms": 86.12139499746263}, {"seq": 49, "t": 92137.549462436, "age_ms": 78.7383279966889}, {"seq": 50, "t": 92137.597033971, "age_ms": 111.14384800021071}, {"seq": 53, "t": 92137.646018651, "age_ms": 93.32712600007653}, {"seq": 55, "t": 92137.691585823, "age_ms": 87.87812900845893}, {"seq": 56, "t": 92137.716611776, "age_ms": 79.96626300155185}, {"seq": 58, "t": 92137.739251859, "age_ms": 69.63060999987647}, {"seq": 60, "t": 92137.784985576, "age_ms": 65.75721999979578}, {"seq": 61, "t": 92137.831614138, "age_ms": 78.27573800750542}, {"seq": 63, "t": 92137.854654978, "age_ms": 68.3889670035569}, {"seq": 64, "t": 92137.899964021, "age_ms": 79.8128439928405}, {"seq": 65, "t": 92137.923209322, "age_ms": 87.33095400384627}, {"seq": 66, "t": 92137.947553056, "age_ms": 77.41793300374411}, {"seq": 68, "t": 92137.970501728, "age_ms": 67.92987701192033}, {"seq": 69, "t": 92138.01517522, "age_ms": 78.51140800630674}, {"seq": 70, "t": 92138.040105213, "age_ms": 87.35895500285551}, {"seq": 71, "t": 92138.064739451, "age_ms": 77.80993900087196}, {"seq": 72, "t": 92138.086507439, "age_ms": 83.26477000082377}, {"seq": 73, "t": 92138.111394556, "age_ms": 91.71360300388187}, {"seq": 74, "t": 92138.133192294, "age_ms": 79.95751300768461}, {"seq": 76, "t": 92138.181313918, "age_ms": 77.54072500392795}, {"seq": 77, "t": 92138.203833832, "age_ms": 84.05986099387519}, {"seq": 78, "t": 92138.226027659, "age_ms": 90.03561599820387}, {"seq": 79, "t": 92138.249618589, "age_ms": 79.44241800578311}, {"seq": 80, "t": 92138.274281118, "age_ms": 87.67016400815919}, {"seq": 81, "t": 92138.298936063, "age_ms": 78.8447829982033}, {"seq": 82, "t": 92138.321632147, "age_ms": 84.81178799411282}, {"seq": 83, "t": 92138.345499289, "age_ms": 92.45444199768826}, {"seq": 84, "t": 92138.36768174, "age_ms": 80.89027200185228}, {"seq": 85, "t": 92138.39140713, "age_ms": 88.81176299473736}, {"seq": 86, "t": 92138.41519873, "age_ms": 78.15614799619652}, {"seq": 87, "t": 92138.4347401, "age_ms": 81.34352799970657}, {"seq": 88, "t": 92138.458400156, "age_ms": 88.17737900244538}, {"seq": 89, "t": 92138.483817238, "age_ms": 80.32997199916281}, {"seq": 90, "t": 92138.505953314, "age_ms": 86.68694099469576}, {"seq": 91, "t": 92138.529366324, "age_ms": 92.65044500352815}, {"seq": 92, "t": 92138.553054089, "age_ms"Line truncated
@@ -0,0 +1 @@
{"pid": 1024531, "sent": 300, "elapsed": 7.525341282002046, "frames": [{"seq": 0, "t": 98093.319173155, "age_ms": null}, {"seq": 1, "t": 98093.360985775, "age_ms": 65.78400199941825}, {"seq": 2, "t": 98093.407245652, "age_ms": 77.83108799776528}, {"seq": 4, "t": 98093.429203986, "age_ms": 66.96989899501204}, {"seq": 5, "t": 98093.474021888, "age_ms": 77.32738900813274}, {"seq": 6, "t": 98093.495807849, "age_ms": 84.13943900086451}, {"seq": 7, "t": 98093.517515645, "age_ms": 71.36698999966029}, {"seq": 8, "t": 98093.539524437, "age_ms": 76.24561600096058}, {"seq": 9, "t": 98093.561372814, "age_ms": 82.8949190035928}, {"seq": 11, "t": 98093.606268298, "age_ms": 76.81114799925126}, {"seq": 13, "t": 98093.628119008, "age_ms": 65.57896400045138}, {"seq": 14, "t": 98093.671019234, "age_ms": 75.00838598934934}, {"seq": 15, "t": 98093.694133131, "age_ms": 82.34134399390314}, {"seq": 16, "t": 98093.715791637, "age_ms": 86.65852100239135}, {"seq": 17, "t": 98093.737738304, "age_ms": 74.90892999339849}, {"seq": 19, "t": 98093.76015163, "age_ms": 64.95130799885374}, {"seq": 20, "t": 98093.804099213, "age_ms": 75.00226199044846}, {"seq": 21, "t": 98093.825446516, "age_ms": 79.66476600267924}, {"seq": 22, "t": 98093.847616887, "age_ms": 85.8523679926293}, {"seq": 23, "t": 98093.86940139, "age_ms": 73.24762499774806}, {"seq": 24, "t": 98093.891337849, "age_ms": 79.01436000247486}, {"seq": 25, "t": 98093.913888256, "age_ms": 85.43324998754542}, {"seq": 26, "t": 98093.93534289, "age_ms": 72.44468000135385}, {"seq": 28, "t": 98093.955917289, "age_ms": 60.908294006367214}, {"seq": 29, "t": 98094.005967602, "age_ms": 76.63848400989082}, {"seq": 31, "t": 98094.027864686, "age_ms": 65.97358199360315}, {"seq": 32, "t": 98094.072485133, "age_ms": 75.7847899949411}, {"seq": 33, "t": 98094.095194496, "age_ms": 82.78437900298741}, {"seq": 34, "t": 98094.116525173, "age_ms": 87.21676099230535}, {"seq": 35, "t": 98094.138000223, "age_ms": 75.1804669998819}, {"seq": 36, "t": 98094.160141429, "age_ms": 80.87049500318244}, {"seq": 37, "t": 98094.181294486, "age_ms": 68.31300200428814}, {"seq": 38, "t": 98094.204322635, "age_ms": 74.31423400703352}, {"seq": 39, "t": 98094.226642047, "age_ms": 80.85358199605253}, {"seq": 40, "t": 98094.247914102, "age_ms": 86.05799400538672}, {"seq": 41, "t": 98094.26946061, "age_ms": 73.09333900047932}, {"seq": 42, "t": 98094.291092866, "age_ms": 78.66466000268701}, {"seq": 43, "t": 98094.31350386, "age_ms": 85.17075800045859}, {"seq": 44, "t": 98094.335262989, "age_ms": 71.97773200459778}, {"seq": 45, "t": 98094.357802314, "age_ms": 78.3738739992259}, {"seq": 46, "t": 98094.379548902, "age_ms": 84.50781099963933}, {"seq": 47, "t": 98094.401070036, "age_ms": 71.68082198768388}, {"seq": 48, "t": 98094.420506955, "age_ms": 74.81180998729542}, {"seq": 49, "t": 98094.450681399, "age_ms": 88.78707099938765}, {"seq": 50, "t": 98094.473970878, "age_ms": 77.78850899194367}, {"seq": 51, "t": 98094.496765406, "age_ms": 84.15781700750813}, {"seq": 53, "t": 98094.518394746, "age_ms": 87.11118300561793}, {"seq": 54, "t": 98094.542130175, "age_ms": 79.14502700441517}, {"seq": 55, "t": 98094.564222091, "age_ms": 85.80191399960313}, {"seq": 56, "t": 98094.587404238, "age_ms": 74.0730310062645}, {"seq": 57, "t": 98094.610675342, "age_ms": 81.04841200110968}, {"seq": 58, "t": 98094.632477054, "age_ms": 87.24738999444526}, {"seq": 59, "t": 98094.654370931, "age_ms": 75.06555500731338}, {"seq": 60, "t": 98094.676831507, "age_ms": 80.49892098642886}, {"seq": 62, "t": 98094.725592968, "age_ms": 79.73884999228176}, {"seq": 63, "t": 98094.747431722, "age_ms": 84.35964700765908}, {"seq": 64, "t": 98094.769321224, "age_ms": 90.94828499655705}, {"seq": 66, "t": 98094.791920922, "age_ms": 79.21269300277345}, {"seq": 67, "t": 98094.813322475, "age_ms": 84.69797500583809}, {"seq": 69, "t": 98094.858018755, "age_ms": 78.85336499020923}, {"seq": 70, "t": 98094.87928556, "age_ms": 83.97931999934372}, {"seq": 71, "t": 98094.926089096, "age_ms": 96.82410099776462}, {"seq": 73, "t": 98094.947632105, "age_ms": 85.60125100484584}, {"seq": 74, "t": 98094.992775503, "age_ms": 96.50910699565429}, {"seq": 76, "t": 98095.014646047, "age_ms": 85.84158000303432}, {"seq": 77, "t": 98095.061367043, "age_ms": 98.89285800454672}, {"seq": 79, "t": 98095.105005758, "age_ms": 109.62367500178516}, {"seq": 80, "t": 98095.127861244, "age_ms": 98.56532199773937}, {"seq": 82, "t": 98095.15042536, "age_ms": 87.42180299304891}, {"seq": 83, "t": 98095.197050401, "age_ms": 101.10977999283932}, {"seq": 85, "t": 98095.217650468, "age_ms": 88.00950399017893}, {"seq": 86, "t": 98095.260126622, "age_ms": 97.2516820038436}, {"seq": 87, "t": 98095.282874777, "age_ms": 104.3941849929979}, {"seq": 88, "t": 98095.305237939, "age_ms": 91.89152299950365}, {"seq": 89, "t": 98095.326449037, "age_ms": 97.11810100998264}, {"seq": 91, "t": 98095.34851062, "age_ms": 86.62440298940055}, {"seq": 92, "t": 98095.395788109, "age_ms": 99.85038700688165}, {"seq": 94, "t": 98095.418243144, Line truncated
@@ -0,0 +1 @@
{"pid": 1024531, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [65.64291699032765, 99.33425798953976, 102.32700299820863, 109.70868000003975, 98.7585209950339, 182.8706480009714, 84.80715801124461, 79.56978600122966, 100.00625500106253, 101.36598399549257, 98.92156400019303, 88.73351600777823, 99.66822199930903, 96.67314399848692, 114.77719199319836, 118.33255300007295, 76.0680960083846, 99.89368099195417, 104.53431600762997, 100.51579600258265, 103.89091000251938, 79.57504500518553, 80.37361499737017, 78.58251901052427, 78.22931600094307, 82.62145399930887, 83.47573599894531, 93.39633099443745, 84.92412998748478, 99.5512770023197, 113.75113901158329, 119.07980799151119, 107.71198599832132, 95.52313499443699, 103.37322000123095, 97.97397500369698, 98.92420998949092, 81.94976599770598, 75.7175300095696, 106.39630199875683, 97.528610000154, 84.75789200747386, 76.85559798846953, 93.30913399753626, 95.63776600407436, 114.1498560027685, 103.19998499471694, 104.384714999469, 83.18204400711693, 92.58319399668835, 121.73803499899805, 97.19845499785151, 97.12233200843912, 95.61006500734948, 107.15405500377528, 99.06509699067101, 106.83964300551452, 95.01653400366195, 96.8575089937076, 103.06816399679519, 105.5840420012828, 119.17666600493249, 112.65539401210845, 100.7535360113252, 89.39883598941378, 107.49822399520781, 111.605412006611, 100.29154700168874, 95.79324099468067, 105.78558799170423, 78.18326099368278, 109.37303499667905, 121.75759801175445, 85.44302800146397, 115.95847801072523, 110.91768000915181, 107.45215299539268, 102.83572399930563, 106.75712300871965, 115.87885800690856, 90.74107800552156, 98.9184119971469, 87.06176000123378, 93.04316800262313, 109.0971320081735, 140.9711519954726, 86.34573199378792, 97.33235600288026, 104.1557939897757, 98.79912799806334, 108.48260700004175, 95.31843199511059, 93.05163200770039, 92.64447199529968, 76.89733800361864, 100.17169499769807, 104.43492198828608, 101.38005200133193, 92.86088899534661, 92.68589499697555], "p50": 98.99465349008096, "p95": 119.17666600493249, "maximum": 182.8706480009714}, "click_release": {"samples_ms": [162.14847900846507, 130.30420799623244, 122.33716000628192, 132.2353080031462, 148.93822399608325, 133.39087800704874, 135.28580800630152, 145.82765099476092, 152.44576599798165, 164.6739990101196, 127.44885199936107, 143.2592829951318, 136.5945069992449, 137.2516270057531, 129.72411401278805, 151.44800298730843, 152.31861599022523, 164.368937999825, 146.63703899714164, 144.24482399772387, 148.93534399743658, 127.93827799032442, 142.3703159962315, 135.1729680027347, 137.68972200341523, 136.42799499211833, 154.37631600070745, 138.60058899444994, 149.04794000904076, 151.02424500219058, 150.99508399725892, 151.2418299971614, 132.15894300083164, 138.96051500341855, 125.18209099653177, 139.49688398861326, 135.75106600183062, 159.0178519982146, 190.11549001152162, 144.64298299571965, 132.51449599920306, 134.7337570041418, 140.63029599492438, 135.5291249928996, 128.49072700191755, 132.50342100218404, 127.07529299950693, 159.63853200082667, 159.87915800360497, 165.30437300389167, 147.45638299791608, 158.94905199820641, 131.43332301115151, 138.10277299489826, 160.68794899911154, 150.7288470020285, 153.25522801140323, 147.21139700850472, 176.91693699453026, 179.55327399249654, 143.5869169945363, 155.83061800862197, 158.66528599872254, 143.04530499794055, 138.76865699421614, 139.085406990489, 149.65117401152384, 153.58745100093074, 149.37089099839795, 130.96231799863745, 151.94656899257097, 146.19177499844227, 130.1538330008043, 131.35869600228034, 130.93724400096107, 142.7209999965271, 156.4128079917282, 158.22461601055693, 158.52707499288954, 155.85223800735548, 167.3545400117291, 125.4009170079371, 121.26455899851862, 134.5611690048827, 126.58186299086083, 141.17433098726906, 142.07731898932252, 144.85948899528012, 143.519887002185, 143.42859599855728, 140.82084500114433, 135.9754540026188, 117.04450700199232, 129.461464995984, 124.64932299917564, 154.55524699063972, 155.39144600916188, 145.3349170042202, 141.26972800295334, 149.77665300830267], "p50": 143.34393949684454, "p95": 165.30437300389167, "maximum": 190.11549001152162}, "masked_character": {"samples_ms": [90.392096011783, 91.82095099822618, 99.64830199896824, 82.61199500702787, 79.6026210009586, 70.33387200499419, 81.62880099553149, 73.21783300722018, 56.71322499983944, 81.47655600623693, 76.84262000839226, 89.10557800845709, 74.85493799322285, 78.6383869999554, 78.74192899907939, 85.72112600086257, 75.40530800179113, 80.67215401388239, 78.7477630074136, 76.83416600048076, 81.43777000077534, 61.22000399045646, 72.4466840038076, 61.07388000236824, 58.1735879968619, 55.65974699857179, 58.47604300652165, 62.22711601003539, 85.6135079957312, 75.25481800257694, 81.74752099148463, 76.60346599004697, 80.57678799377754, 78.19973598816432, 77.3148339940235, 83.13613099744543, 79.05635300267022, 76.813173Line truncated
@@ -0,0 +1,2 @@
{"label": "A", "nice": 0, "started": 1794382393.3894014, "ended": 1794382437.1806092, "data": {"pid": 1192725, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [89.68268800526857, 111.3346990023274, 105.59897900384385, 97.78258300502785, 106.23012800351717, 95.5260350019671, 99.48381698632147, 102.98341099405661, 119.49789100617636, 85.97340701089706, 74.17355799407233, 87.88871600700077, 112.72475100122392, 110.62686500372365, 99.00813500280492, 96.92308001103811, 115.37037500238512, 95.47209300217219, 95.02148399769794, 104.7082790028071, 103.33166000782512, 99.03468599077314, 100.16193900082726, 107.91884199716151, 143.35951600514818, 127.5665990106063, 75.7703940034844, 105.319602007512, 91.244536000886, 92.12213300634176, 91.25620799022727, 108.99185900052544, 101.48140299133956, 100.55947699584067, 104.95358299522195, 79.04979100567289, 105.70780800480861, 97.42796199861914, 107.62399299710523, 103.43522300536279, 106.2669189996086, 123.76457899517845, 101.49920500407461, 120.6199410080444, 108.47418299817946, 101.13434700178914, 103.23515100753866, 114.38023700611666, 132.36088599660434, 81.19406299374532], "p50": 103.10928100079764, "p95": 127.5665990106063, "maximum": 143.35951600514818}, "click_release": {"samples_ms": [146.7716589977499, 163.99312300200108, 158.79318000224885, 170.65369900956284, 163.7746850028634, 146.4978069998324, 127.41819499933627, 153.7276980088791, 138.99581399164163, 146.84430799388792, 133.57391899626236, 155.76696999778505, 133.5791750025237, 165.4671970027266, 152.3067640082445, 149.7953090001829, 131.25875798868947, 149.3324559996836, 131.23922400700394, 127.85921400063671, 148.84014701237902, 144.68811699771322, 164.60013198957313, 158.468625988462, 146.0918750090059, 170.1693310023984, 130.89392099936958, 155.40390899695922, 141.05788299639244, 140.75369099737145, 162.23802499007434, 162.85079601220787, 158.03204600524623, 140.56820499536116, 136.69617199047934, 160.67125799600035, 132.8255900007207, 147.12350199988578, 145.78304599854164, 147.19992400205228, 155.4138620122103, 149.37656000256538, 165.1759249944007, 120.10264999116771, 132.09122300031595, 141.37933499296196, 138.063776990748, 133.2566909986781, 128.58434299414512, 155.90795800380874], "p50": 146.98390499688685, "p95": 165.4671970027266, "maximum": 170.65369900956284}, "masked_character": {"samples_ms": [84.67040699906647, 87.9034269892145, 76.70904499536846, 83.735356995021, 100.68822200992145, 72.58821999130305, 83.92522799840663, 76.96016499539837, 77.23198899475392, 94.09881600004155, 101.72565099492203, 101.30246100015938, 92.1584250027081, 103.62959401390981, 81.94021400413476, 75.4012609977508, 77.49361298920121, 57.60842500603758, 92.96515300229657, 77.81764399260283, 89.1604839998763, 80.61434800038114, 80.60210000257939, 81.88830700237304, 86.31916400918271, 75.81075400230475, 78.13001600152347, 77.312792011071, 77.55486799578648, 82.14555299491622, 94.46544598904438, 97.70459600258619, 72.59990699822083, 73.66970599105116, 64.26200899295509, 78.41525999538135, 78.7112959951628, 77.4851690075593, 83.6843450088054, 76.20946000679396, 80.65606700256467, 78.03815499937627, 77.7365810063202, 92.22757301176898, 107.520622012089, 97.91372399195097, 95.50988901173696, 96.04478800611105, 106.27699999895412, 102.76748800242785], "p50": 81.9142605032539, "p95": 103.62959401390981, "maximum": 107.520622012089}, "synthetic_submit_ms": 79.7426069912035}}
{"label": "B", "nice": -10, "started": 1794382437.3939807, "ended": 1794382481.2133698, "data": {"pid": 1192725, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [85.75775098870508, 112.70163800509181, 132.5947090081172, 96.10167400387581, 100.60982100549154, 121.30874299327843, 102.12760699505452, 128.57480799721088, 108.5889879905153, 85.22315199661534, 98.83159199671354, 119.34152200410608, 120.51923699618783, 107.4211970117176, 102.60330900200643, 81.0247469926253, 119.50835799507331, 92.98707899870351, 112.17142498935573, 110.95433900482021, 109.64334399614017, 96.84979300072882, 100.34938900207635, 93.86292900308035, 102.02058700087946, 81.75010999548249, 113.11961300089024, 105.7925959903514, 98.15933900245, 103.36250999534968, 93.63661099632736, 105.48490298970137, 91.04844399553258, 95.75462799693923, 83.91042400035076, 107.58046599221416, 83.59543498954736, 74.65905100980308, 116.7078849975951, 96.7701869958546, 117.91447699943092, 97.29633800452575, 83.84451300662477, 104.49328098911792, 81.74166700337082, 102.64679799729493, 96.86468899599276, 106.67925399320666, 98.22410899505485, 100.67228101252113], "p50": 101.34643400670029, "p95": 121.30874299327843, "maximum": 132.5947090081172}, "click_release": {"samples_ms": [130.12648299627472, 129.1631390049588, 159.59118500177283, 172.76710500300396, 146.17610900313593, 131.0102159914095, 131.41153700416908, 137.711636009044, 137.4858939961996, 131.4783330017235, 136.3595190050546, 147.43404700129759, 149.82330899510998, 132.25736099411733, 127.8851230017608, 123.22327500442043, 135.29760600067675, 130.0293959939154, 146.2161039962666, 149.34004899987485, 146.35873200313654, 137.34330399893224, 145.114813989494, 150.9374699962791, 141.73975599987898, 160.08794200024568, 182.81594499421772, 149.1014979983447, 179.90258400095627, 164.41906499676406, 148.80955600528978, 113.03162299736869, 133.23562699952163, 152.27183100068942, 166.7788820050191, 147.87159800471272, 149.88345200254116, 154.38694499607664, 148.85390699782874, 147.26116599922534, 153.9564650011016, 158.93652000522707, 147.32038301008288, 146.73240200500004, 161.0889660078101, 155.47951399639715, 136.10002599307336, 132.2691079985816, 129.36099000216927, 118.66619499051012], "p50": 146.5455670040683, "p95": 172.76710500300396, "maximum": 182.81594499421772}, "masked_character": {"samples_ms": [90.90475700213574, 77.9370700038271, 75.41423400107305, 82.78938400326297, 77.76966200617608, 89.15364700078499, 86.23561200511176, 97.04824301297776, 97.31977699266281, 90.69331199862063, 99.55154100316577, 80.40012899436988, 96.69417400436942, 82.94980200298596, 74.58709899219684, 88.08006301114801, 83.16125698911492, 77.01515300141182, 78.55510601075366, 76.67216399568133, 68.47687100525945, 99.36605900293216, 92.27352599555161, 68.35000299906824, 79.19617400330026, 89.77781000430696, 78.49561500188429, 85.37203099695034, 101.48204199504107, 98.42488401045557, 98.06002100231126, 98.03290000127163, 91.81971300859004, 98.8107520097401, 91.84333799930755, 71.00642898876686, 76.1203599977307, 72.89987399417441, 76.84425500337966, 92.7655639970908, 74.12950399157126, 73.69872900017072, 85.9918139904039, 86.60079599940218, 97.50179899856448, 80.43456700397655, 94.75847000430804, 83.89363100286573, 103.93810999812558, 98.74484899046365], "p50": 86.11371299775783, "p95": 99.55154100316577, "maximum": 103.93810999812558}, "synthetic_submit_ms": 91.19878899946343}}
@@ -0,0 +1 @@
{"label": "A", "nice": 0, "started": 1794382181.4190962, "ended": 1794382224.8817701, "data": {"pid": 1188195, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [87.28364900161978, 105.62444699462503, 78.74687400180846, 99.48829800123349, 78.00023700110614, 81.12183399498463, 98.6325779958861, 79.42702200671192, 87.93025999329984, 98.20064100495074, 81.95743200485595, 101.23357399425004, 132.98560700786766, 101.63810600352008, 119.82199500198476, 97.41171599307563, 78.29452899750322, 127.32281599892303, 103.97748500690795, 97.09673099860083, 101.4701160020195, 81.61883200227749, 96.20047701173462, 91.79092600243166, 98.03470299812034, 102.56354299781378, 95.02627400797792, 82.30568600993138, 78.64685899403412, 82.32085200143047, 113.57940699963365, 94.38317599415313, 92.31795799860265, 104.20732598868199, 112.02750500524417, 98.46432800986804, 101.4295959903393, 94.89095398748759, 103.21074099920224, 83.40086600219365, 100.27230900595896, 106.13955999724567, 95.88375699240714, 80.78996000404004, 100.0305310008116, 75.5372349958634, 118.21355299616698, 96.69660800136626, 109.34865899616852, 95.30366200488061], "p50": 97.25422349583823, "p95": 119.82199500198476, "maximum": 132.98560700786766}, "click_release": {"samples_ms": [122.13225800951477, 135.2331699890783, 141.6951080027502, 145.8325510029681, 133.38728300004732, 127.95343800098635, 142.88245399075095, 143.26248299039435, 148.52163700561505, 146.72795099613722, 146.34063400444575, 127.50021899410058, 157.9745199996978, 138.5461280005984, 152.76758599793538, 150.55362500424962, 158.31373201217502, 160.35182699852157, 155.3376769879833, 152.82039099838585, 164.69402400252875, 165.789485006826, 127.77935899794102, 129.79791800898965, 135.91074700525496, 126.67661700106692, 156.5107420028653, 127.48450599610806, 144.21596999454778, 141.96933999483008, 162.78808000788558, 159.97796900046524, 160.75494200049434, 144.76954699784983, 144.01678199646994, 139.47161399119068, 140.4364140034886, 135.29538399598096, 132.3872829962056, 158.34384100162424, 168.22692299319897, 160.96292399743106, 153.69834400189575, 150.46912898833398, 161.3496679929085, 130.30370700289495, 148.53691100142896, 137.99031799135264, 136.81232200178783, 165.66620199591853], "p50": 145.30104900040897, "p95": 165.66620199591853, "maximum": 168.22692299319897}, "masked_character": {"samples_ms": [115.71126300259493, 94.18350498890504, 84.76912300102413, 97.80675999354571, 76.8080660054693, 59.81119199714158, 95.63070999865886, 95.46767600113526, 65.66941099299584, 63.13608100754209, 91.0554959991714, 90.01428299234249, 85.98913199966773, 78.18265100650024, 72.30489500216208, 90.2729859953979, 75.73010999476537, 71.88724400475621, 86.39133200631477, 102.48611400311347, 98.44520999467932, 80.06442298938055, 83.63051399646793, 73.65906301129144, 62.69627099391073, 74.09625600848813, 80.27442000457086, 78.33548900089227, 126.38884800253436, 92.88886800641194, 78.67351999448147, 75.70503799070138, 71.88842199684586, 82.88475500012282, 79.7783190064365, 85.19205200718716, 75.52917300199624, 78.73302599182352, 76.84484000492375, 106.30450300232042, 77.32082300935872, 84.15317400067579, 97.21648300183006, 105.512367998017, 102.54855200764723, 72.67327600857243, 78.30750200082548, 57.39775799156632, 89.87373700074386, 76.83988800272346], "p50": 80.1694214969757, "p95": 106.30450300232042, "maximum": 126.38884800253436}, "synthetic_submit_ms": 72.00917800946627}}
@@ -0,0 +1,122 @@
{
"windows-final25": {
"drag": {
"p50": 84.87958250043448,
"p95": 121.39183300314471,
"maximum": 184.37010400521103
},
"response": {
"hover": {
"p50": 63.633582001784816,
"p95": 101.82040499057621,
"maximum": 845.9072770056082
},
"click_release": {
"p50": 141.36914950358914,
"p95": 153.48625300975982,
"maximum": 175.83653298788704
},
"masked_character": {
"p50": 90.04945599735947,
"p95": 105.06814300606493,
"maximum": 120.6028089945903
}
}
},
"kylin-final25": {
"drag": {
"p50": 80.61217350041261,
"p95": 100.54679099994246,
"maximum": 126.70204599271528
},
"response": {
"hover": {
"p50": 98.34436650271527,
"p95": 116.49623799894471,
"maximum": 136.48703599756118
},
"click_release": {
"p50": 139.1306575096678,
"p95": 159.49146100319922,
"maximum": 168.7099590053549
},
"masked_character": {
"p50": 80.01304250501562,
"p95": 104.13300999789499,
"maximum": 129.88790900271852
}
}
},
"ubuntu-final25": {
"drag": {
"p50": 91.37783649930498,
"p95": 117.43102299806196,
"maximum": 134.79056301002856
},
"response": {
"hover": {
"p50": 118.43108750326792,
"p95": 151.81884700723458,
"maximum": 172.76797999511473
},
"click_release": {
"p50": 174.6047804990667,
"p95": 211.68503699300345,
"maximum": 223.64604799076915
},
"masked_character": {
"p50": 88.01881100225728,
"p95": 120.11115899076685,
"maximum": 209.85361099883448
}
}
},
"kylin-opengl120-25": {
"drag": {
"p50": 97.07216900278581,
"p95": 109.11211298662238,
"maximum": 127.94849299825728
},
"response": {
"hover": {
"p50": 98.99465349008096,
"p95": 119.17666600493249,
"maximum": 182.8706480009714
},
"click_release": {
"p50": 143.34393949684454,
"p95": 165.30437300389167,
"maximum": 190.11549001152162
},
"masked_character": {
"p50": 79.32948700181441,
"p95": 101.76932498870883,
"maximum": 106.50796099798754
}
}
},
"ubuntu-push25": {
"drag": {
"p50": 81.42467399011366,
"p95": 99.4952189939795,
"maximum": 110.48595000465866
},
"response": {
"hover": {
"p50": 119.14219800382853,
"p95": 156.67143800237682,
"maximum": 304.9591620074352
},
"click_release": {
"p50": 172.0495120025589,
"p95": 250.00127698876895,
"maximum": 323.72192401089706
},
"masked_character": {
"p50": 79.85465449746698,
"p95": 123.18441600655206,
"maximum": 165.31423600099515
}
}
}
}
@@ -0,0 +1,67 @@
"""Run on box: XTest input to decoded marker. Excludes USB and scanout."""
import ctypes as C
import os
import json
import statistics
import subprocess
import time
os.environ.update(DISPLAY=':0',XAUTHORITY='/home/armbian/.Xauthority')
x=C.CDLL('libX11.so.6'); t=C.CDLL('libXtst.so.6')
x.XOpenDisplay.restype=C.c_void_p
x.XDefaultRootWindow.argtypes=[C.c_void_p]; x.XDefaultRootWindow.restype=C.c_ulong
x.XSync.argtypes=[C.c_void_p,C.c_int]
x.XGetImage.argtypes=[C.c_void_p,C.c_ulong,C.c_int,C.c_int,C.c_uint,C.c_uint,C.c_ulong,C.c_int]; x.XGetImage.restype=C.c_void_p
x.XGetPixel.argtypes=[C.c_void_p,C.c_int,C.c_int]; x.XGetPixel.restype=C.c_ulong
x.XDestroyImage.argtypes=[C.c_void_p]
x.XStringToKeysym.argtypes=[C.c_char_p]; x.XStringToKeysym.restype=C.c_ulong
x.XKeysymToKeycode.argtypes=[C.c_void_p,C.c_ulong];x.XKeysymToKeycode.restype=C.c_uint
t.XTestFakeMotionEvent.argtypes=[C.c_void_p,C.c_int,C.c_int,C.c_int,C.c_ulong]
t.XTestFakeButtonEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
t.XTestFakeKeyEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
d=x.XOpenDisplay(None);assert d;root=x.XDefaultRootWindow(d)
pid=int(subprocess.check_output(['pgrep','-x','moonlight']).strip())
assert int(subprocess.check_output(['xdotool','getwindowfocus','getwindowpid']).strip())==pid
def key(name):
code=x.XKeysymToKeycode(d,x.XStringToKeysym(name.encode()));assert code
t.XTestFakeKeyEvent(d,code,1,0);t.XTestFakeKeyEvent(d,code,0,0);x.XSync(d,0)
def move(px,py):
t.XTestFakeMotionEvent(d,-1,px,py,0);x.XSync(d,0)
def read():
im=x.XGetImage(d,root,40,1380,1320,1,0xffffffff,2);assert im
try:
def val(offset,n):
pixels=[x.XGetPixel(im,offset+20+i*40,0)&0xffffff for i in range(n)]
if any(0x404040<v<0xc0c0c0 for v in pixels):return -1
return sum((1<<i) for i,v in enumerate(pixels) if v>0xc0c0c0)
return val(0,16),val(760,8),val(1120,4)
finally:x.XDestroyImage(im)
def await_marker(m,s):
deadline=time.monotonic()+4
while time.monotonic()<deadline:
seen,magic,mode=read()
if (seen,magic,mode)==(s,0x5a,m):return
time.sleep(.002)
raise AssertionError(('marker timeout',m,s,read()))
def sample(m,s,action):
start=time.monotonic();action();await_marker(m,s);return (time.monotonic()-start)*1000
def stats(a):
b=sorted(a);return dict(samples_ms=a,p50=statistics.median(b),p95=b[int(len(b)*.95)],maximum=max(b))
result={'pid':pid,'method':'XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout'}
for m in [1,2,3]:
move(300,300);time.sleep(.4);key('F'+str(m));await_marker(m,0)
values=[]
for i in range(1,101):
px=750 if i%2 else 1750
if m==1: action=lambda:move(px,550)
elif m==2:
move(px,550);time.sleep(.12)
def action():
t.XTestFakeButtonEvent(d,1,1,0);x.XSync(d,0);time.sleep(.04)
t.XTestFakeButtonEvent(d,1,0,0);x.XSync(d,0)
else:action=lambda:key('a')
values.append(sample(m,i,action));time.sleep(.12)
result[{1:'hover',2:'click_release',3:'masked_character'}[m]]=stats(values)
if m==3:result['synthetic_submit_ms']=sample(m,1100,lambda:key('Return'))
print(json.dumps(result))
@@ -0,0 +1,67 @@
"""Run on box: XTest input to decoded marker. Excludes USB and scanout."""
import ctypes as C
import os
import json
import statistics
import subprocess
import time
os.environ.update(DISPLAY=':0',XAUTHORITY='/home/armbian/.Xauthority')
x=C.CDLL('libX11.so.6'); t=C.CDLL('libXtst.so.6')
x.XOpenDisplay.restype=C.c_void_p
x.XDefaultRootWindow.argtypes=[C.c_void_p]; x.XDefaultRootWindow.restype=C.c_ulong
x.XSync.argtypes=[C.c_void_p,C.c_int]
x.XGetImage.argtypes=[C.c_void_p,C.c_ulong,C.c_int,C.c_int,C.c_uint,C.c_uint,C.c_ulong,C.c_int]; x.XGetImage.restype=C.c_void_p
x.XGetPixel.argtypes=[C.c_void_p,C.c_int,C.c_int]; x.XGetPixel.restype=C.c_ulong
x.XDestroyImage.argtypes=[C.c_void_p]
x.XStringToKeysym.argtypes=[C.c_char_p]; x.XStringToKeysym.restype=C.c_ulong
x.XKeysymToKeycode.argtypes=[C.c_void_p,C.c_ulong];x.XKeysymToKeycode.restype=C.c_uint
t.XTestFakeMotionEvent.argtypes=[C.c_void_p,C.c_int,C.c_int,C.c_int,C.c_ulong]
t.XTestFakeButtonEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
t.XTestFakeKeyEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
d=x.XOpenDisplay(None);assert d;root=x.XDefaultRootWindow(d)
pid=int(subprocess.check_output(['pgrep','-x','moonlight']).strip())
assert int(subprocess.check_output(['xdotool','getwindowfocus','getwindowpid']).strip())==pid
def key(name):
code=x.XKeysymToKeycode(d,x.XStringToKeysym(name.encode()));assert code
t.XTestFakeKeyEvent(d,code,1,0);t.XTestFakeKeyEvent(d,code,0,0);x.XSync(d,0)
def move(px,py):
t.XTestFakeMotionEvent(d,-1,px,py,0);x.XSync(d,0)
def read():
im=x.XGetImage(d,root,40,1380,1320,1,0xffffffff,2);assert im
try:
def val(offset,n):
pixels=[x.XGetPixel(im,offset+20+i*40,0)&0xffffff for i in range(n)]
if any(0x404040<v<0xc0c0c0 for v in pixels):return -1
return sum((1<<i) for i,v in enumerate(pixels) if v>0xc0c0c0)
return val(0,16),val(760,8),val(1120,4)
finally:x.XDestroyImage(im)
def await_marker(m,s):
deadline=time.monotonic()+4
while time.monotonic()<deadline:
seen,magic,mode=read()
if (seen,magic,mode)==(s,0x5a,m):return
time.sleep(.002)
raise AssertionError(('marker timeout',m,s,read()))
def sample(m,s,action):
start=time.monotonic();action();await_marker(m,s);return (time.monotonic()-start)*1000
def stats(a):
b=sorted(a);return dict(samples_ms=a,p50=statistics.median(b),p95=b[int(len(b)*.95)],maximum=max(b))
result={'pid':pid,'method':'XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout'}
for m in [1,2,3]:
move(300,300);time.sleep(.4);key('F'+str(m));await_marker(m,0)
values=[]
for i in range(1,51):
px=750 if i%2 else 1750
if m==1: action=lambda:move(px,550)
elif m==2:
move(px,550);time.sleep(.12)
def action():
t.XTestFakeButtonEvent(d,1,1,0);x.XSync(d,0);time.sleep(.04)
t.XTestFakeButtonEvent(d,1,0,0);x.XSync(d,0)
else:action=lambda:key('a')
values.append(sample(m,i,action));time.sleep(.12)
result[{1:'hover',2:'click_release',3:'masked_character'}[m]]=stats(values)
if m==3:result['synthetic_submit_ms']=sample(m,1050,lambda:key('Return'))
print(json.dumps(result))
@@ -0,0 +1,31 @@
"""Temporary interactive reference via QGA; start/stop with ten-minute expiry."""
import base64
import runpy
import sys
from pathlib import Path
root = Path(__file__).resolve().parents[3]
term = runpy.run_path(str(root / 'tools/pve_term_exec.py'))
vm = runpy.run_path(str(root / 'tools/pve_vm.py'))
ticket, csrf = term['login']()
task = 'VDIGPUResponseReference20261111'
folder = r'C:\ProgramData\VDI\gpu-response-20261111'
if sys.argv[1] == 'start':
encoded = base64.b64encode(Path(__file__).with_name('windows-response.ps1').read_bytes()).decode()
ps = r"""$ErrorActionPreference='Stop'; $folder='""" + folder + r"""';
New-Item -ItemType Directory -Force $folder | Out-Null
if (Get-ScheduledTask -TaskName '""" + task + r"""' -ErrorAction SilentlyContinue) { throw 'Task already exists' }
[IO.File]::WriteAllBytes("$folder\response.ps1",[Convert]::FromBase64String('""" + encoded + r"""'))
$action=New-ScheduledTaskAction -Execute powershell.exe -Argument "-NoProfile -ExecutionPolicy Bypass -STA -WindowStyle Hidden -File $folder\response.ps1"
$principal=New-ScheduledTaskPrincipal -UserId test -LogonType Interactive -RunLevel Limited
$settings=New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 10)
Register-ScheduledTask -TaskName '""" + task + r"""' -Action $action -Principal $principal -Settings $settings | Out-Null
Start-ScheduledTask -TaskName '""" + task + r"""'
'Started temporary response reference'
"""
else:
ps = "Stop-ScheduledTask -TaskName '" + task + "' -ErrorAction SilentlyContinue; Unregister-ScheduledTask -TaskName '" + task + "' -Confirm:$false -ErrorAction SilentlyContinue; 'Stopped temporary reference'"
out, err = vm['agent'](ticket, csrf, ['powershell.exe', '-NoProfile', '-Command', ps])
print(out)
if err:
raise RuntimeError(err)
@@ -0,0 +1,62 @@
## 补充优化:终端调度对照与无线扫描(2026-11-11 15:43)
本轮保持 2560×1440、45 FPS、客户端请求 25 Mbps、H.264 SDR。两台实际 NvFBC / NVENC 保持有效,未调整原生鼠标样式或移速。没有修改 Windows 来宾的驱动、鼠标、应用或资源配置;为测试按平台流程正常关闭 Windows 并切到 Linux。此次持久调整在共用盒子的网络配置中,因而也影响盒子连接 Windows 时的网络路径。
### 实际保留的调整
盒子三次无线断开记录中有 `reason=34`。15:22:58 断开后,反复尝试同名 2.4 GHz 热点并被拒绝,直到 15:23:25 才恢复 5 GHz。先仅设置 5 GHz,15:30:31 仍断开,15:30:44 恢复;说明限制频段不足以修复断开本身。
进一步将盒子现有 YXTech 配置固定到当前 5 GHz 接入点 `f8:ce:21:a7:b9:50`。NetworkManager 文档说明固定 BSSID 会禁用漫游及后台扫描;此前断开间隔约五分钟,扫描参与问题是推断,尚未证明是唯一根因。Wi-Fi 省电原本已关闭,本轮没有把它记为新增优化。
配置已通过 nmcli 写入 `/etc/netplan/90-NM-9212612f-4dd0-4cf0-a21b-85413c900acf.yaml`,核对 `band: 5GHz` 和 BSSID。每次试验前设置了 90 秒自动回退,重连和 SSH 验证成功后取消回退;没有留下活动回退定时器。配置备份位于盒子 `/var/backups/vdi-wifi-20261111/`,不是 PVE,备份不复制到仓库以免带入无线凭据。
15:32:29—15:43:09 的约 10 分 40 秒观察中,没有再次出现无线断开或关联拒绝,越过两个此前约五分钟的周期。期间主动切换麒麟、Ubuntu并重连,不是同一桌面连续串流十分钟,也不是长期稳定性验收。若移动盒子、更换接入点或该 AP 不可用,需解除 BSSID 限制;本轮没有改路由器。
### 未保留的调度试验
确认 SDL 渲染线程申请高优先级因权限失败。先由 root 仅把当前 Moonlight 的 PacerRender 线程从 nice 0 临时改为 -10,保持普通 TS 调度;未使用 SCHED_FIFO、文件 capabilities、全进程提权或更改用户权限上限。固定接入点后,两台分别在同一连接内顺序 A/B,每类 50 次。表内为 P50 / P95,单位 ms:
| 系统 | PacerRender nice | 悬停回显 | 点击回显(含40ms按住) | 掩码字符回显 |
| --- | ---: | ---: | ---: | ---: |
| Ubuntu | 0 | 122.5 / 141.6 | 173.0 / 195.6 | 83.7 / 120.5 |
| Ubuntu | -10 | 121.7 / 151.0 | 172.8 / 213.7 | 79.1 / 105.9 |
| 麒麟 | 0 | 103.1 / 127.6 | 147.0 / 165.5 | 81.9 / 103.6 |
| 麒麟 | -10 | 101.3 / 121.3 | 146.5 / 172.8 | 86.1 / 99.6 |
悬停及点击中位数没有稳定收益,部分 P95 反而上升,因此两台试验均恢复 nice 0,没有持久化提权。Ubuntu 固定 AP 前另有两轮 A/B,同样没有一致收益;被断网打断的 A2、B2 与麒麟第一次 B 不计为完整结果。不能把警告消失或某一类输入的单轮改善解释为整体延迟降低。
### 功能与呈现复查
| 系统 | 拖动回显 P50 / P95(ms) | 观察到的新位置更新/秒 | 输入验证 |
| --- | ---: | ---: | --- |
| Ubuntu | 90.9 / 109.8 | 35.4 | 300 次末位置可见,松键成功 |
| 麒麟 | 84.4 / 106.9 | 37.2 | 300 次末位置可见,松键成功 |
以上为 XTest 输入至首次观察到唯一解码标记,排除实体 USB 鼠标和屏幕扫描;更新/秒是 60 Hz 拖动下采样到的独特位置,不等于解码或显示帧率。GTK 的合成页面提交没有业务后端,不能代表真实密码认证或应用启动耗时。
Ubuntu 在来宾内部另测本地 X11 标记,悬停中位数约 21 ms、点击约 78 ms(含40ms按住)、掩码字符约 5 ms,每类30次。它与盒子端测量路径不同,只用于区分来宾处理与串流路径,不将差值当作可直接消除的延迟。
结束前的 Ubuntu 单会话统计:接收/解码约45.03 FPS、呈现44.18 FPS、平均网络6 ms(variance栏1 ms)、解码7.67 ms、排队4.62 ms。麒麟对应会话呈现43.85 FPS。无线条件不恒定,不能将这几次统计差异全归因于固定 AP。network jitter 栏还包含客户端丢弃旧帧,不能全当无线丢包。
Ubuntu 再次退出和重连后,三处背景检查均未发现视频内重复箭头,仍有24×24的本地原生光标。临时 GTK 参考窗口已停止,桌面实际截图核验通过。
### 深层显示链路和边界
盒子仍是 RKMPP 硬解、DRM PRIME / EGL 呈现。现场 GPU 约800 MHz、90%—93%负载,不能承诺真2K60。部署源码明确要求 DRM master 才能直接设置显示 plane;现有原生光标实现也显式要求 X11。改成 DRM 直出需要同时完成 VT/显示所有权、光标后端、退出恢复及快捷键验证。本轮没有停掉 X11 或把“Direct rendering disabled”当成一个可随意开启的选项;没有声称已实现新的直接扫描输出或完全零拷贝链路。
本轮主要消除已观察到的无效频段重试并测试固定 AP 的短期稳定性,尚未证明 Ubuntu/麒麟全部交互延迟与 Windows 相同。继续提高 CPU 核数不能解决盒子 GPU 呈现吞吐和无线驱动/AP层问题。两小时/八小时、物理相机延迟及统一真实业务场景验收仍未完成。
### 收尾与回退
仅 Ubuntu VM102 运行并留在盒子上,Windows、麒麟停止;宿主未重启,共享 GPU 钩子和三台 VM 配置未改。Ubuntu 双光标修复、麒麟原有合成设置均保留。PacerRender / InputSend / FFDecoder 最终均为 nice 0、TS。
在盒子上解除本轮网络限制(会短暂断网):
```sh
sudo nmcli connection modify uuid 9212612f-4dd0-4cf0-a21b-85413c900acf 802-11-wireless.bssid '' 802-11-wireless.band ''
sudo nmcli connection up uuid 9212612f-4dd0-4cf0-a21b-85413c900acf ifname wlan0
```
证据:`wifi-before-5ghz.log`、`wifi-fixed-ap-final.log`、`*-sched-fixed-ap.jsonl`、`*-fixed-ap-drag.json`、`ubuntu-local-screen-response.raw`、`ubuntu-fixed-ap-client-stats.log`、`ubuntu-fixed-ap-double-cursor.json`、`optimization-host-final-state.log`。测量脚本为 `box-sched-pair.py`、`response-probe-50.py`、`guest-local-response.py`。
依据:[NetworkManager 无线配置](https://networkmanager.dev/docs/api/latest/settings-802-11-wireless.html)、[SDL Linux线程优先级实现](https://github.com/libsdl-org/SDL/blob/release-2.30.11/src/core/linux/SDL_threadprio.c),以及现场部署的 Moonlight DRM / 原生光标源码。
@@ -0,0 +1 @@
{"pid": 1067597, "sent": 300, "elapsed": 6.769575144993723, "frames": [{"seq": 0, "t": 100482.060410654, "age_ms": null}, {"seq": 1, "t": 100482.151797701, "age_ms": 102.20057799597271}, {"seq": 3, "t": 100482.176960363, "age_ms": 93.28111998911481}, {"seq": 4, "t": 100482.200712463, "age_ms": 84.19398100522812}, {"seq": 5, "t": 100482.223431064, "age_ms": 90.50025300530251}, {"seq": 6, "t": 100482.245356169, "age_ms": 78.81886301038321}, {"seq": 7, "t": 100482.265054469, "age_ms": 82.6032059994759}, {"seq": 8, "t": 100482.322580749, "age_ms": 105.10659198916983}, {"seq": 9, "t": 100482.343763391, "age_ms": 110.31782900681719}, {"seq": 11, "t": 100482.365821766, "age_ms": 99.8110770015046}, {"seq": 15, "t": 100482.409173599, "age_ms": 131.67865099967457}, {"seq": 17, "t": 100482.432949611, "age_ms": 99.70434500428382}, {"seq": 18, "t": 100482.454995447, "age_ms": 105.85547100345138}, {"seq": 19, "t": 100482.47587218, "age_ms": 93.1070410006214}, {"seq": 21, "t": 100482.545451669, "age_ms": 129.69505599176046}, {"seq": 23, "t": 100482.566551783, "age_ms": 100.33015999943018}, {"seq": 25, "t": 100482.587630025, "age_ms": 88.14513900142629}, {"seq": 26, "t": 100482.631011603, "age_ms": 98.1514720042469}, {"seq": 27, "t": 100482.651851301, "age_ms": 102.83487799461}, {"seq": 28, "t": 100482.675084027, "age_ms": 90.75571499124635}, {"seq": 29, "t": 100482.718270511, "age_ms": 118.73250300413929}, {"seq": 31, "t": 100482.744507499, "age_ms": 111.86224500124808}, {"seq": 32, "t": 100482.766462932, "age_ms": 100.21963600593153}, {"seq": 33, "t": 100482.78761583, "age_ms": 104.19236600864679}, {"seq": 34, "t": 100482.809414663, "age_ms": 110.49105100391898}, {"seq": 35, "t": 100482.831326645, "age_ms": 98.22175199224148}, {"seq": 36, "t": 100482.852786618, "age_ms": 103.5860900010448}, {"seq": 37, "t": 100482.897366167, "age_ms": 114.54105899611022}, {"seq": 38, "t": 100482.918652918, "age_ms": 118.88502100191545}, {"seq": 40, "t": 100482.940372431, "age_ms": 107.39755300164688}, {"seq": 41, "t": 100482.961693884, "age_ms": 93.61241800070275}, {"seq": 42, "t": 100482.984842915, "age_ms": 101.29833599785343}, {"seq": 43, "t": 100483.012444098, "age_ms": 113.46352599503007}, {"seq": 44, "t": 100483.032505173, "age_ms": 99.73146600532345}, {"seq": 45, "t": 100483.055059884, "age_ms": 105.30226900300477}, {"seq": 46, "t": 100483.074663407, "age_ms": 108.67338799289428}, {"seq": 47, "t": 100483.095954532, "age_ms": 96.63650998845696}, {"seq": 48, "t": 100483.117259071, "age_ms": 101.8147940048948}, {"seq": 49, "t": 100483.140146228, "age_ms": 90.50871399813332}, {"seq": 50, "t": 100483.161858164, "age_ms": 95.71441401203629}, {"seq": 51, "t": 100483.184537111, "age_ms": 101.08896400197409}, {"seq": 52, "t": 100483.207536548, "age_ms": 108.54100999131333}, {"seq": 53, "t": 100483.22936105, "age_ms": 96.00692700769287}, {"seq": 54, "t": 100483.252703432, "age_ms": 102.92589299206156}, {"seq": 55, "t": 100483.273759809, "age_ms": 107.71836500498466}, {"seq": 56, "t": 100483.297394393, "age_ms": 98.07567899406422}, {"seq": 57, "t": 100483.318514051, "age_ms": 101.59348300658166}, {"seq": 58, "t": 100483.340798729, "age_ms": 107.145624991972}, {"seq": 59, "t": 100483.36310557, "age_ms": 96.76543300156482}, {"seq": 60, "t": 100483.384789512, "age_ms": 101.88510299485642}, {"seq": 61, "t": 100483.406781696, "age_ms": 107.9067520040553}, {"seq": 62, "t": 100483.428560997, "age_ms": 95.95356399950106}, {"seq": 63, "t": 100483.449836672, "age_ms": 100.4687070089858}, {"seq": 64, "t": 100483.471540153, "age_ms": 105.89370300294831}, {"seq": 65, "t": 100483.493592702, "age_ms": 94.19918300409336}, {"seq": 66, "t": 100483.513568629, "age_ms": 97.34663099516183}, {"seq": 68, "t": 100483.565570196, "age_ms": 99.41508701012935}, {"seq": 69, "t": 100483.586215973, "age_ms": 103.28458400908858}, {"seq": 70, "t": 100483.609369385, "age_ms": 110.5415319907479}, {"seq": 73, "t": 100483.630017204, "age_ms": 109.4062590127578}, {"seq": 74, "t": 100483.653228356, "age_ms": 103.09473999950569}, {"seq": 75, "t": 100483.695835988, "age_ms": 112.971012989874}, {"seq": 77, "t": 100483.718206111, "age_ms": 102.15222601254936}, {"seq": 78, "t": 100483.740535115, "age_ms": 108.44012298912276}, {"seq": 79, "t": 100483.764655245, "age_ms": 98.56239199871197}, {"seq": 80, "t": 100483.807345697, "age_ms": 124.2832200077828}, {"seq": 81, "t": 100483.830642294, "age_ms": 131.7720059887506}, {"seq": 83, "t": 100483.851693131, "age_ms": 102.40418600733392}, {"seq": 84, "t": 100483.873202684, "age_ms": 106.99106600077357}, {"seq": 85, "t": 100483.895382088, "age_ms": 95.22130899131298}, {"seq": 87, "t": 100483.918323201, "age_ms": 86.0717509931419}, {"seq": 88, "t": 100483.984459268, "age_ms": 118.42225500731729}, {"seq": 90, "t": 100484.005990109, "age_ms": 105.90478399535641}, {"seq": 91, "t": 100484.029555288, "age_ms": 96.81180099141784}, {"seq": 92, "t": 100484.053460786, "age_ms": 104.06029199657496}, {"seq": 93, "t": 100484.098910833, "age_ms": 133.1767Line truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

@@ -0,0 +1 @@
{"method": "XGetImage-style root capture excludes local X11 cursor; compare clear wallpaper at identical coordinates", "pid": 1067597, "points": [{"point": [900, 900], "video_pixels_changed_over_25": 0, "max_video_channel_difference": 0, "local_shape": [24, 24, 3, 1], "local_opaque_pixels": 254}, {"point": [1300, 900], "video_pixels_changed_over_25": 0, "max_video_channel_difference": 1, "local_shape": [24, 24, 3, 1], "local_opaque_pixels": 254}, {"point": [1800, 900], "video_pixels_changed_over_25": 0, "max_video_channel_difference": 0, "local_shape": [24, 24, 3, 1], "local_opaque_pixels": 254}]}
@@ -0,0 +1 @@
{"method": "XGetImage-style root capture excludes local X11 cursor; compare clear wallpaper at identical coordinates", "pid": 1071236, "points": [{"point": [900, 900], "video_pixels_changed_over_25": 0, "max_video_channel_difference": 0, "local_shape": [24, 24, 3, 1], "local_opaque_pixels": 254}, {"point": [1300, 900], "video_pixels_changed_over_25": 0, "max_video_channel_difference": 1, "local_shape": [24, 24, 3, 1], "local_opaque_pixels": 254}, {"point": [1800, 900], "video_pixels_changed_over_25": 0, "max_video_channel_difference": 0, "local_shape": [24, 24, 3, 1], "local_opaque_pixels": 254}]}
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

@@ -0,0 +1 @@
{"pid": 1031422, "sent": 300, "elapsed": 7.008591013000114, "frames": [{"seq": 0, "t": 98355.56313589, "age_ms": null}, {"seq": 1, "t": 98355.66061566, "age_ms": 98.55861800315324}, {"seq": 2, "t": 98355.702868609, "age_ms": 91.66962900781073}, {"seq": 3, "t": 98355.724977829, "age_ms": 96.71970699855592}, {"seq": 5, "t": 98355.746737933, "age_ms": 85.05334200162906}, {"seq": 7, "t": 98355.811812333, "age_ms": 99.49484300159384}, {"seq": 9, "t": 98355.855008216, "age_ms": 93.07221800554544}, {"seq": 11, "t": 98355.878115785, "age_ms": 84.21365500544198}, {"seq": 13, "t": 98355.942969983, "age_ms": 97.87701100867707}, {"seq": 15, "t": 98355.985667712, "age_ms": 90.535950002959}, {"seq": 16, "t": 98356.007255445, "age_ms": 95.50669700547587}, {"seq": 18, "t": 98356.050922066, "age_ms": 106.91348499676678}, {"seq": 19, "t": 98356.069924824, "age_ms": 91.23097399424296}, {"seq": 23, "t": 98356.142226829, "age_ms": 81.00628000102006}, {"seq": 32, "t": 98356.188019064, "age_ms": 89.46556398586836}, {"seq": 33, "t": 98356.21818391, "age_ms": 90.06463299738243}, {"seq": 34, "t": 98356.261625372, "age_ms": 117.58179801108781}, {"seq": 35, "t": 98356.283371186, "age_ms": 105.36857199622318}, {"seq": 38, "t": 98356.329538495, "age_ms": 101.19463900628034}, {"seq": 39, "t": 98356.352179702, "age_ms": 107.8502999880584}, {"seq": 42, "t": 98356.418923271, "age_ms": 106.85661699972115}, {"seq": 44, "t": 98356.465164952, "age_ms": 103.8370699970983}, {"seq": 45, "t": 98356.509083277, "age_ms": 97.6413549942663}, {"seq": 48, "t": 98356.55328072, "age_ms": 75.39038801041897}, {"seq": 50, "t": 98356.597508495, "age_ms": 86.50114201009274}, {"seq": 52, "t": 98356.663186342, "age_ms": 101.76745700300671}, {"seq": 53, "t": 98356.708553921, "age_ms": 131.05295099376235}, {"seq": 55, "t": 98356.734209134, "age_ms": 105.64448199875187}, {"seq": 56, "t": 98356.779146807, "age_ms": 134.79056301002856}, {"seq": 58, "t": 98356.80110699, "age_ms": 106.49991799436975}, {"seq": 59, "t": 98356.846292282, "age_ms": 134.7132730006706}, {"seq": 61, "t": 98356.865862027, "age_ms": 104.5329680055147}, {"seq": 62, "t": 98356.910359296, "age_ms": 114.59433400887065}, {"seq": 64, "t": 98356.932199899, "age_ms": 104.76454700983595}, {"seq": 65, "t": 98356.977556978, "age_ms": 116.220334006357}, {"seq": 67, "t": 98356.99821432, "age_ms": 103.01284200977534}, {"seq": 68, "t": 98357.043268074, "age_ms": 131.75205800507683}, {"seq": 70, "t": 98357.064146201, "age_ms": 103.2814589998452}, {"seq": 71, "t": 98357.107734076, "age_ms": 112.9744589998154}, {"seq": 73, "t": 98357.12946939, "age_ms": 100.95722699770704}, {"seq": 74, "t": 98357.173910078, "age_ms": 129.03554599324707}, {"seq": 76, "t": 98357.195058575, "age_ms": 100.04141999525018}, {"seq": 77, "t": 98357.238965819, "age_ms": 127.90507799945772}, {"seq": 79, "t": 98357.260521472, "age_ms": 98.83687099500094}, {"seq": 80, "t": 98357.307174104, "age_ms": 129.49491399922408}, {"seq": 82, "t": 98357.325772917, "age_ms": 97.41619900160003}, {"seq": 84, "t": 98357.369213506, "age_ms": 107.03365999506786}, {"seq": 85, "t": 98357.391762551, "age_ms": 96.42601698578801}, {"seq": 87, "t": 98357.435689627, "age_ms": 108.2662109984085}, {"seq": 88, "t": 98357.457274738, "age_ms": 95.50466500513721}, {"seq": 90, "t": 98357.499881182, "age_ms": 105.83231499185786}, {"seq": 91, "t": 98357.522983504, "age_ms": 94.67051998944953}, {"seq": 93, "t": 98357.566014604, "age_ms": 105.01246200874448}, {"seq": 94, "t": 98357.587766252, "age_ms": 92.31041400926188}, {"seq": 96, "t": 98357.631389129, "age_ms": 103.80849300418049}, {"seq": 97, "t": 98357.652960531, "age_ms": 90.75411999947391}, {"seq": 99, "t": 98357.696283582, "age_ms": 101.1838520062156}, {"seq": 100, "t": 98357.718650923, "age_ms": 107.46589899645187}, {"seq": 102, "t": 98357.761754354, "age_ms": 100.16391999670304}, {"seq": 103, "t": 98357.78114298, "age_ms": 103.75511900929268}, {"seq": 107, "t": 98357.852068361, "age_ms": 73.68214300367981}, {"seq": 108, "t": 98357.879938144, "age_ms": 85.13443300034851}, {"seq": 109, "t": 98357.902250652, "age_ms": 91.54072499950416}, {"seq": 110, "t": 98357.945525288, "age_ms": 100.73819699755404}, {"seq": 111, "t": 98357.968083082, "age_ms": 105.78477599483449}, {"seq": 112, "t": 98357.989139998, "age_ms": 94.50515000207815}, {"seq": 114, "t": 98358.010794523, "age_ms": 83.06219399673864}, {"seq": 115, "t": 98358.055395333, "age_ms": 92.67440499388613}, {"seq": 117, "t": 98358.077060067, "age_ms": 82.74749398697168}, {"seq": 118, "t": 98358.098946753, "age_ms": 70.86005000746809}, {"seq": 121, "t": 98358.178328502, "age_ms": 99.90026200830471}, {"seq": 122, "t": 98358.199293838, "age_ms": 87.84948999527842}, {"seq": 123, "t": 98358.220783577, "age_ms": 92.75723999598995}, {"seq": 126, "t": 98358.243168418, "age_ms": 81.84889600670431}, {"seq": 128, "t": 98358.287873936, "age_ms": 76.58969800104387}, {"seq": 130, "t": 98358.332521413, "age_ms": 87.81536700553261}, {"seq": 131, "t": 98358.376454034, "age_ms": 98.3Line truncated
@@ -0,0 +1 @@
{"pid": 1031422, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [71.43153599463403, 117.63684800826013, 104.62590999668464, 121.25955399824306, 112.9422939993674, 116.11030698986724, 102.52800800662953, 126.86438299715519, 96.21882499777712, 103.12182799680158, 114.23814999579918, 122.66157398698851, 92.82099400297739, 130.95666699518915, 110.8464449935127, 121.1192829941865, 102.23314899485558, 116.41918699024245, 95.08428200206254, 125.35856399335898, 104.45210200850852, 126.96531700203195, 122.86516900348943, 99.40055999322794, 122.27805898874067, 105.41516699595377, 130.26457901287358, 143.4397309931228, 134.10632700833958, 114.43241700180806, 124.94558699836489, 96.36147499259096, 123.48175200168043, 125.55282699759118, 102.6814510114491, 104.13654601143207, 101.86393400363158, 128.83050700474996, 91.8807099951664, 151.81884700723458, 101.62186100205872, 122.74298899865244, 101.33457598567475, 124.23308200959582, 101.36841300118249, 137.06990900391247, 115.74111800291575, 114.28456999419723, 120.37968100048602, 122.05643400375266, 153.2229120057309, 101.03825900296215, 134.2644459946314, 100.02241299662273, 128.9731529977871, 100.33157299039885, 117.5083019916201, 105.25071300799027, 123.47945400688332, 108.0967299931217, 129.51098699704744, 95.58831799949985, 124.18177799554542, 120.76119000266772, 106.98347201105207, 128.3510609937366, 141.09018200542778, 111.46132899739314, 125.68966700928286, 144.13686899933964, 95.32816600403748, 120.67224600468762, 143.75946199288592, 119.2253269982757, 112.49177399440669, 109.56700801034458, 129.9902030004887, 152.22840300702956, 101.71552700921893, 153.49274899926968, 115.91295100515708, 82.39422801125329, 172.76797999511473, 102.41609999502543, 149.46639198751654, 147.44373700523283, 109.97826501261443, 133.41022600070573, 115.98120999406092, 126.29926999215968, 124.46881299547385, 100.2794090018142, 137.4441819934873, 101.89550199720543, 147.80715900997166, 94.23825998965185, 120.34066300839186, 105.6077550019836, 120.18550500215497, 121.67238800611813], "p50": 118.43108750326792, "p95": 151.81884700723458, "maximum": 172.76797999511473}, "click_release": {"samples_ms": [152.70181199593935, 156.48347600654233, 198.7155639944831, 169.89663599815685, 170.70570999931078, 163.65512000629678, 152.83307401114143, 162.3108659987338, 138.2693269988522, 182.44241799402516, 182.91928300459404, 169.09693500201683, 179.8883589945035, 182.0909770030994, 179.20588300330564, 167.22331999335438, 148.5074980009813, 174.9216960015474, 171.33457500312943, 156.93414999987, 192.3393559991382, 192.7952300029574, 166.9459749973612, 195.3084749984555, 164.77457199653145, 181.56195600749925, 162.3990079970099, 148.52444200369064, 159.2242949991487, 154.07095100090373, 187.89858199306764, 189.61004400625825, 186.5479099942604, 185.75051399238873, 187.58505801088177, 157.61697699781507, 162.06654500274453, 188.4518879960524, 182.96867598837707, 156.82017500512302, 197.56511198647786, 164.59817100258078, 152.19182599685155, 176.9937400094932, 173.0758759949822, 164.4310650008265, 186.0527219978394, 169.60075100359973, 196.26141899789218, 182.60705799912103, 167.22431100788526, 184.97884798853192, 212.58391400624532, 173.40052500367165, 209.0457919985056, 184.98731999716256, 211.68503699300345, 167.60903400427196, 169.94290699949488, 215.48392200202215, 183.63432800106239, 223.64604799076915, 216.9664510001894, 164.85403200204019, 143.51849399099592, 163.8930189947132, 147.4591220030561, 177.67456400906667, 183.74372500693426, 179.00045998976566, 164.4888959999662, 145.6619230011711, 179.78211800800636, 193.96614900324494, 157.55876600451302, 158.25029299594462, 186.1922450043494, 170.0071340019349, 179.72000999725424, 176.43971300276462, 204.3005799932871, 182.44034399685916, 167.26641499553807, 199.56578098936006, 161.8071209959453, 151.85275000112597, 196.86530501348898, 174.287864996586, 172.1185019996483, 157.50426800514106, 187.73955400683917, 170.83345299761277, 156.11538699886296, 205.77001899073366, 180.27246999554336, 190.63284499861766, 163.38008199818432, 182.07582300237846, 169.03276300581638, 181.63425000966527], "p50": 174.6047804990667, "p95": 211.68503699300345, "maximum": 223.64604799076915}, "masked_character": {"samples_ms": [133.5580930026481, 76.64927799487486, 84.0236280055251, 83.67451099911705, 100.24083299504127, 89.1609379905276, 96.26316600770224, 74.87715501338243, 87.35002200410236, 106.89915799594019, 79.16748301067855, 209.85361099883448, 79.86105499730911, 98.88753599079791, 107.01582601177506, 74.09317400015425, 136.10022999637295, 79.18586400046479, 91.02641099889297, 103.30094999517314, 96.22584900353104, 108.47793098946568, 97.30441099964082, 106.93067000829615, 116.67651199968532, 113.55312199157197, 98.05485700780991, 71.47173798875883, 91.97373299684841, 77.96585799951572, 86.10581600805745, 103.71249599847943, 91.64707700256258, 99.63274600158911, 90.7992Line truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Loaded 100 of 225 files, more files were not shown because too many files have changed in this diff. Show more