凌晨 3 点,oncall 电话响了。“服务慢了,用户在刷不出页面。” 你 SSH 进一台从没见过的 Linux 服务器,没有 Prometheus dashboard,没有 APM 火焰图,只有黑漆漆的命令行。
第一分钟该敲什么?
Netflix 性能工程团队 2015 年给出的答案是:10 个命令,60 秒。本文把这套方法整理成一份可以照抄的清单,并补上一张"心智地图",让你不只是机械记忆命令,而是理解为什么要敲它们、应该看哪几列、看完之后该往哪走。
凌晨 3 点,oncall 电话响了。“服务慢了,用户在刷不出页面。” 你 SSH 进一台从没见过的 Linux 服务器,没有 Prometheus dashboard,没有 APM 火焰图,只有黑漆漆的命令行。
第一分钟该敲什么?
Netflix 性能工程团队 2015 年给出的答案是:10 个命令,60 秒。本文把这套方法整理成一份可以照抄的清单,并补上一张"心智地图",让你不只是机械记忆命令,而是理解为什么要敲它们、应该看哪几列、看完之后该往哪走。
你有没有遇到过这种场景:线上服务偶发延迟,top 看 CPU 正常、iostat 看磁盘不忙、strace 抓不到关键调用,但应用就是慢。想看某个系统调用真实的耗时分布?想找"一闪而过"的短进程?传统工具集体失灵。
问题的根源在于:Linux 内核对你"关着门"。你想观测的所有关键路径——系统调用、网络收发、调度、文件 I/O——都在内核里,而你已经很多年没编译过内核了。
eBPF(extended Berkeley Packet Filter)就是 Linux 给开发者开的一扇窗。它让你不重启内核、不写内核模块,就能在内核的关键路径上跑一段自定义逻辑。本文用三件事讲清它:eBPF 是什么、怎么工作、怎么先用起来。
你有没有遇到过这种情况:公司丢给你 10 万份内部事件报告,问你 “过去三年里,攻击模式呈现出哪些新趋势?” 你把这堆文档丢给传统 RAG 系统,它会按相似度捞出 Top-K 个最相关的文档块,让大模型基于这些片段作答。听起来很合理对吧?
问题来了:大模型拿到的只是 10 万份报告里"和’攻击趋势’长得最像"的几十个片段。它 根本没有通读过完整语料 ,怎么回答得出"新趋势"这种 全局性问题(Global Sensemaking) ?向量检索的本质是"局部相似",而全局总结是"通盘理解",这是两件本质不同的事。
类似的全局性问题还有很多:
GraphRAG(Graph-based RAG)就是为这类问题而生的。它把 RAG 的检索单元从"文本片段"升级为 “知识图谱” ,通过图社区摘要、Map-Reduce 等机制让 LLM 真正具备 全局感知能力 。
你有没有遇到过这种情况:服务器上有两份代码,版本 A 和版本 B,你只想把 A 的改动同步到 B,但网络带宽只有几 Mbps,传输一个 24MB 的文件要等上好几分钟。
也许你会想到先在本地 diff,然后把 patch 发过去。没错,这是个思路。但你有没有想过:如果 A 和 B 都不在同一台机器上,diff 根本跑不起来怎么办?
这就是 rsync 要解决的问题。
正则表达式看似简单,底层却藏着五花八门的实现思路。本文将带你了解递归引擎、BBVM 虚拟机、Pike VM、Thompson DFA 和导数引擎的工作原理,帮助你在实际项目中做出明智的技术选型。
搬家后,Self-Host 服务无法通过公网 IPv4 访问,只能用 IPv6 + DDNS 方案。但家里路由器不支持精细的 IPv6 访问管理,开着防火墙会影响服务,关闭防火墙又等于裸奔。
最终通过三招解决了问题:反向代理隔离、登录增强、FRP 流量转发。
最近搬家,家里的 Self-Host 服务由于限制无法通过公网 IPv4 访问,就改用 IPv6 + DDNS 的方式提供公网域名访问。
切换完成后,立即收到云服务器上 Uptime Kuma 的告警,显示无法连接 IPv6 地址。排查发现 Docker 容器默认不支持 IPv6。
Colima 轻量、开源、免费 —— 在 Mac 上运行容器的最佳选择
git worktree 命令支持管理同一个 git 仓库的多个工作区1,每个工作区可检出不同分支/提交。每个工作区都像一个“轻量级的独立仓库”,但它们共享底层对象库,减少磁盘占用并加速切换。
同一分支在同一时刻只能在一个 worktree 中被检出。如果想在多个 worktree 同时基于同一分支进行试验,需要使用不同分支名,或者使用--detach直接检出到某个提交。
注意,
--detach会产生分离式 HEAD,后续的修改会丢失,一般不推荐使用,除非是仅看用于查看代码。
最近完成了博客从 Hexo 到 Hugo 的迁移,这篇文章记录了迁移的完整历程,包括技术选型、具体实施步骤、遇到的问题以及解决方案。
本文主要介绍Calcite 中的AST转执行计划。关系代数最早由E. F. Codd在1970年的论文A Relational Model of Data for Large Shared Data Banks中提出, 是关系型数据库查询语言的基础, 也是查询优化技术的理论基础。 在Calcite内部, 会将SQL查询转化为一颗等价的关系算子树, 并在此基础上进行查询优化. 通用的关系代数理论可以参考之前的文章形式化关系查询语言, 接下来介绍在Calciate中的实现。
本文主要介绍Calcite 中的SQL Validator。Calcite 通过 SQL 校验器实现 SQL 绑定,SQL 校验器所需的 Catalog 信息,在深入理解 Apache Calcite Catalog 中已经做了详细的介绍。
SQL 绑定主要的作用是将 SQL 解析生成的 AST 和数据库的元数据进行绑定,从而生成具有语义的 AST。SQL 绑定会通过自底向上的方式遍历 AST,对抽象语法树中的节点进行绑定分析,绑定的过程中会将表、列等元数据附在语法树上,最后生成具有语义的语法树 Bounded AST。
Calcite 中的SQL Parser 使用JavaCC 实现。JavaCC 在前面的博客中有过介绍, 本文就不赘述了。本文主要介绍Parser。
JavaCC的词法解析被转化为一组词法状态,每个状态都有一个唯一的标识符用于命名。Token Manager(生成的代码)在运行时总是处于状态之一,默认的一个词法状态是DEFAULT。当Token Manager初始化时,默认情况下是以DEFAULT状态开始。也可以在Token Manager 构造时,指定起始词法状态1。
上一篇文章我们简单介绍了 JavaCC的语法和使用。本文将以实现一个计算器为例,介绍JavaCC 在实际代码中的使用。
JavaCC 是 java 生态中常用的Parser Generator。特征如下:
JavaCC的工作流程如下:

假设我有两个 github 账号,victor(for personal) 和 superman(for work)。如果我想在同一台电脑上使用这两个账号进行 git push/pull。该如何配置?
当你把一个 Spark 应用交给数据平台服务化时,很快会遇到三个现实问题:客户端机器不一定能直连集群;spark-submit 不适合由 Web 后端反复执行;多个用户的长任务、权限、日志和资源也不能只靠脚本管理。Apache Livy 要解决的就是这一层问题:它把 Spark 集群包装成可远程访问、可管理、可多租户使用的 REST 服务。
这篇文章面向已经了解 Spark Driver、Executor 和 Cluster Manager 的读者。读完你可以理解 Livy Server 的职责边界、Interactive Session 与 Batch Session 的差异、RSC 的连接建立过程、Executor 资源如何分配和扩缩容、Session 状态恢复机制,以及 Livy 与 Spark Connect 的适用边界。
如何在 Rust 的多线程中共享值?
ArcMutex