Codex 启动缓慢的解决方法

我的游戏本点开 Codex 后接近六分钟才出窗口,另一台轻薄本却很快。最后通过 Windows 官方工具把 Codex 从 D 盘迁回 C 盘,解决了启动缓慢的问题。记录这次排查、计时口径和迁移过程。

前段时间,我这台游戏本使用Codex 过程中遇到了一个问题:点开之后没反应,没有窗口,右下角托盘也没有Codex图标,得等好久接近6分钟,窗口才会突然弹出来。

我还有另一台轻薄本就没有出现这个问题,打开Codex很快,如果是跟电脑性能有关系,打开更慢的应该是我的轻薄本。通过Codex排查,浏览日志也没有查出什么问题,只说每次启动时要从D盘到C盘复制大量文件。

Codex 启动延迟排查记录

最后解决办法很简单:把 Codex 从 D 盘迁回 C 盘。 我用的是 Windows 官方的应用迁移命令,迁完再打开,问题圆满解决。

排查过程中计时口径问题

使用 Codex 排查日志过程中,它根据几次日志里两三秒的启动记录,就认为启动已经正常了,不再继续排查。

可我实际坐在电脑前等了好几分钟,窗口才出来。排查结果和实际使用体验明显不同。

排查发现是计时口径的问题:日志里的 Launching app 到 ready-to-show,和我点开应用到真正看到窗口,不是一回事。前面可能还有等待,ready-to-show 也只是应用内部的一个节点。

排查两台电脑设置差别

我排查游戏本设置本身没有排查到问题出现的原因,就看了看没有使用问题的轻薄本的各设置项。发现有问题的这台游戏本,Codex 实际安装在 D 盘;另一台安装在 C 盘。两台当时核对的版本相同,而且正好和排查中发现的每次启动时要从D盘到C盘复制大量文件有关联。就开始顺着这个线索往下排查。(ps:我有C盘洁癖🤣,不管安装的什么软件,我都会把它迁移到D盘,之前使用过程中没出现过问题,没想到这次因为这习惯搞得这么麻烦)

这里还有个坑:看到一个以 C:\Program Files\WindowsApps 开头的路径,不一定就能认定应用真的在 C 盘。我这台当时有路径重定向,还得继续检查 Windows 登记的 AppX 安装卷。

后面的排查发现,一次很慢的启动期间,Codex 正在准备一个叫 cua_node 的运行时缓存。这批文件一共 2,283 个,约 250 MB,文件创建时间分布在五分多钟里,这和窗口迟迟出不来的时间对得上。

安装包文件的复制测试还出现过 UNKNOWN / errno=-4094。结合当时检查到的代码,线索指向启动时的同步复制:普通复制失败后,程序回退到逐个文件读写,可能长时间占住主线程,连窗口创建也一起等着。导致每次打开Codex都要等待很久。

缓存也不是每次都重新生成。有了现成缓存,后续某几次打开很快。

迁移过程

没有手动拖动安装目录,也没有重装。我先备份了配置和应用数据,正常退出 Codex,然后用 Windows 自带的 Move-AppxPackage,把 Codex 迁到系统安装卷。

微软的官方说明写明,这个命令会迁移应用包及其应用数据。

如果你也想检查,可以在安装 Codex 的那个 Windows 账户下,打开 Windows PowerShell,先看安装包和安装卷:

Get-AppxPackage -Name OpenAI.Codex |
    Select-Object Name, PackageFullName, InstallLocation

Get-AppxVolume |
    Select-Object PackageStorePath, IsSystemVolume, IsOffline

为了避免只看表面路径,再查一下哪个安装卷登记了 Codex:

Get-AppxVolume | ForEach-Object {
    $volume = $_
    Get-AppxPackage -Volume $volume -Name OpenAI.Codex |
        Select-Object Name, PackageFullName,
            @{Name='PackageStorePath'; Expression={$volume.PackageStorePath}}
}

确认它确实装在其他盘、系统盘有足够空间,备份好数据并退出 Codex 后,再执行迁移。下面这段只针对当前账户的 Codex,不会把其他应用一起搬走:

$package = @(Get-AppxPackage -Name OpenAI.Codex)
$systemVolume = @(Get-AppxVolume | Where-Object IsSystemVolume)

if ($package.Count -ne 1) {
    throw '没有找到唯一的 Codex 安装包,请先确认安装情况。'
}
if ($systemVolume.Count -ne 1 -or $systemVolume[0].IsOffline) {
    throw '系统 AppX 安装卷不可用,先不要继续迁移。'
}

Move-AppxPackage -Package $package[0].PackageFullName `
    -Volume $systemVolume[0] -Confirm

如果提示权限不足,可以在同一账户下用管理员身份打开 Windows PowerShell。迁移过程中报错,就先看具体错误,不要为了搬目录去强改 WindowsApps 权限。 如果不想使用命令,在Windows设置-应用-安装的应用-ChatGPT-移动选项中选择移动到C盘就好了,和命令行一样的效果。

Windows 已安装应用中的移动入口

Windows 应用移动对话框,当前安装位置为 C 盘

图中当前安装位置已是 C 盘;实际从 D 盘迁回时,应把目标驱动器选为 C 盘。

迁完以后,终于正常了

9 月 28 日迁移完成后,从发出启动请求到窗口实际出现时间 3.95 秒。

原有任务、项目和运行时缓存都保留了。迁移后核对了 859 个用户数据文件,没有发现差异;同一批 2,283 个运行时文件的完整复制测试用了约 3.915 秒,复制错误为 0。

3.95 秒是实际启动等待,3.915 秒是另外做的复制测试。

使用过程中也没有再出现类似启动缓慢的情况。

后来在 GitHub 上也找到了类似的 Windows 启动问题,已经把自己从 D 盘迁回 C 盘的办法回复在下面。

如果你也使用Windows 商店版 Codex,装在其他盘,点开后要等几分钟才出窗口,我建议先查一下实际安装卷。至少在我这里折腾了一圈,最后真正起作用的就是把它迁回系统盘。

评论