交换内存
遇到系统卡顿, 电脑发热, 很大可能是系统疯狂读写swap内存
检查 Swap 与物理内存状态
# 查看 Swap 使用量 和 内存压缩/物理内存情况
sysctl vm.swapusage && top -l 1 | grep -E "^PhysMem|^VM"
输出示例解析: 重点关注swap和compressor
vm.swapusage: total = 18432.00M used = 16904.25M free = 1527.75M (encrypted)
PhysMem: 31G used (3493M wired, 14G compressor), 76M unused.
VM: 329T vsize, 5684M framework vsize, 33786912(0) swapins, 39293032(0) swapouts.
used = 16904.25M(Swap): 极度危险!说明物理内存已经彻底打满,有 16.9G 的数据被迫写到了硬盘上。76M unused: 物理内存几乎完全枯竭(32G 内存仅剩 76M)。14G compressor: macOS 的特色机制。在动用 Swap 前,系统会拼命压缩内存数据。当压缩占用高达 14G 时,说明系统已经在超负荷运算来维持不崩溃了。swapins / swapouts(几千万次): 系统在内存和硬盘间疯狂搬运数据(Thrashing),这是导致卡顿的直接元凶。
确认了系统处于高压状态后,需要找出是谁吃掉了内存。
按 RSS (常驻物理内存) 排序抓取前十
ps -amcwwwxo "user,pid,rss,vsz,command" -r | head -n 15
参数解释:-r 按 CPU 占用排序(在某些 macOS 版本中需结合 RSS 字段观察),但更直观的是提取出前十名直接看 RSS 列。
输出示例解析:
USER PID RSS VSZ COMMAND
wenliu 3689 4681920 417675024 mongod
wenliu 47121 3013056 1867840992 Google Chrome Helper (Renderer)
wenliu 649 235536 414167584 Terminal
wenliu 94155 216688 446452352 node
RSS(Resident Set Size): 进程实际占用的物理内存(单位:KB)。- 例如
mongod的 RSS 是4681920KB(约 4.6 GB),它就是当前最大的刺客。 Google Chrome Helper占用约 3 GB,通常是某个臃肿的网页或插件。
- 例如
VSZ(Virtual Memory Size): 虚拟内存。通常很大(有些进程申请 1.8G+),不需要过度恐慌,重点看 RSS。
典型嫌疑人与处理方案
在实际排查中的三种典型的压力源转移:
嫌疑人 A:Google Chrome (及各种 Electron 应用)
- 特征:产生大量
Helper (Renderer)进程。 - 处理:使用 Chrome 自带的任务管理器 (
Shift + Esc) 揪出具体标签页并关闭,或者直接彻底重启浏览器。
嫌疑人 B:数据库服务 (如 MongoDB)
- 特征:当你运行了重度查询(如量化历史回测)后,
mongod会将大量数据加载到内存中作为缓存,且不会轻易释放。 - 处理:如果是本地开发环境,最快的方法是直接重启服务释放内存:
brew services restart mongodb-community
嫌疑人 C:Node.js (本地 Agent/构建工具)
- 特征:
node进程带着--max-old-space-size=16384这样的参数。 - 处理:确认该进程(如
gemini助手或 Webpack 构建)是否正在工作。如果是正常工作,几百兆的占用是合理的;如果是僵尸进程,直接kill -9 <PID>。
4. 关键认知:Swap 的滞后性
系统被迫使用大量swap后, 即使解决了关键问题, 系统也未必能恢复:
- 即使杀掉大进程, 物理内存(RAM)被释放, 但 swap 会维持原状,直到需要访问里面的数据, 仍然会感到“冷启动”的卡顿
- 压缩本身会给CPU 的内存管理单元(MMU)造成很大压力, 系统会不停压缩解压缩, 影响响应
- 物理内存很难优化排布, 变得碎片化, 频繁触发整理
到这个时候就不得不重启电脑让内存重新恢复了 如何判断“不用重启”? 你可以通过一个指标来反驳“高 Swap 就重启”的说法:swapins / swapouts 的变化率。
运行 vm_stat 1(每秒刷新一次):
- 如果 Swap Used = 10GB,但 swapins 和 swapouts 都是 0,说明这些 Swap 是“静止的冷数据”,你不动它,它就不占性能。这时不需要重启。
- 如果 Swap Used = 10GB,且当你切换程序时,swapins 开始狂跳,说明系统正在疯狂从硬盘搬运数据,这时候重启才是解药。
声音
coreaudio
网络
诊断与连通性检查
ping -c 2 114.114.114.114 #物理联网
nslookup baidu.com 114.114.114.114 #DNS 穿透状态
nslookup baidu.com #本地代理劫持情况
输出示例解析:
Address: 110.242.xx.xx: 正常真实 IP。说明基础链路和 DNS 53 端口没问题。Address: 198.18.x.x(Fake IP): 说明流量正被代理软件(Clash/Surge)接管。connection timed out: 严重故障。说明运营商解析服务掉线或 53 端口被拦截。
典型故障与处理方案
故障 A:DNS 链路失效 (典型“微信通网页不通”)
- 特征:
ping通,但nslookup(不带服务器) 失败;或者解析出的 IP 无法访问。 - 处理:
- 多个软件抢dns导致混乱(tailscale, clash等):
scutil --dns(查看解析器顺序)- tailscale设置
tailscale up --accept-dns=false --accept-routes=false --exit-node=- 不去抢系统或代理软件的dns解析
- 不默认添加来自 Tailscale 网络中其他机器分享的“局域网段”: 如果你当前所在的酒店/咖啡厅 Wi-Fi 恰好也是 192.168.1.x 段,就会发生 “路由冲突”。你会发现连不上酒店打印机,甚至连不上网,因为Mac以为那是你家的网络,把包发到了隧道里
- 清空出口节点: 防止网络流量被tailscale截胡
- clash设置: 在 DNS 字段添加
nameserver-policy: {"*.ts.net": 100.100.100.100}- 修改clash的配置文件
- tailscale设置
- 多个软件抢dns导致混乱(tailscale, clash等):
故障 C:系统配置损坏 (Wi-Fi 开关异常/搜不到信号)
- 特征:UI 层面 Wi-Fi 无法开启,或者即便连接也无法获取 IP。
- 处理:由浅入深进行重置。
- 重置接口:在网络设置中删除 Wi-Fi 接口 -> 应用 -> 重新添加 -> 应用。
- 清理文件:删除
/Library/Preferences/SystemConfiguration/下的NetworkInterfaces.plist和preferences.plist后 重启。 - 底层重置 (NVRAM):关机后长按
Option+Command+P+R开机,听到 3 声响后松开。