一个塞满的缓冲区,看起来和一条慢链路一模一样——这就是全部问题
所有人都默认网络缓冲区越大越安全。跑一下这个仿真:把缓冲区调大,它会把一条快链路变成一条「感觉上很慢」的链路,而吞吐数字一点都没变。
Linux 工具箱:namespace、网络、systemd,以及配得上被记住的命令。
94 篇文章
所有人都默认网络缓冲区越大越安全。跑一下这个仿真:把缓冲区调大,它会把一条快链路变成一条「感觉上很慢」的链路,而吞吐数字一点都没变。
Homelab 功耗不能靠猜:本文在 i7-8550U 上用 RAPL 实测空闲功耗与满载功耗,对比 CPU 调频策略 performance/powersave 的真实差距(结论有点反直觉),并给出一份先测量、再压最大功耗项的省电清单,把省电服务器从玄学变成算术。
gdb 实战指南:backtrace、core dump、条件断点、watchpoint、多线程调试,以及 -O0 与 -O2 的故事——全部来自真实程序的真实输出。
一次 Linux 上的 valgrind 实操:用真实的 memcheck 报告逐一看 C 语言内存泄漏、非法读写、未初始化值,再用 massif 看堆增长、callgrind 看指令热点、helgrind 看数据竞争——每条都配真实输出和修法。
一篇动手实践向的 inotify 指南:真实的 inotifywait 与 inotifywatch 输出、用 Python ctypes 读事件队列,并真实复现一次事件队列溢出。
iproute2 的 `ip rule` 策略路由让内核按源地址、fwmark 或接口来选择路由表,而不只看目的地址。用真实的 `ip route get` 输出,演示双出口、按源路由、VPN 分流隧道和 IPv6。
在一台 Docker 29 主机上实测:cgroup v2 的 io 控制器如何按容器限制磁盘吞吐量,--device-write-bps 到底写了什么,io.max 与 io.weight 的区别,以及为什么用 dd 测出来的数字是假的。
Linux swap 到底是什么(以及为什么它不是内存)、vm.swappiness 真正控制的是什么、如何用 vmstat 的 si/so、pswpin/pswpout 和 /proc/pressure 观察内存压力,以及什么时候 zram 比磁盘 swapfile 更好——全部真实输出,另加一次 Docker cgroup 限制下 400 MiB 分配实验。
tmux 会话、窗口与面板的实用指南:终端复用器如何在 SSH 断线后保持你的工作现场,如何脚本化生成可复现的布局,以及 send-keys 和 capture-pane 如何实现真正的自动化。
Restart=on-failure 只能处理真正退出的进程,挂死的进程系统完全无感知。本文用真实的 systemd journal 输出演示如何用 WatchdogSec 加 sd_notify 心跳捕获卡死的服务,并覆盖 StartLimitBurst 崩溃循环保护与 Type=notify 就绪语义。
Linux 信号是异步通知,而不是消息队列。了解 SIGTERM 与 SIGKILL 的区别、信号处理器如何实现优雅关闭、sigprocmask 如何延迟信号投递,以及 PID 1 容器陷阱——你的应用必须自己处理 SIGTERM。
为什么 500 Mbit/s 的链路只跑出 14 Mbit/s:接收窗口、TCP 窗口缩放、带宽延迟积,以及套接字缓冲区与自动调优如何决定真实上限——全部用真实的 iperf3、tcpdump、netem 与 ss -ti 输出说话。
文件读取到底发生在哪里?我用 /proc/meminfo 实测 Linux 页缓存,展示冷读与热读 25 倍差距,用 strace 统计 read() 与 mmap() 的系统调用,并演示 msync、fadvise,以及为什么 drop_caches 是错的办法。
io_uring 用用户态与内核共享的提交/完成环,取代每次 I/O 一次系统调用。基于 Linux 7.2 与 fio ioengine 的真实对比:队列深度带来什么、不改变什么,以及 SQPOLL 与注册缓冲区何时才值得用。
正向仿真玻璃珠 3D 图片背后的光学:用逐像素 GPU 着色器对玻璃珠阵列做光线追迹,薄透镜偏折与斯涅尔定律折射的对比,摩尔纹放大与视差为何出现,Qt 加 moderngl 的上下文陷阱,以及把 3D 模型打印到珠子背后的逆向设计。
递归 CTE 通过基础用例和自引用递归项来遍历层级数据。学习 WITH RECURSIVE、depth/path 累加器、CYCLE 防环、SEARCH 排序、执行计划分析,以及何时该用物化路径或 ltree 替代。
一份实战 Linux capabilities 指南,附真实 Docker 演示:为什么 root 权限过大、约 40 个 capability 如何拆分它、五个集合、capsh、/proc/self/status、getcap/setcap、bounding set、CAP_SYS_ADMIN 问题,以及 drop-all-add-back 实用配方。
为什么「我的磁盘很慢」通常是错误的问题。真实 fio 基准测试展示 IOPS vs 吞吐量 vs 延迟、队列深度效应、fsync 的真实代价,以及 tmpfs vs LUKS 加密 NVMe SSD 如何改变一切。
无需 DHCP,主机如何自动获得 IPv6 地址——RS/RA 交换、前缀信息、A/M/O 标志、EUI-64 与稳定隐私地址、真实 radvd 输出。
一次在真实 8 核机器上的 Linux CPU 调度实战:CFS 如何按权重切分一个核心,为何 nice/renice 只在高负载下才起作用,CPU 亲和性与 taskset 何时有用何时帮倒忙,SCHED_FIFO 的危险,docker --cpus 如何经 cpu.max 限流,以及如何用 mpstat -P ALL 与 pidstat 定位被打满的核心。
在一次性容器中用真实输出讲解 Postgres 触发器:BEFORE/AFTER 行级触发器、FOR EACH STATEMENT、NEW/OLD、WHEN 条件、视图上的 INSTEAD OF、RAISE EXCEPTION、触发器顺序、可见性陷阱和逐行性能陷阱。
在一台真实的 Arch 主机上实操 journalctl:按 unit、优先级、时间过滤,实时跟踪日志,读取 _SYSTEMD_UNIT、_PID 等日志字段,写入自定义字段,用 -o json 做脚本化统计,以及用 --disk-usage 和 vacuum 管理 journald 日志保留。
什么是内存过量提交、vm.overcommit_memory 的三种模式、Committed_AS 与 CommitLimit 的关系、OOM 杀手如何用 oom_score 挑选牺牲者、cgroup 限制与全局杀手谁先动手、swap 的作用,以及如何读懂案发现场——全部来自一次性容器的真实输出。
把 systemd socket 激活讲透:由 systemd 持有监听 socket(ListenStream),在第一个连接到来时才启动服务,并通过 sd_listen_fds 把 fd 传给它。全部是 systemctl --user 的真实输出,含 .socket/.service 配对、systemd-socket-activate 演示,以及诚实的取舍。
半开连接可能滞留数小时。通过真实实验和计时数据,了解 TCP keepalive(SO_KEEPALIVE、TCP_KEEPIDLE)和应用层心跳如何检测死对端。
Postgres 内置了一个轻量级发布/订阅机制 LISTEN/NOTIFY。它快速、无需额外服务,而且已经在你的数据库里运行。本文介绍如何使用它、它的真实边界,以及何时该换用真正的消息队列。
文件描述符是什么,为什么文件、套接字和管道共享同一个上限,如何用 ulimit -n 和 /proc/<pid>/limits 查看软限制与硬限制,EMFILE 的含义,以及修复「打开文件过多」的清单:先提高上限,再找到泄漏。
用 tc netem 和 tbf 在 Linux 上模拟广域网延迟、丢包和限速。所有数据来自一次性 Docker 容器的真实测量:ping RTT、限速前后吞吐量、tc -s 计数器。
窗口函数在不折叠行的情况下跨相关行计算值。学习 ROW_NUMBER、RANK、LAG、累计求和、frames 以及 top-N-per-group 模式,附真实查询输出。
一次带着真实 race detector 输出看的 Go 并发 bug 巡礼:用 go run -race 和 go test -race 复现 data race,一个让运行时崩溃的 deadlock,一个 goroutine 泄漏——外加能干净通过 -race 的 sync.Mutex、channel 所有权与 context 取消修复。
在一台真实的 Arch Linux 笔记本上完整走一遍 Linux 启动过程:UEFI 固件与 ESP、GRUB、内核与 initramfs、作为 PID 1 的 systemd、sysinit → basic → multi-user → graphical 的 target 链、用 systemd-analyze 看启动耗时,以及一份排查慢启动与启动失败的实战手册。
我如何不靠猜找出 Python 内存泄漏:先搭一个能复现的 harness,用 /proc 读 RSS,用 tracemalloc 快照 diff 点名那个在增长的分配,再用 gc.get_referrers 找出谁还持有它,最后用同一套数字证明修复有效。全部数字来自 Python 3.14.7 的真实运行。
一份实战指南:Postgres JSONB 运算符、GIN 索引(jsonb_ops vs jsonb_path_ops)、包含查询,以及何时该用文档列、何时不该用。
一篇上手即用的 bash 严格模式指南:set -euo pipefail 究竟各做了什么、set -e 会在哪些场景下悄悄失效、单词拆分与 IFS 如何弄坏脚本、如何用 trap EXIT 和 mktemp 做清场、怎么读 PIPESTATUS,以及为什么 shellcheck 才是真正的安全网。每个坑都配一个真实失败脚本和它的输出。
我真正会用到的 systemd unit file 指令:ExecStart、EnvironmentFile、User、After 与 WantedBy 的区别、Restart=on-failure 与启动次数上限、Type=simple/exec/oneshot 的差别、journal 日志、定时器,以及用 systemctl edit 写 drop-in、用 systemd-analyze verify 抓出一个真实报错并当场修好。
一份带真实输出的 awk 教程与 sed 教程:字段选择、求和与平均值、BEGIN/END、分组计数、sed replace、捕获组、行范围、带备份的原地替换,以及何时该停手改用 jq 或 Python。
一份实用的 find 命令与 ripgrep 指南,把 ripgrep 当作 grep replacement 来用:按名字、类型、大小、mtime、属主与权限搜索文件;为什么 -print0 和 xargs -0 非用不可;ripgrep 的智能过滤、ignore 文件与二进制识别如何工作;fd 作为更好用的 find;以及查大文件、查最近改动、列出唯一匹配等真实 recipe。
一份带真实终端输出的 Linux 权限实战指南:文件和目录上的 rwx 分别是什么意思、umask 如何决定默认权限、setuid/setgid/sticky bit 的真实演示、用 setfacl 配 ACL 与默认 ACL、那些经典错误,以及一份安全检查清单。
在一张 200 万行的表上实操 Postgres 的五种索引:B-tree、GIN、GiST、BRIN 与 hash 各自适合什么、什么时候选它们是错的、真实的 EXPLAIN (ANALYZE, BUFFERS) 计划、真实的索引体积,以及 CREATE INDEX CONCURRENTLY、INCLUDE、部分索引与表达式索引怎么用。
在一台真实的 Docker 主机上动手拆解 cgroups v2:什么是 cgroup、v2 为什么要把控制器统一、v2 的文件系统布局与「内部不能有进程」规则、--memory 与 --cpus 如何映射到 memory.max 和 cpu.max、CPU throttling、内存记账、OOM kill、memory.high 与 memory.max 的区别,以及如何用 PSI 压力信号排查被杀或变慢的容器。
用 Docker 亲手搭一套 Postgres 17 + PgBouncer 1.26 复现 Postgres 连接池:为什么每个连接都是一个进程、为什么调大 max_connections 只是把天花板挪高、session 与 transaction 池模式到底差在哪,以及 transaction mode 在会话状态、临时表、prepared statements 上具体怎么翻车——全部是真机输出。
在同一份语料上亲手对比 Postgres 全文检索与 Elasticsearch:tsvector、tsquery、ts_rank、GIN 索引、用 pg_trgm 做模糊/错别字搜索,真实的 EXPLAIN 计划与 ES 响应,Postgres 做不到的事,以及何时才值得上一个搜索集群的决策规则。
用真实输出讲清 Postgres vacuum:我在一次性 Postgres 17 里制造出真实的表膨胀,调了 autovacuum 阈值,看着 VACUUM 把 dead tuples 标记为可复用、VACUUM FULL 把文件真正缩小,并用 pg_stat_user_tables 和 pgstattuple 检查了 wraparound 与 bloat。
用一个用完即弃的 Postgres 16 容器,把一张 300 万行的表与它的声明式分区孪生表并排跑:真实的 EXPLAIN 计划展示分区裁剪、每个分区一份索引的现实、手动按月建分区、ATTACH 与 DETACH,以及为什么用丢弃分区做保留策略远胜 DELETE。
负载测试只回答三个问题:你的容量有多大、在哪里崩、最近这次改动有没有用。本文用一个容器里的临时服务跑 hey 压测,教你不看均值而看延迟分位数,找出吞吐量停滞、p99 起飞的拐点,并把客户端数字和服务端 CPU 对上。全程只打自己的机器,绝不碰第三方主机。
一次完整的 restic 备份恢复演练,附真实输出:init、加密去重备份、restic forget 保留策略与 prune、check --read-data、删库重恢复、内容哈希与 diff 校验、定时器加 dead man's switch,以及 3-2-1 backup 的反模式。
两者都很优秀,所以真正的差异落在默认值、类型和 SQL 方言上。这篇用一次性的 MySQL 8.4 与 PostgreSQL 17 容器跑出的真实输出,讲清隔离级别、NULL 与布尔类型的差异、标识符大小写、ON CONFLICT vs ON DUPLICATE KEY、RETURNING、jsonb、数组与范围类型,并给出一份决策清单。
从零复现 Postgres 复制:用 pg_basebackup 和 primary_conninfo 搭建物理 standby,读懂 pg_stat_replication 与 pg_stat_wal_receiver,测量真实的复制延迟,理解同步与异步的取舍,以及为什么 failover 依然要靠手动。
几分钟搭起一个容器 DNS 服务器:一份最小的 CoreDNS Corefile,从 zone 文件提供自定义权威区域,未知域名转发上游,再用 dig @127.0.0.1 -p 15353 逐条戳它——包含真实的 NXDOMAIN、SERVFAIL、CNAME 链和 TTL 输出。
用一张 150 万行的表跑出的真实计划,讲清 EXPLAIN、EXPLAIN ANALYZE 与 BUFFERS 的区别:如何自下而上读 Postgres 查询计划、估算行数与实际行数为何对不上(统计过期)、顺序扫描与索引扫描、嵌套循环与哈希连接、仅索引扫描,以及一套可复用的方法:先找到慢查询,再盯住行数×代价最大的那个节点。
在一次性 Postgres 17 容器里亲手复现 Postgres 锁与死锁:UPDATE 和 SELECT ... FOR UPDATE 到底锁了什么,如何用 pg_locks 连 pg_stat_activity 找到阻塞者,一个慢查询卡死所有人的锁队列,以及用锁顺序、SKIP LOCKED 和 lock_timeout 避免死锁。
一套可落地的 git archaeology 方法:用 git log -S(pickaxe)和 -G 找出某个字符串何时被改,用 git log -L 追踪单个函数的演变,正视 git blame 的局限(-w、-C),用 --follow 跨重命名,用 git bisect run 揪出引入回归的那一次提交——最后去读「为什么」,而不只是「改了什么」。
一份实用的 regex 教程,帮你把正则真正想通:它只是一个小小的模式匹配器而非一门语言,以及各种原子、捕获组、贪婪与懒惰量词、交替与优先级、真实模式里的词边界、灾难性回溯为什么会发生,还有怎样拿真实输入去测试 regex examples。
一组实用的 openssl 命令:用 x509 检查证书、验证证书链,再用 openssl s_client 探测线上 TLS 服务器。附 req、verify、pkcs12 的真实输出,以及 PEM/DER/PKCS#12 互转和最常见的那几个坑——叶证书与链、密钥与证书。
上手 sqlite3 CLI:打开数据库、掌握 dot 命令、导入导出 CSV、用 -line/-json/-csv 跑一次性 sqlite 命令、用 .read 写脚本、用 .backup(而不是 cp)做安全的 sqlite 备份、用 sqlite pragma 设置 WAL 与外键、读懂 EXPLAIN QUERY PLAN,并 ATTACH 多个数据库。
一份实用的 curl 教程,讲清我日常真正在用的 curl flags:用 -v/-i/-D 读请求与响应,用 curl -w timing 里的 %{time_total} 拆分耗时,-L 与 --max-redirs,--fail 与 exit codes,-d/--json/-F 发请求体,-H/-A/-e 设置请求头,-u/--netrc 做认证,HTTP/2 与 HTTP/3,用 --resolve 做本地测试,以及调 HTTP 请求时为什么 -v 远比瞎猜管用。
一份面向实际工作的 jq 教程:美化与紧凑输出、选取与 select、map 与 to_entries、// 默认值、slurp、--arg、-e 退出码、group_by、排序、unique 以及 --stream。文中每个 jq 命令都附带可直接复制的真实输出。
一篇务实的 BGP homelab 指南:BGP 这个协议到底在做什么,什么时候 multi-homing、ISP 故障切换,或者你自己的 IPv6 PI space 才值得上它,BIRD 与 FRR 的现实选项,你必须先搞懂的概念(AS、prefix、local-pref、路由过滤),一份最小的可用配置,以及一个坦诚的建议。
TCP 拥塞控制,就是内核在几乎不了解路径的情况下自己决定发送速率。slow start、congestion avoidance、fast recovery 三个阶段,为什么 CUBIC 是 Linux 默认,BBR 如何建立带宽延迟积模型,怎么读 `ss -ti`,用 sysctl 切到 BBR,以及 bufferbloat。
一份用 strace 做系统调用调试的实战指南:它何时胜过调试器或日志、如何安全地附加到进程、怎么读 open/read/connect/futex 输出与 errno、值得背下来的过滤器(-e trace、-f、-p、-y、-T、-tt)、三个真实排查过程,以及 ltrace 和 bpftrace 各自的位置。
一份 nftables 实战指南:从 tables/chains/rules 心智模型讲起,给出服务器可直接复制的默认拒绝规则集,用集合与命名区间管理 IP 列表,讲清 masquerade 与端口转发 NAT、持久化,以及如何读懂 nft list ruleset,并附上不把自己锁在 SSH 门外的回滚办法。
一篇把 IPv6 家庭网络跑通的实操指南:先确认运营商真的做了前缀委派,再让路由器用 SLAAC 通告一个 /64,把 IPv6 防火墙收紧成默认拒绝入站,配好 AAAA 记录,并排查一条残缺 IPv6 路径造成的卡顿。
一旦有人入职或要更换密钥,authorized_keys 的散乱就崩了。SSH 证书能治好它:一个 SSH CA 用 principals 和有效期来签用户证书,主机证书干掉 TOFU 提示,短时效凭证则让吊销列表变得多余。附可复制的 ssh-keygen -s 与 sshd 配置。
如何在不弄坏服务的前提下给 systemd 单元做沙箱:真正重要的那些旋钮(NoNewPrivileges、ProtectSystem=strict、PrivateTmp、SystemCallFilter、CapabilityBoundingSet、dynamic user)、用 systemd-analyze security 量化、用 LoadCredential 管密钥的增量工作流,以及单元被弄坏后如何测试与回滚。
运行 NixOS 一个月后的实地报告:把整台系统声明在一个文件里的吸引力、configuration.nix 到底长什么样、Nix 语言与 Nix flakes 的真实学习曲线、它在服务器与 CI 上的用武之地、它哪里硌人,以及一个诚实的使用建议。
一套可复用的方法,帮你读懂一个不是你写的代码库:由外而内起步,端到端追踪一条真实请求,用调试器和日志代替通读,找到模块之间的接缝,并克制地使用 git log。真正的核心其实在于决定哪些代码不要读。
一篇务实且诚实的静态加密(encryption at rest)指南:先厘清真正的威胁模型(笔记本失窃、报废硬盘、云厂商访问),再看 LUKS 全盘加密到底覆盖什么、不覆盖什么,为什么口令才是薄弱点,TPM/clevis 与 crypttab 的解锁体验,以及在 VPS 上做 LUKS、加密 ZFS 数据集和加密备份的具体做法。
CPU 空闲却负载很高,问题通常出在磁盘。本文讲清怎么读 iostat -x 里的平均 await、%util 与队列深度,如何区分吞吐问题与延迟问题,用 iotop 和 /proc/<pid>/io 抓出真凶进程,并处理 fsync 密集、WAL、swap 抖动与日志刷屏。
时区、UTC,以及两者之间那些 bug:为什么要以 UTC 存储、只在边界处转换,instant、本地日期时间与 duration 的区别,墙上时钟为什么不是单调的,DST bug 里的空档与歧义,tz 数据库,跨 DST 的 cron,以及 Python/JS 的陷阱——附一份清单。
慢速构建几乎从来不是编译器的锅。这是一份清单:先测量冷构建与热构建,再找出真正的元凶——反复重装依赖、没有构建缓存、镜像过大、单线程运行——最后用缓存、增量构建与更短的关键路径把它们修掉。
把本地、远程与动态 SSH 端口转发讲具体,加上用 ProxyJump 穿跳板、autossh 与一份 systemd 单元保活,并诚实说清 ssh 隧道在哪一刻不够用、该改用 WireGuard 或 mesh 覆盖网络。
一份务实的数据库索引指南:索引到底是什么、要付出什么代价(写入与磁盘);为什么「加个索引」往往是错的、要先看查询;复合索引的列顺序与最左前缀;覆盖索引;查询计划器什么时候无视你的索引(类型不匹配、列上套函数、选择性太低、统计过期);怎么读懂 EXPLAIN ANALYZE,以及一套方法:先找到真正慢的那条查询。
一份不讲理论的 ZFS 入门:真正要懂的四个概念(pool、dataset、snapshot、scrub),你实际会敲的那几条命令,为什么 ZFS snapshots 不是备份、以及 zfs send receive 如何补上这一课,小机器上 ZFS ARC 的诚实答案,ECC 的迷思,还有出事后怎么恢复。
为什么直接拷一个正在运行的 Postgres 数据目录会出事,以及 pg_dump、卷快照、WAL 归档这三套方案分别该在什么时候用。包含具体命令、用 pg_restore 与 pg_ctl 做的恢复演练、常见的坑,以及给小规模自托管数据库的建议。
为什么 print 和非结构化日志会在凌晨三点坑你、结构化日志与 JSON logs 到底是什么、各级别该记什么、什么永远不能记、如何传递 correlation id、journald 的真实处境(含 journalctl -o json)、采样与成本,以及 Python/Go/Node 的对比。
Linux 负载平均值统计的是可运行任务与不可中断任务,而非 CPU 使用率。本文讲清 1/5/15 分钟三个数字真正在度量什么、为什么 iowait 与 D 状态进程会把它抬高、为什么要按核数归一化、容器 CPU 配额如何打破旧规则,以及该改用 vmstat、mpstat、PSI、iostat 看什么。
一份务实的 btrfs vs ZFS 对比,写给 homelab。讲清两者的共同点(校验和、filesystem snapshots、send receive、类 RAID 冗余),差异在哪(btrfs 在内核里、按文件更灵活;ZFS 集成的卷管理与成熟的 RAIDZ),内存与 ARC、许可证和恢复工具链上的取舍,并用一张决策表和分场景的推荐收尾。
写一份 ssh config 是我在命令行上做过的性价比最高的一次效率升级。接着是 ssh 隧道:本地、远程与动态端口转发,用 ProxyJump 穿过跳板机,以及 ed25519 密钥和 ssh-agent。附可直接复制的配置与命令,还有那些同时改善日常体验的加固项。
简洁地走一遍在地址栏敲下 URL 后的完整链路:浏览器缓存、经存根与递归解析器到权威服务器的 DNS 解析、TCP 握手与慢启动、TLS 1.3 握手、反向代理这一跳、缓存头、浏览器渲染,以及 HTTP/2 与 HTTP/3 的连接复用。
一份务实的主张:为什么对于博客、CLI 和内部工具,SQLite in production 常常是够用的;SQLite 到底是什么(embedded database、库、文件);它的「单写者」并发模型与 WAL mode;busy_timeout、用 backup API 做在线备份、迁移;以及 SQLite vs Postgres 到底什么时候才成为一个真问题,而不是条件反射。
关于在单台服务器上用 Ansible 的诚实回答:配置管理到底带来什么(可复现的记录、幂等重跑、灾难恢复),又付出什么代价(学习曲线、YAML 膨胀、过度抽象),一个最小可读的 playbook 示例,以及什么时候一份 shell 脚本或 Nix/容器镜像是更好的答案。
Git Flow 和重 PR 的流程是为了协调团队而存在的。如果你就是唯一的提交者,它们全是纯开销。这是我实际在用的 git workflow:以 main 为主干、短生命周期分支甚至直接提交、用 tag 发布、严格的提交习惯、几个 pre-commit 钩子,以及用 bisect 和 reflog 做安全网。
一篇讲清怎么读第一次 packet capture:什么时候抓包比翻日志更管用,如何用 tcpdump(-i、BPF 过滤器、-w 存文件、snaplen)正确地抓,三次握手、重传、RST 与读不了的 TLS 字节在 Wireshark 里长什么样,以及一个“这条连接为什么慢”的实战排查例子。
价格页之外,一台小型自托管服务器真正该看的 VPS 配置:内存优先于 CPU、磁盘 IO、网络上限、IPv4/IPv6、快照、延迟;哪些营销数字会说谎;便宜与高价的真实取舍;KVM 与 OpenVZ;端口 25 与滥用政策;以及一份决策清单。
你可以在普通硬件上运行本地 LLM,但真正的瓶颈是内存带宽和 VRAM,而不是参数量。本文讲清量化、llama.cpp / Ollama / MLX / vLLM 各自该在什么时候选、一条显存估算的经验法则、哪些场景适合本地、哪些不适合,以及和 API 相比一笔诚实的成本账。
经典 traceroute 更像一幅美化的漫画:ICMP 限速、按流负载均衡、被藏起来的 MPLS 标签、非对称路由与 NAT 都会把它掰弯。本文讲清如何用 tcptraceroute、mtr 和固定流 ID 得到可信信号,如何区分排队与距离,并给出一例「看着坏了、其实只是被限速」的 traceroute。
为什么发信是自托管里最难的一件事——信誉、IP 预热、黑名单——而收信相比之下简单得多。技术上的必备项(PTR、SPF、DKIM、DMARC、MTA-STS),运维上的真实情况(25 端口被封、退信、备用 MX),一套务实的 Postfix + Dovecot 方案,以及那个直白的结论:收信自己来,发信走中继。
几台机器根本不需要 Prometheus 加 Grafana 才知道自己是不是健康。这篇写小规模服务器监控真正会坏的东西、最小工具集(node_exporter 用不用、systemd 检查脚本、死人开关)、journald 保留策略,以及什么时候这套大栈才真的值。
一篇从数据包层面拆解 DNS 解析的文章:存根解析器、递归解析器、根服务器与顶级域服务器、权威应答,缓存与 TTL,日常真正用得上的记录类型(A/AAAA/CNAME/TXT/MX/NS/SOA/CAA),CNAME 的规则,glue 记录以及为什么裸域不能用 CNAME(ALIAS/ANAME),权威角色与递归角色的区别,以及如何用 dig +trace、kdig、DoH 和 DoT 来排障。
一篇讲清 MTU 为什么会在大包上出故障:1500 字节的世界如何被 VPN、overlay、隧道吃掉,分片与 DF 位,MSS clamping 一条能用的 nftables 规则,路径 MTU 发现为何被过滤的 ICMP 毁掉,TLS 握完却卡死的经典症状,以及用 ping -M do、tracepath、tcpdump 的实战排查流程。
一份务实的 3-2-1 backup 策略,写给只有一个人的 homelab:为什么唯一重要的指标是恢复成功而不是备份成功;该备份什么(数据、配置、密钥);为什么拷贝正在运行的数据库是个陷阱;rsync、restic、borg 之间怎么选;如何用脚本加定时器搭一个「运行并校验」的循环;以及如何在你需要之前真正跑一次 test restore。
一篇写给一直躲着 IPv6 的人的实战教程:地址计算其实比看上去简单(前缀、/64、SLAAC、没有 NAT),运维上真正变了什么(nftables、ip -6、AAAA 记录、监听 [::]),为什么双栈才是务实的路线,那些会咬人的坑(链路本地地址、MTU、ICMPv6 依赖),以及如何在一台机器上把它测通。
用 ip netns、veth 对、网桥和 NAT,在一台 Linux 机器里搭出一个小型多主机网络,让命名空间之间能互相 ping、能走网桥交换、还能经 NAT 上公网。这是一篇动手实战指南:不用额外硬件就能测试路由、overlay 配置和防火墙规则,并用 ping、ip route 和 tcpdump 逐项验证。
一篇务实的 systemd 定时器与 cron 对比:同一个任务分别写成 crontab 一行和 .service + .timer 一对,涵盖 journalctl 日志、Persistent=true 补跑、OnCalendar 语法、RandomizedDelaySec、资源限制、环境变量处理,以及 systemd-analyze calendar 技巧——最后诚实聊聊什么时候 cron 依然是对的。