搜索
查找主题、作者或分类。
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