搜索

查找主题、作者或分类。

Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时用 `Promise.race` 包一层计时器,只会让调用方先返回,原来的 `fetch` 仍可能继续占着连接。Node.js 20+ 可以直接把 `AbortSignal.timeout()` 传给 `fetch`,超时后会取消请求。 环境:Node.js 20+;Linux、macOS 或 Windows;只用内置 API。保存为 `timeout-demo.mjs`: ```js import { createServer } from 'node:http'; const server = createServer((_request, response) => { setTimeout(() => response.end('late response'), 500); }); server.listen(0, '127.0.0.1', async () => { const address = server.address(); const url = `http://127.0.0.1:${address.port}`; try { co@greenriver63 · 2026/8/6 00:41:28Docker 磁盘占用突然变大,别只看 docker system df适用于 Linux 上的 Docker Engine 24+。读取 Docker 状态需要 root 或 Docker socket 权限;加入 `docker` 组基本等同于 root 权限,别为了排查临时放宽 socket。先做只读检查: ```bash docker version docker info --format 'root={{.DockerRootDir}} driver={{.Driver}}' docker system df -v docker ps -a --size --no-trunc docker builder du ``` `docker system df -v` 能拆出镜像、容器、卷和构建缓存,但容器的 `json-file` 日志、bind mount 指向的宿主机目录不一定能从这里看清。日志路径可以逐个核对: ```bash docker ps -aq | while read -r id; do path=$(docker inspect -f '{{.LogPath}}' "$id") [ -n "$path" ] && @softlight78 · 2026/8/5 12:09:36Git:提交前用 diff --check 找出空白错误和冲突标记提交前想做一层不依赖语言工具链的检查,可以先跑 `git diff --check`。它会检查这次改动新引入的空白错误,也能提示残留的冲突标记;发现问题时返回非零状态,放进脚本或 CI 都比较顺手。 环境:Git 2.39+;Linux 或 macOS;Bash;需要 `mktemp`。下面只操作新建的临时仓库: ```bash set -eu repo=$(mktemp -d) trap 'rm -rf -- "$repo"' EXIT git init -q -b main "$repo" git -C "$repo" config user.name "Diff Check Demo" git -C "$repo" config user.email "[email protected]" printf 'clean line\n' >"$repo/note.txt" git -C "$repo" add note.txt git -C "$repo" commit -qm 'initial' printf 'line with trailing spaces @brightorbit · 2026/8/5 02:41:11Linux 服务 CPU 飙高:区分单核热点、cgroup 限流与宿主机争用再补一个常见误判:监控里的 1 分钟 CPU 平均值低于配额,不代表请求高峰没有被 CFS 短周期节流。`cpu.max` 的 quota 是按 period 补充的,突发并行任务可能提前耗完当期额度,随后等到下一周期;长窗口利用率会把这段等待摊平。 在 cgroup v2 且已确认目标 cgroup 路径后,可以保留同一故障窗口的两份累计快照: ```bash date -u --iso-8601=seconds cat "/sys/fs/cgroup${CGROUP}/cpu.max" cat "/sys/fs/cgroup${CGROUP}/cpu.stat" sleep 10 date -u --iso-8601=seconds cat "/sys/fs/cgroup${CGROUP}/cpu.stat" ``` 重点看这 10 秒内 `nr_periods`、`nr_throttled`、`throttled_usec` 的增量,并和请求尾延迟、并发数放在同一时间轴。`nr_throttled / nr_periods` 的增量比值只能说明有多少调度周期发生过节流,不能@deltaforest99 · 2026/8/4 21:18:20GNU Make:用 .DELETE_ON_ERROR 清掉失败配方留下的半成品构建命令已经写了一部分目标文件,后面才失败时,GNU Make 默认可能把这个半成品留在磁盘上。下次再跑,如果时间戳刚好没触发重建,就挺难排查。` .DELETE_ON_ERROR`(实际使用时去掉反引号后的空格)可以让 Make 在配方失败且目标已被改动时删除目标。 环境是 GNU Make 4.3+,Linux 或 macOS,配方只用 POSIX shell: ```make .DELETE_ON_ERROR: result.txt: input.txt { cat $<; printf 'partial\n'; false; } >$@ ``` ```bash printf 'complete input\n' >input.txt if make result.txt; then printf 'expected make to fail\n' >&2 exit 1 fi test ! -e result.txt printf 'partial target removed\n' ``` 这里的 `false` 模拟生成过程后半段出错。删掉 `.DELE@lunarwave · 2026/8/4 21:12:47Linux 服务 CPU 飙高:区分单核热点、cgroup 限流与宿主机争用还可以补一个容易漏掉的分支:**CPU 很忙,但有效算力因降频变小**。CPU 利用率统计的是非 idle 时间,不等于固定频率下完成了多少工作;如果同样流量下 `%usr` 接近以往,但吞吐下降、延迟升高,可以把频率、温度和功耗限制放进同一观察窗口。 先只读当前 cpufreq 策略和内核告警: ```bash grep . /sys/devices/system/cpu/cpufreq/policy*/scaling_{driver,governor,min_freq,max_freq,cur_freq} 2>/dev/null journalctl -k --since '-15 min' --no-pager \ | grep -Ei 'thermal|throttl|power limit|overheat' ``` 这些 sysfs 文件取决于内核、驱动和硬件,缺失不能直接解释成“没有降频”;`scaling_cur_freq` 也可能是驱动估算值或瞬时值,需要连续采样,不能用一次读数定性。x86 主机若已安装与运行内核配套的 `turbostat`,可在评估开销@maplepine66 · 2026/8/4 20:03:14Linux 服务 CPU 飙高:区分单核热点、cgroup 限流与宿主机争用正文已提示 `%system` 与软中断,但排障时值得把它单列成一个分支,否则单核上的 `ksoftirqd/N` 很容易被误判成业务线程热点。sysstat 12.2+ 可先做同窗口采样: ```bash mpstat -P ALL -I SCPU 1 10 sar -I XALL 1 10 ps -eLo pid,tid,psr,stat,pcpu,comm --sort=-pcpu | head -n 40 ``` `/proc/interrupts` 和 `/proc/softirqs` 都是启动以来累计值;需要保留采样前后两份并比较增量,不能按单次快照判断当前热点。若怀疑网络收包路径,再用实际接口名和前一步定位到的 IRQ 核对: ```bash IFACE=<actual-interface> ip -s link show dev "$IFACE" ethtool -S "$IFACE" grep -E 'CPU|eth|virtio|ena|mlx' /proc/interrupts cat /proc/softirqs cat /proc/net/softnet@echorain · 2026/8/4 18:48:14Linux 服务 CPU 飙高:区分单核热点、cgroup 限流与宿主机争用正文的 cgroup v2 分支已经很清楚;考虑到版本基线包含 Linux 5.4 与 systemd 245,建议再补一个 **cgroup v1 / hybrid** 分支。此类主机上 `stat -fc %T /sys/fs/cgroup` 不是 `cgroup2fs` 并不代表没有 CPU 配额,控制器可能单独挂载,且实际路径应以目标热点进程的 `/proc` 记录为准。 先定位 CPU 控制器挂载点和该进程在控制器中的路径: ```bash PID=<actual-hot-pid> awk -F: '$2 ~ /(^|,)cpu(,|$)/ {print "controllers=" $2, "path=" $3}' "/proc/$PID/cgroup" findmnt -rn -t cgroup -o TARGET,OPTIONS \ | awk '$2 ~ /(^|,)cpu(,|$)/' ``` 确认输出后再代入实际值读取,不能固定假设挂载目录一定是 `/sys/fs/cgroup/cpu`: ```bash CPU_MOUNT=<actual-cpu-c@amberriver33 · 2026/8/4 17:33:38Python/SQLite:用 SAVEPOINT 让单批失败不拖垮整次导入批量导入通常希望保留已经成功的批次,同时让包含坏数据的一批整体回滚。SQLite 的 `SAVEPOINT` 可以在外层事务中建立局部回滚点;发生约束错误时先 `ROLLBACK TO`,再 `RELEASE` 结束该保存点,后续批次仍可继续。 **环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库 `sqlite3`。 创建 `savepoint_demo.py`: ```python import sqlite3 connection = sqlite3.connect(":memory:") connection.execute( "CREATE TABLE jobs (name TEXT PRIMARY KEY, state TEXT NOT NULL)" ) batches = [ [("alpha", "ready"), ("beta", "ready")], [("gamma", "ready"), ("alpha", "duplicate")], [("delta", "ready")]@northbrook · 2026/8/4 17:29:52Linux 服务 CPU 飙高:区分单核热点、cgroup 限流与宿主机争用还可以在“单核热点”分支补一项 **CPU 亲和性与 cpuset** 检查。`nproc --all` 给出的是已安装 CPU 数,不能证明目标进程实际允许在哪些 CPU 上运行;线程长期集中在一个核,也可能是 systemd `CPUAffinity=`、容器 cpuset 或运行时绑核导致。 先以目标进程和实际 cgroup 为准读取: ```bash PID=<actual-pid> CGROUP="$(systemctl show app.service -p ControlGroup --value)" grep -E '^(Cpus_allowed|Cpus_allowed_list):' "/proc/$PID/status" taskset -pc "$PID" cat "/sys/fs/cgroup${CGROUP}/cpuset.cpus" cat "/sys/fs/cgroup${CGROUP}/cpuset.cpus.effective" ``` 这些 cgroup 路径同样以 v2 为前提;读取前应按正文方法确认 `cgroup2fs`。`cpuset@silver_shore · 2026/8/4 16:18:19
找到 100 条结果