Linux内存卡死优化:从swap颠簸到earlyoom的调优实战
如果你的Ubuntu电脑或者服务器用着用着突然变成“幻灯片”鼠标一卡一顿SSD指示灯狂闪连切个窗口都要等好几秒那大概率不是CPU不行而是内存管理出了问题。接触过Linux一段时间的朋友都知道Windows卡了可以看任务管理器Ubuntu卡了却经常让人摸不着头脑——明明内存看起来还有剩余系统却慢得要死甚至直接黑屏、死机、远程连不上。这篇内容就是围绕这个痛点来的我会从Linux内存管理的底层逻辑讲起用手上实际能跑的命令和参数逐步把“卡死”这个问题拆开、定位、优化最终让系统在内存紧张时能自动做出聪明的决策而不是傻等OOMOut Of Memory把整个桌面或者关键进程杀掉。适合被卡死困扰的桌面用户、跑着多服务的服务器管理员以及想系统搞懂内存参数的新手开发者。1. 先搞清楚Linux内存“卡死”到底是怎么发生的1.1 别再只看任务管理器先看懂free -h里的数字很多朋友一遇到卡顿第一反应是打开系统监视器看CPU占用。结果CPU才30%内存剩余显示还有2GB搞不懂为什么机器会慢成那样。这里有第一个常见的误区Linux的内存占用不能只看“剩余”那一列因为那只是“没有被任何进程使用”的内存真正的关键指标是“可用内存available”和swap的使用情况。打开终端执行一次free -h会看到类似下面的输出total used free shared buff/cache available Mem: 15Gi 9.6Gi 1.1Gi 1.2Gi 4.6Gi 4.8Gi Swap: 2.0Gi 1.9Gi 91Mi - -注意看两个地方一是buff/cache那列占了4.6Gi这部分是内核用空闲内存做文件缓存和缓冲区属于“可以随时释放”的所以available不是简单的 freeswap而是系统估算的“真正还能分给进程的可用量”。二是Swap的 used 接近2GB说明系统已经在往硬盘上置换内存页了。如果Swap被大量使用即使available还有几GB系统也可能因为磁盘IO瓶颈而卡成PPT。我在实际使用中发现Ubuntu默认的swappiness值是60意味着内核在内存回收时是比较“积极”地倾向于使用swap的这在物理内存不够用的低端机器上确实能保底但在内存达到8GB甚至16GB以上的机器上反而带来了频繁的换入换出把好好的NVMe盘折腾得够呛。这个参数后面细讲。1.2 卡死的三位“元凶”swap颠簸、OOM误杀、缓存误判根据我踩过的坑Ubuntu内存卡死基本可以归为三类swap颠簸、OOM误杀、缓存误判。第一类swap颠簸。当物理内存被消费得差不多、内核又希望尽量腾点空间时会把一些不太活跃的内存页写到swap分区同时把需要的页读回来。如果系统内存长期处于“差一口气”的状态就会反复换入换出搞到整机慢到没法用。这种现象最典型的特征是内存看起来没用完磁盘IO却持续打满尤其机械硬盘上体验极其明显。第二类OOM误杀。内核内存压力过大时会启用OOM Killer挑选一个进程杀掉。问题在于内核的评分逻辑并不总是符合我们的期望它可能优先杀掉正在跑的训练任务、数据库甚至桌面环境的某个关键组件而不是“占内存最多且不重要”的那个浏览器标签页。杀完之后系统可能恢复了但你的工作也丢了一半。第三类缓存误判。上面说的buff/cache看着占据很多内存其实它不影响进程运行但会误导初学者的判断和脚本监控。有时候free -h显示已用内存90%以上但其实系统运行得很好因为里面大部分是文件缓存随时可以被回收。真正需要关心的是available数字和swap使用率。理解了这三类问题优化的方向就很清楚了让内核在“该用swap的时候”才用让系统在内存耗尽之前有“人为干预”的余地同时要看清缓存背后的真实内存压力。2. 动手前先体检定位内存问题根因的3个命令2.1 两步确认是“真不够”还是“配置不合理”不先确诊就乱调参数是优化的大忌。我曾经在一台内存只有8GB的服务器上直接设置了vm.swappiness1结果适得其反——系统内存不够时反而频繁触发OOM因为swap几乎不怎么用了。所以第一步必须通过日志和监控数据确认问题类型。按下面两步走就能快速定位查看内核日志中是否有OOM记录sudo dmesg -T | grep -i out of memory | tail -20如果没有任何输出说明还没到OOM的程度如果看到类似Out of memory: Killed process 1234 (cupsd)的记录说明确实发生过内存耗尽。观察一段时间内存使用和swap变化vmstat 2 15重点看siswap in和soswap out两列。如果这两个数字频繁非零尤其是so那一列几乎不停就说明系统正在持续地把内存页往磁盘上搬——这就是“swap颠簸”的实锤。si和so都接近0则大概率不是swap问题要往其他方向排查比如某个进程内存泄漏、缓存被异常持有等。2.2 区分内存压力类型持续短缺还是瞬时尖峰还有一种情况是系统平时内存很充裕只有某几个特定操作比如编译大型程序、打开超大的图片、跑机器学习模型才会瞬间飙升。这时候我们需要搞清楚到底是持续紧缺还是瞬时尖峰这决定了优化策略完全不同。最简单的方法是用top或htop观察在内存飙升时按M键按内存排序看看是哪个进程在吃内存。也可以用systemd-cgtop查看cgroup层级的内存占用这在服务器上一眼就能看出哪个服务在“闯祸”。一个更具体的场景我在某台跑着三个服务的服务器上遇到卡顿free -h显示内存还剩不少但htop里有几个进程的RES数值异常偏大最后用cat /proc/meminfo发现Shmem:占了好几个GB才意识到是某个服务挂了共享内存没有释放。这时候需要记录的其实就两件事一是消耗大户的名字和内存量二是它出现的频率。如果把内存消耗按“日常唯一占用大户”删除掉后系统立刻流畅说明是应用问题而非系统配置问题优化思路就不再是调内核参数而是要限制应用行为或者增加物理资源。3. 系统级调优四组sysctl参数让内存管理更聪明3.1 核心项swappiness降下来但别降成零绝大多数Ubuntu优化教程里都会被提到的一个参数就是vm.swappiness。这个参数控制内核在内存回收时“倾向于使用swap的程度”范围0到100默认是60。数值越高内核越积极地把不常用的内存页换出到swap分区数值越低越倾向于回收文件缓存。我的经验是对于8GB以上内存、使用SSD的普通环境设置vm.swappiness10是一个比较稳妥的起点。10意味着系统在内存压力不大时几乎不动swap只有当内存真的紧张了才启动换出。即使如此也不是无脑设小比如前面提到的8GB物理内存机器如果swap完全禁用或者swappiness过低一旦遇到瞬时尖峰就会直接触发OOM杀进程。临时生效和永久生效的方法# 临时调整立即生效 sudo sysctl vm.swappiness10 # 永久写入配置文件 echo vm.swappiness10 | sudo tee -a /etc/sysctl.conf注意写入/etc/sysctl.conf后需要执行sudo sysctl -p或者重启才能生效。提示如果物理内存只有4GB甚至更小不建议强行把swappiness降到10以下那样会让日常使用频繁触发OOM。在这种情况下优先考虑加物理内存或者配置zram后面会提到。3.2 两个容易忽略但影响巨大的参数vfs_cache_pressure与min_free_kbytesvm.vfs_cache_pressure控制内核回收目录项dentry和索引节点inode缓存的速度。默认值是100表示按正常速率回收值调高比如200表示更积极回收调低比如50表示更倾向保持这些元数据缓存因为它们对文件操作性能很有帮助。我一般在文件操作频繁的服务器上设置vm.vfs_cache_pressure50。因为目录项缓存被提前回收后下次访问同一目录还要重新读取磁盘元数据虽然不影响内存“够不够用”但会让大量小文件操作明显变慢。桌面环境调低一点也有好处文件管理器打开大目录时会更跟手。再一个是vm.min_free_kbytes它表示内存回收时内核希望保留的最小空闲内存量单位是KB。这个参数直接影响系统在内存紧张时是否还能快速响应。如果这个值太小可能出现内存都快分光了才想起来回收导致进程申请内存时出现较长时间的卡顿如果太大又会白白浪费内存。通常建议保留物理内存的1%左右作为min_free_kbytes。比如16GB内存的机器可以设置256000约250MB8GB内存设置约100000约100MB。注意不能为了追求“内存全用上”就把这个值设成0我实测过设成0以后内核在内存紧张时很容易陷入卡顿甚至休眠式等待。3.3 让参数开机自动生效确认配置没白写sysctl参数往往不是设置完就万事大吉因为有些内核参数会被系统其他机制覆盖而且/etc/sysctl.conf在新版Ubuntu上优先级并不总是最高。更可靠的做法是在/etc/sysctl.d/下单独建一个配置文件sudo vim /etc/sysctl.d/99-memory-tuning.conf内容写入vm.swappiness10 vm.vfs_cache_pressure50 vm.min_free_kbytes100000然后执行sudo sysctl --system这样会按目录顺序加载所有配置99开头的文件通常最后加载优先级更有保障。验证的时候用sysctl vm.swappiness vm.vfs_cache_pressure vm.min_free_kbytes如果输出的值和你写入的一致就说明已经生效。我踩过一次坑在/etc/sysctl.conf里配了swappiness1后来发现每次重启都是60排查半天才发现是另一个包在/etc/sysctl.d/里也写了一个vm.swappiness90的配置把覆盖当成常事了。4. 加一道自动安全阀用earlyoom在卡死前止损4.1 earlyoom的原理为什么它比内核OOM更“文明”前面提到内核自带OOM Killer但它的触发时机其实很晚——通常在内存耗尽已经发生、系统进入不可用状态之后才动手。想象一下屋里已经着火了消防队才出发。kernel OOM的问题就在于它介入太迟而且挑选进程的标准是基于内核内部的评分不考虑用户当前正在做什么。earlyoom的思路是把“判断是否还有足够可用内存”的动作提前通过不断读取/proc/meminfo和/proc/loadavg当可用内存或swap剩余量低于设定的阈值且系统负载过高时主动杀死占用内存最多的进程。因为它介入得早杀一个牛进程就能让系统恢复而不是等到完全卡死再翻车。它对桌面场景尤其友好。我有一次在笔记本上开着十几个浏览器标签页和一个视频渲染任务内存以肉眼可见的速度见底要是没有earlyoom大概率整机冻结只能按电源键但配置好earlyoom之后它会先尝试杀掉占用内存最多的那个标签页进程桌面还能继续用顶多提示你某个标签页无响应。4.2 安装、配置与阈值校准实操安装很简单sudo apt update sudo apt install earlyoom安装完成之后它的服务默认是启用的配置文件在/etc/default/earlyoom。默认阈值是可用内存低于10%时才动手我实际用下来在16GB内存的机器上10%意味着还剩1.6GB这个阈值触发时系统已经比较卡了但对大多数情况能兜底。你可以改成更激进的参数比如可用内存低于20%就开始留意、低于5%才动手sudo vim /etc/default/earlyoom关键配置项EARLYOOM_ARGS-r 60 -m 20 -s 5其中-r 60表示内存剩余低于6%后每60秒检查一次并杀进程-m 20表示可用内存低于20%启动关注-s 5表示swap剩余低于5%也启动关注。这里我用的是“关注”而非“立刻杀”——earlyoom默认在第一次达到阈值时不会马上杀它会先持续观察如果连续多次仍处于紧张状态才动手。这个机制能避免偶尔一次内存尖峰就误杀进程。改完配置后重启服务sudo systemctl restart earlyoom验证运行状态systemctl status earlyoom日志里能看到类似这样的输出earlyoom[1234]: mem avail: 15 of 16 GiB (93%), swap: 1.9 of 2.0 GiB (95%) earlyoom[1234]: sending SIGTERM to process 5678 (chrome)看到“sending SIGTERM”就说明它已经替你止损了。注意earlyoom杀进程时默认先发SIGTERM进程友好退出如果几秒后还没退出才会发SIGKILL。所以那些能响应SIGTERM的进程比如浏览器还有机会保存状态不至于冷冰冰被干掉。5. 现代方案组合拳systemd-oomd与cgroup内存限制5.1 systemd-oomd让“吃内存的进程”先被警告再被处理如果你用的是新版Ubuntu内核和systemd都比较新其实还有一个官方血统的选项叫systemd-oomd。它不是额外装一个独立监控程序而是集成在systemd体系里面通过监听cgroup的内存压力和swap使用情况来判断是否需要干预触发时机比earlyoom更“有章法”。安装和启用sudo apt install systemd-oomd sudo systemctl enable --now systemd-oomd它的配置在/etc/systemd/oomd.conf关键参数有两个ManagedOOMMemoryPressureLimit内存压力阈值默认50表示内存压力超过50%时开始关注和ManagedOOMPreference优先杀进程的策略。不过我个人的使用感受是systemd-oomd的默认配置比较保守在内存已经紧张到卡顿的边缘才会介入很多桌面用户觉得不如earlyoom“灵敏”。所以我的建议是如果只是桌面防卡死优先用earlyoom如果希望在一个较复杂的环境中“软性限制”某个服务的资源systemd-oomd和cgroup的组合更优雅。5.2 用MemoryMax限制单个服务的最大内存在很多场景下与其等内存耗尽后杀进程不如提前给某个服务设置内存上限。systemd的cgroup能力提供了两个常用参数MemoryHigh和MemoryMax。MemoryHigh软限制达到这个值后内核会持续对进程施加内存回收压力但不强制杀。MemoryMax硬限制达到后直接OOM Kill该服务不容商量。比如我想限制一个容易内存泄漏的web服务最多只用2GB内存sudo systemctl edit my-web-service在打开的override配置里写入[Service] MemoryHigh1.6G MemoryMax2G然后重载服务配置sudo systemctl daemon-reload sudo systemctl restart my-web-service这样如果服务真的内存失控它会被单独处理不会拖垮整个系统。来一个交互类比系统内存就像一个大办公室cgroup相当于是给每个部门划了工位区MemoryMax是工位上限到了上限要么自己走人要么被保安请走反正不会挤爆整个办公室。这个操作在跑数据库或多个Docker容器的机器上价值极高。我有一次在某台服务器上部署了一个爬虫服务它有个隐藏的内存泄漏隔几天就把一台机器的swap占满最后整个机器卡到ssh都连不上。后来用MemoryMax限制到1GB再也没出过问题——泄漏的服务被反复杀掉重启而其他服务毫发无损。6. 常见卡死问题速查与避坑经验6.1 卡死问题速查表现象、原因、处理方式下面把我在实践中遇到最多的问题整理成速查表方便以后遇到类似现象快速定位现象特征可能原因推荐处理方式系统逐渐变卡磁盘IO长时间100%swap颠簸内存在物理内存和swap间反复换入换出调低swappiness增大物理内存或配置zram检查大内存进程突然黑屏或桌面崩溃重启后日志有OOM记录内存耗尽触发内核OOM Killer安装配置earlyoom提前干预增加swap空间限制关键服务内存free显示used很高但系统并不卡buff/cache占了很多属于正常缓存不需要处理关注available和swap列某个服务反复被杀重启又崩溃服务内存泄漏或配置过高用MemoryMax限制单服务内存修复泄漏源头开机后一段时间内存占用持续爬升某进程存在内存泄漏用htop按内存排序定位替换或限制应用这张表的适用范围很广无论是桌面环境还是服务器只要能对上其中一行按推荐方式处理通常都能见效。6.2 最后的实操心得内存优化不是“数字越小越好”如果把内存优化理解为“尽量多留空闲内存”那就走进了最大的误区。Linux的设计哲学是“内存不用白不用”文件缓存该占就占关键是系统在内存紧张时能迅速做出正确选择。调优的目标是让这个“选择过程”更符合你的使用场景。我自己的基准配置大致是这样8GB到16GB内存的机器swappiness10vfs_cache_pressure50min_free_kbytes保留约物理内存的1%再加earlyoom兜底。服务器上会额外给重要服务设置MemoryMax。这套配置跑了很长时间最直观的改善就是以前一两周就可能出现一次的卡顿死机现在基本几个月遇不到一次而且即使遇到内存尖峰earlyoom会先动手而不是等内核把桌面干崩。另外对内存特别小的笔记本或者旧机器还有一个很实用的手段配置zram把一部分物理内存当作压缩后的swap使用数据不落盘压缩比通常在2:1到3:1之间。配置方式不复杂装好zram-tools后调整/etc/default/zramswap里的ALGO和PERCENT即可。简单来说它相当于给系统加了一个“虚拟内存增压器”特别适合内存吃紧但不想牺牲磁盘寿命的场景。最后说个容易忽略的细节改完这些参数之后把/proc/meminfo、free -h、vmstat这几条命令记熟遇到问题别急着重启先看数据再下结论。内存优化没有一劳永逸的银弹但理解了机制之后至少不会再被卡死问题牵着鼻子走。

相关新闻

STED超分辨成像:从衍射极限原理到系统搭建与调试实战

STED超分辨成像:从衍射极限原理到系统搭建与调试实战

STED这个名字,在超分辨成像的圈子里几乎无人不晓。它全称是受激发射损耗显微镜(Stimulated Emission Depletion Microscopy),能把普通共聚焦显微镜的分辨率从大约200纳米一直压到30纳米甚至更低,直接突破光学衍射极限。…

2026/10/16 3:33:05 阅读更多 →
Flutter鸿蒙开发实战:植物识别应用跨平台适配全攻略

Flutter鸿蒙开发实战:植物识别应用跨平台适配全攻略

最近我把一款植物识别类小工具从最初的单端Demo扩展成了支持 iOS、Android 和鸿蒙三个平台的 Flutter 应用,整个过程比预想的有意思,也踩了不少和平台适配有关的坑。这个项目表面上是“拍照识植物”,实际上把 Flutter 跨平台能力、图像预处理…

2026/10/16 3:33:05 阅读更多 →
Flutter鸿蒙端侧植物识别实战:从拍照到模型推理全链路

Flutter鸿蒙端侧植物识别实战:从拍照到模型推理全链路

跨端开发圈子里这两年最让人纠结的一件事,就是鸿蒙设备的适配怎么做。Flutter 很早就跑通了移动端、桌面和 Web,但鸿蒙这边受 SDK 演进影响,资料一直比较碎。前阵子我把一个植物识别助手从 Demo 做到了能装进鸿蒙手机跑通识别,整个…

2026/10/16 3:33:05 阅读更多 →

最新新闻

free-claude-code:本地运行类Claude推理的轻量实现方案

free-claude-code:本地运行类Claude推理的轻量实现方案

1. “free-claude-code”不是工具名,而是一类开发者的集体求解信号最近在多个技术社区、GitHub Issues 区和开发者 Slack 频道里,反复刷到一个高频组合词:free-claude-code。它从不单独作为产品名称出现,也从未见于任何官方文档或…

2026/10/16 4:16:17 阅读更多 →
本地开源AI生成3D模型闭环工作流:从文本到Unity可运行资产

本地开源AI生成3D模型闭环工作流:从文本到Unity可运行资产

1. 项目概述:为什么“能用了”这三个字值得单独强调?“3D AI模型终于能用了”——这句话不是营销话术,而是过去两年里我反复在多个跨行业项目中验证后的真实判断。这里的“能用”,特指在消费级硬件(RTX 4070级别显卡、…

2026/10/16 4:16:17 阅读更多 →
Repast多主体仿真完整教程:从环境搭建到结果验收的实例方案

Repast多主体仿真完整教程:从环境搭建到结果验收的实例方案

简介:这份资源是面向多Agent系统建模与仿真学习者的Repast完整教程与实例合集,适合社会科学、经济学及复杂系统方向的研究者、学生与工程师,用于从零掌握Repast的建模流程与实战技巧。压缩包共72个文件,约303KB,以htm与…

2026/10/16 4:16:17 阅读更多 →
Repast 多主体仿真完整教程与实例:从环境搭建到参数扫描的工程化实践

Repast 多主体仿真完整教程与实例:从环境搭建到参数扫描的工程化实践

简介:这份资源是面向多Agent系统建模初学者与研究者的Repast完整教程与实例合集,重点解决从环境搭建到模型落地的学习路径问题,适合社会科学、经济学及复杂系统仿真方向的师生与工程师使用。压缩包共72个文件,约303KB,…

2026/10/16 4:16:17 阅读更多 →
Strata分层张量调度:小显存跑大模型的系统级解法

Strata分层张量调度:小显存跑大模型的系统级解法

1. 项目概述:当大模型推理不再只盯着显存数字看“12GB显存跑1250亿参数?”——看到这个标题,我第一反应不是惊讶,而是笑了。不是笑它夸张,而是笑它终于戳破了行业里一个心照不宣的幻觉:显存大小从来就不是大…

2026/10/16 4:16:17 阅读更多 →
MATLAB一维数据二分类实战:从阈值分析到分类器选择

MATLAB一维数据二分类实战:从阈值分析到分类器选择

在信号处理、传感器数据分析和工业检测里,我们经常碰到这种场景:手上攒了一批采样点,每个点只有一个数值特征——可能是温度、电压、振动幅值或者光强,现在要根据这个数值把样本分成两个类别。比如判断电机当前是正常还是异常&…

2026/10/16 4:15:17 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →