Windows: ChatGPT.exe enters persistent CPU / ~1 GB/s process-read state until restart

Resolved 💬 3 comments Opened Aug 14, 2026 by BearDoesCode Closed Aug 15, 2026
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

What version of the Codex App are you using (From “About Codex” dialog)?

26.810.4967.0 (embedded app bundle 26.810.41047; runtime bundle 26.813.12317)

What subscription do you have?

Unknown — exact ChatGPT subscription tier was not exposed during diagnostics

What platform is your computer?

Windows 11 Home Single Language 64-bit, build 26200.9168; AMD Ryzen 7 6800HS (16 logical CPUs); 15.26 GB RAM; NVIDIA RTX 3050 Laptop

What issue are you seeing?

Summary

Codex Desktop became progressively slow and made the entire Windows desktop stutter. Switching tasks and starting responses took about 15 seconds. The affected ChatGPT.exe main process stayed in a high-CPU, high-process-read state until Codex was fully quit and relaunched. Performance returned to normal immediately after restart.

Measured impact before restart

  • Main process PID 7376 sustained roughly 110–177% in Windows process CPU counters (about 1.1–1.8 logical cores).
  • Process read-transfer counters repeatedly showed roughly 475–998 MB/s; two samples transferred 8.1–8.5 GB in 9–11 seconds.
  • Working set was roughly 1.0–1.24 GB and private memory roughly 1.3 GB.
  • One sample showed about 248,699 page faults/sec.
  • Available RAM was about 2.1–2.6 GB.

The process-read counter can include cached files, IPC, devices, and other handles. Physical disk queues were normal/idle, so this is not being reported as 1 GB/s of physical SSD reads.

Immediately after restart

  • New main process PID 13920 sampled at approximately 0% CPU and 0 MB/s process reads.
  • Working set was roughly 370–385 MB.
  • Available RAM recovered to roughly 3.8–4.2 GB.
  • Desktop responsiveness returned.

Correlated app-state bug

The affected session also logged a conversation-state synchronization storm: 7,053 electron-message-handler errors, 2,549 unknown item/started events, 2,549 matching item/completed events, and 1,579 Conversation state not found messages.

Installed app code and logs show that a hidden avatarOverlay renderer mounts the full app, receives most lifecycle broadcasts for background/subagent tasks it has not hydrated, performs independent app-server reads, and logs many of these errors. Across the affected log, 2,098 unique reasoning-summary items were delivered exactly once to both the primary renderer and hidden overlay.

This is a real work-amplification/state-sync bug, but it is not proven to be the runaway root cause. After restart, the same mirrored overlay traffic and unknown-conversation errors continued at even higher rates while CPU and process reads remained healthy.

The strongest incident-only log difference was ResizeObserver loop warnings: 35 in a 13-minute affected window versus 1 in a 12-minute healthy post-restart window. This is correlation only because no useful stack was logged.

No relevant Windows events were found for disk, NTFS, storage, WHEA, GPU/display reset, power, or app crash. The previously oversized Codex diagnostic database was inactive; the current logs database was only about 30–33 MB with normal IDs.

What steps can reproduce the bug?

This has not been reproduced deterministically.

Observed conditions:

  1. Keep a very large, long-running Codex task open for several hours.
  2. Create many subagent tasks in its task tree.
  3. Keep Unity Editor open at the same time; it was using DirectX 11 and about 4.5 GB private memory but was mostly CPU-idle.
  4. With available RAM down to about 2.1–2.6 GB, continue switching among Codex tasks.
  5. Codex and then the whole desktop began stuttering; task changes and response starts took about 15 seconds.
  6. Fully quit and relaunch Codex. The runaway ended immediately.

Reopening the same large task and running four agents after restart did not reproduce the runaway, so task size, subagent fan-out, and RAM pressure may be stressors but are not sufficient causes.

Timeline (America/Santiago, UTC-4):

  • 14:41:52 — whole-PC slowdown reported.
  • 14:45–14:52 — sustained high main-process CPU/read counters captured.
  • 14:55:37 — affected Codex session ended.
  • 14:55:51 — new session began after a 14.4-second restart gap.

Affected desktop session: 2462e13b-b48e-4003-b9c5-7a26bb9df041
Healthy comparison session: 2901946c-cc09-4292-98f7-bb47641b4ad3
Active root task: 01a00097-dd17-72c0-a484-f061f597b38e

A Windows Performance Recorder trace was attempted, but system performance profiling could not be enabled (0xc5585011: Failed to enable policy to profile system performance), so no ETL call-stack trace was produced.

What is the expected behavior?

Codex should remain responsive during long-running tasks and subagent activity without leaving the desktop main process in a persistent CPU/process-read runaway.

A hidden overlay that is not presented should not mount and process the full app event stream, perform duplicate background reads, or receive lifecycle events for conversations it has not hydrated.

If sustained abnormal CPU/read activity occurs, the app should capture enough per-process stack and handle diagnostics to identify the source and recover without requiring a full restart.

Additional information

Relevant local logs

Affected:
%LOCALAPPDATA%\Codex\Logs\2026\08\14\codex-desktop-2462e13b-b48e-4003-b9c5-7a26bb9df041-7376-t0-i1-153705-0.log

Healthy comparison:
%LOCALAPPDATA%\Codex\Logs\2026\08\14\codex-desktop-2901946c-cc09-4292-98f7-bb47641b4ad3-13920-t0-i1-185551-0.log

Database check

  • Active %USERPROFILE%\.codex\logs_2.sqlite: about 30–33 MB with normal IDs below 100,000 during investigation.
  • The old pathological database is only an inactive backup: %USERPROFILE%\.codex\backups\20260814-1130-lag-reset\logs_2.sqlite (about 2.33 GB, IDs around 550–560 million).
  • thread_history_1.sqlite was about 322 MB but had not been modified for hours before the incident.

Requested investigation

  1. Inspect why the desktop main process can enter a persistent CPU/process-read runaway without a renderer crash or queue-overflow signal.
  2. Record main-process CPU stacks and per-handle read sources when sustained thresholds are exceeded.
  3. Avoid registering a hidden avatar overlay as a full app-server consumer while it is not presented, or filter lifecycle/turn events for unhydrated background tasks.
  4. Investigate the primary renderer's ResizeObserver warning burst around 14:45–14:52.
  5. Reconcile completed subagent lifecycle state so spawn edges do not remain open and renderers do not receive events for missing local conversation state.

All user-identifying filesystem prefixes and prompt/title content were intentionally redacted.

View original on GitHub ↗

3 Comments

github-actions[bot] contributor · 13 days ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #38518
  • #38551
  • #38554

Powered by Codex Action

PeterShanxin · 13 days ago

I can reproduce the same persistent ChatGPT.exe process-read runaway on Windows 11 ARM64, with substantially more ETW detail. This looks like the same bug family rather than a separate issue.

Environment

  • Windows 11, ARM64, 12 logical CPUs, 31.8 GB RAM
  • Package: OpenAI.Codex_26.810.6296.0_arm64__2p2nqsd0c76g0
  • Version resource: Codex 151.0.7922.137
  • Affected process: Electron main/browser ChatGPT.exe (no --type= switch)

Process-level measurements during the runaway

Over ~90 minutes on one affected process:

  • 713.0 GB logical reads across 1,561,158 read ops
  • typical logical read rate ~880 MB/s, peak 1.13 GB/s
  • only 235.46 MB physical disk reads total; current physical read delta was 0 B/s
  • logical:physical ratio ~3000:1
  • 173,446 page faults/s, with 74 hard faults cumulative and 0/s during measurement
  • network ~0 B/s during the runaway
  • renderer/utility ChatGPT.exe children did not show corresponding I/O; the anomaly was in the Electron main process

So on this machine the ~1 GB/s figure is also not SSD throughput - it is cached/process logical reads serviced from memory.

ETW fingerprint

A 45-second Microsoft-Windows-Kernel-File trace taken while the storm was active captured:

  • 35.1 GB / 45 s = ~780 MB/s of reads
  • 511.2 KB average read size
  • 7,984 of 8,000 sampled reads were exactly 524,288 bytes
  • the read load was carried by exactly 4 threads in the Electron main process, ~8.8 GB each in 45 s

That strongly fingerprints Node async filesystem reads saturating the default 4-thread libuv threadpool: 4 worker threads plus 512 KiB read chunks. I am deliberately not naming the offending file yet - the hot handles predated the first ETW trace, so the trace had kernel object pointers but no resolvable path names. A later trace resolved names but the runaway did not reproduce in that window.

This also rules out my earlier local SQLite hypothesis: 524,288-byte reads are inconsistent with SQLite page reads (<=64 KiB).

Lifecycle

The important behavior matches this issue closely:

  • after a substantial Codex session finishes, the main process can remain at 550-911 MB/s indefinitely while the app is otherwise idle
  • response completed, network ~0 B/s, but the read/page-fault storm continues
  • fully quitting/restarting the app clears it immediately
  • light sessions after restart did not deterministically reproduce it, so task size/state appears to be a stressor rather than a sufficient trigger

Separate but possibly related filesystem churn

Even when the full read storm was absent, a 300-second ETW capture showed persistent background filesystem churn from the app:

  • 1,612,198 file Create/open events = 5,374 opens/s
  • 213,671 directory enumerations = 712 DirEnum/s

I am treating this as a separate confirmed defect for now. It may feed the read storm, but I do not have proof of causality yet.

Current attribution gap

The remaining decisive experiment is to start ETW before app launch, then run a substantial session until the storm reproduces, so the Create events map the hot file object(s) to actual paths. I do not want to overstate the filename or higher-level caller until that capture succeeds.

This ARM64 case adds a second Windows architecture and a very similar process-read/page-fault signature to the one reported here.

BearDoesCode · 12 days ago

Closing as a duplicate of #38518, which tracks the same persistent Electron main-process logical-read/CPU loop, system-wide Windows stutter, and restart workaround. The diagnostics and independent ARM64 corroboration here remain useful supporting evidence.