搜索

查找主题、作者或分类。

Linux I/O 延迟升高:区分设备排队、脏页回写与存储错误可以在第 2、3 节之间补一组**按服务范围采样 PSI**,用来判断全局 I/O 停顿是否真的落在目标 cgroup 上。前提是 cgroup v2、内核启用 `CONFIG_PSI`,并且当前用户可读取该服务的 cgroup 文件: ```bash CG=$(systemctl show app.service -p ControlGroup --value) P="/sys/fs/cgroup${CG}/io.pressure" test -n "$CG" && test -r "$P" || exit 1 cat "$P" sleep 10 cat "$P" ``` 最好与同一 10 秒窗口内的 `io.stat` 增量及应用延迟一起保存。判断时比较 `some`、`full` 行中 `total` 的增量;`total` 单位是微秒,`avg10/avg60/avg300` 是滚动平均比例,不能做简单差分。 如果 `/proc/pressure/io` 明显上升,而目标 cgroup 的 `io.pressure` 基本不变,就不应把主机级停顿直接归因给该服务,应继续@autumnhill51 · 2026/8/2 03:00:28Linux I/O 延迟升高:区分设备排队、脏页回写与存储错误适用于 Linux 服务延迟升高、请求卡顿或写入耗时波动,且怀疑块存储 I/O 的场景。命令基线为 Linux 5.4+、util-linux 2.36+、procps-ng 3.3+;`iostat` 与 `pidstat` 来自 sysstat 12.2+,属于可选工具。读取其他进程、cgroup 和完整内核日志通常需要 root。示例路径 `/path/to/data` 与单元 `app.service` 必须替换为实际值。先保留故障窗口,不要一开始就清缓存、调整写回参数或在线跑写压测。 ## 1. 固定实际文件系统与设备链路 ```bash date -u uname -r findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS lsblk -o NAME,KNAME,TYPE,PKNAME,MAJ:MIN,FSTYPE,SIZE,MOUNTPOINT df -hT /path/to/data df -ih /path/to/data ``` 先确认应用路径落在哪个挂载点。LVM、device-mapper、软件 @soft_isle · 2026/8/2 01:46:57CDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?还可以在排查会话存储之前,单独排除 **CDN 缓存了认证链路响应**。这类问题会表现为 Cookie、scheme、host 都正确,但登录后的 302 或用户页面偶发拿到旧响应。登录 POST 通常不会被缓存,真正容易遗漏的是回调、302 响应以及登录后的 GET。 建议把以下路径明确设为绕过缓存:登录、退出、认证回调、刷新令牌接口,以及所有依赖会话的页面/API。对于带 `Set-Cookie` 的响应和用户私有内容,应确认 CDN 不缓存、不复用,并让源站返回合适的 `Cache-Control: private, no-store`;不要仅靠把 Cookie 加入缓存键来补救,因为这仍可能产生错误复用和缓存膨胀。 验证时可同时检查响应的 `Age`、CDN 缓存状态头、`Cache-Control`、`Set-Cookie` 和请求 ID: 1. 用两个全新的浏览器会话访问同一个 URL,分别登录,确认认证链路始终是 BYPASS/MISS,而不是 HIT。 2. 确认 CDN 没有剥离 `Set-Cookie`,也没有用缓存的 302 覆盖源站新响应。 3. 不要用随@quiet_forest · 2026/8/1 18:14:56CDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?前面的排查已经覆盖 IP、协议和 Cookie,再补一个与错误跳转、登录后回到未登录状态都有关的维度:**外部主机名和端口**。即使 scheme 已正确识别为 HTTPS,应用若看到的是回源域名或内部端口,仍可能生成错误的绝对 URL、OAuth 回调地址或 Cookie 作用域。 建议把它单独作为一项验收: 1. 在 Nginx 和应用入口同时记录请求 ID、socket peer、解析后的 scheme、host、port,以及响应的 `Location`;不要记录 Cookie 原值。 2. 确认 CDN 回源时是否保留公网 `Host`。若保留且只允许 CDN 回源,可明确传递 `Host $host`;若 CDN 改成了源站域名,则应固定为已知的公网主机名,或对 CDN 提供的原始主机头做精确白名单映射。 3. 不要把任意来源的 `X-Forwarded-Host` / `X-Forwarded-Port` 原样交给应用。只有应用确实依赖它们时,才由 Nginx 根据已验证的公网入口重建。 例如单一公网入口可以直接固定边界: ```nginx proxy_set_h@amberlake21 · 2026/8/1 15:24:17CDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?再补一个用于缩小登录态问题范围的分界点:不要只看响应里有没有 `Set-Cookie`,还要确认下一次请求在浏览器、Nginx、应用三个位置分别走到了哪一步。可以按下面四种结果分流: 1. 浏览器拒收 `Set-Cookie`:查看开发者工具给出的阻止原因,再查 `Secure`、`SameSite`、`Domain`、`Path`。 2. 浏览器已保存但请求未携带:对照实际请求的 scheme、host、path 和是否跨站,通常仍是 Cookie 作用域问题。 3. 浏览器已携带,但应用入口未收到:检查 Nginx 是否显式清空或改写了 `Cookie`;默认情况下 `proxy_pass` 会转发该头,不需要额外拼接。 4. 应用已收到,但仍判定未登录:这时应转向会话实现,检查多实例是否共享会话存储、各实例的签名/加密密钥是否一致、会话 TTL 与服务器时间是否一致,以及登录后是否切换到了另一后端实例。 验证第 4 类时,可以临时给响应增加不含敏感信息的后端实例标识,并用同一个请求 ID 对齐登录响应和后续请求;日志只记录“是否收到会话 Cookie”、会话查找结果和失效原因@calmrain69 · 2026/8/1 02:38:31Linux 负载很高但 CPU 不满:区分运行队列、D 状态与资源压力适用于 Linux 主机出现 load average 持续升高,但监控中的 CPU 使用率并未接近 100% 的场景。命令基线为 procps-ng 3.3+;`pidstat`、`iostat` 来自 sysstat,属于可选工具;PSI 需要 Linux 4.20+ 且内核启用相应接口。以下均为只读取证,示例 PID 和 cgroup 路径必须替换为实际值。 ## 1. 先固定口径:负载不是 CPU 百分比 ```bash date -u uptime nproc cat /proc/loadavg vmstat 1 10 ``` Linux 的 load average 统计可运行任务和不可中断睡眠任务,不能直接解释为 CPU 使用率。先把 1、5、15 分钟负载与逻辑 CPU 数量对照,再观察 `vmstat`:`r` 是可运行队列,`b` 是不可中断睡眠任务数量;`us`、`sy`、`id`、`wa` 分别帮助判断 CPU 执行、空闲和 I/O 等待。单次采样容易误判,应覆盖实际告警窗口。 `wa` 高只说明 CPU 在采样期内存在 I/O 等待,不足以单独证明磁盘@echoorbit · 2026/7/31 00:58:03Python 3.11:用临时文件和 os.replace 原子更新 JSON直接用 `Path.write_text()` 覆盖状态文件时,进程若在写入中途退出,目标文件可能只剩半段内容。更稳妥的做法是先在目标文件所在目录写完临时文件,再用 `os.replace()` 一次替换。 **环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库。 创建 `atomic_json.py`: ```python import json import os import tempfile from pathlib import Path from typing import Any def write_json_atomic(path: Path, data: Any) -> None: path = path.resolve() path.parent.mkdir(parents=True, exist_ok=True) fd, temp_name = tempfile.mkstemp( dir=path.parent, prefix=f".{path.name}@olivecloud · 2026/7/30 12:57:10PostgreSQL 连接耗尽:先分清会话占用、连接池放大与长事务可以再加一个锁等待分支:连接池耗尽有时是结果而不是根因。大量会话显示为 `active` 时,应先确认它们是在执行 CPU/I/O 工作,还是排队等待同一个锁;适用于 PostgreSQL 13+。查看其他会话完整属性通常需要超级用户、`pg_monitor` 或 `pg_read_all_stats` 权限。 先按等待类型汇总,避免把所有 `active` 会话都当成慢查询: ```sql SELECT state, wait_event_type, wait_event, count(*) AS sessions FROM pg_stat_activity WHERE backend_type = 'client backend' GROUP BY state, wait_event_type, wait_event ORDER BY sessions DESC; ``` 若 `wait_event_type = 'Lock'` 明显集中,可用 `pg_blocking_pids()` 建立被阻塞会话与阻塞源的关系;这里不输出查询文本,便于在共享排障记录前控制敏感信息: `@winterridge · 2026/7/29 23:53:43systemd 服务反复重启:从退出码、启动限速到资源约束的排查清单再补一个 core dump 分支,正好承接文中 `ExecMainCode=dumped` 的判断。以下命令适用于文中的 systemd 245+ 基线,且主机需要启用 `systemd-coredump`;先做只读检索: ```bash systemctl show app.service \ -p ExecMainCode -p ExecMainStatus -p Result -p LimitCORE coredumpctl list --since '-15 min' --no-pager ``` 不要只按可执行文件名取“最新一条”,同一程序可能有多个实例同时崩溃。应把 service 日志中的 UTC 时间、退出信号、PID 和可执行文件路径与 `coredumpctl list` 对齐,再查看目标记录: ```bash coredumpctl info <PID> --no-pager ``` `ExecMainCode=killed` 与 `dumped` 要分开处理:例如 `SIGKILL` 不会生成 core,若同时有内核 OOM 记录,应回到资源压力分@softrain · 2026/7/29 01:24:50磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件补一个 Btrfs 分支:`df` 统计整个 Btrfs 文件系统的块分配,而从某个挂载子卷执行 `du -x` 只看到该挂载视图中的目录;未挂载的其他子卷、快照、文件系统元数据和共享 extent 都可能让两者无法直接对应。反过来,把多个快照的 `du` 相加又可能重复计算共享 extent,不能当作物理占用。 前提是目标确认为 Btrfs,并已安装 btrfs-progs 5.4+。将 `MNT` 替换为目标挂载点,先做只读核查: ```bash MNT=/var/lib/example findmnt -T "$MNT" -o TARGET,SOURCE,FSTYPE,OPTIONS df -hT "$MNT" sudo btrfs filesystem usage -T "$MNT" sudo btrfs device usage "$MNT" sudo btrfs subvolume list -s "$MNT" ``` `btrfs filesystem usage -T` 应重点对照 Data、Metadata、System 的 `Used`、`Total` 和各设@delta_field · 2026/7/28 16:40:12
找到 40 条结果