实际排障流程是反向的:你先看到日志里的 keyword,再去判断是什么故障。本册就是那个反向索引——看到关键词 → 秒定组件 → 直接去排查。
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| Permission denied | 权限不足,进程无法访问文件或目录 | ls -la 查属主;id 确认运行用户;chmod/chown 修正 |
| Operation not permitted | 通常是 Linux capability 或 SELinux/AppArmor 拦截 | dmesg | grep -i avc;getcap 查 capability;容器加 --privileged 临时验证 |
| No space left on device | 磁盘满 或 inode 耗尽(两者都要查) | df -h 查空间;df -i 查 inode;du -sh /* 定位大目录 |
| Too many open files | 文件描述符耗尽,新连接/文件无法打开 | ulimit -n;lsof -p PID | wc -l;/etc/security/limits.conf 调大 |
| Cannot allocate memory | 内存不足,malloc 失败 | free -h;cat /proc/meminfo;检查是否内存泄漏 |
| Out of memory / OOM | OOM Killer 触发,进程被强制 kill | dmesg -T | grep -i oom;grep -i killed /var/log/messages;调 vm.swappiness 或加内存 |
| Killed process | OOM 在 dmesg 里的痕迹,含被 kill 的 PID 和进程名 | dmesg -T | grep "Killed process";定位进程再查内存用量 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| Connection refused | 端口没监听,或被防火墙拦截 | ss -tlnp 确认监听;iptables -L 查防火墙;telnet host port 连通测试 |
| Connection reset | 对端发送 RST,常见于 keepalive 超时或服务重启 | 检查对端服务状态;调大 keepalive 超时;排查 LB/Nginx 关闭连接的配置 |
| Connection timed out | 网络不通或对端无响应,TCP 握手超时 | ping;traceroute;检查安全组/ACL;mtr 定位丢包节点 |
| No route to host | 路由表缺失,或防火墙直接 DROP(非 REJECT) | ip route show;ip neigh 查 ARP;检查 VPC 路由表/安全组 |
| Address already in use | 端口被占用,服务无法启动 | ss -tlnp | grep PORT;lsof -i :PORT;kill 占用进程或改端口 |
| Broken pipe | 写入已关闭的连接(对端已断开) | 通常是上游服务关闭或超时;检查服务存活状态;适当加重试逻辑 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| I/O error | 磁盘硬件故障,读写失败 | dmesg | grep -iE "error|ata|scsi";smartctl -a /dev/sdX 检查 S.M.A.R.T |
| Read-only file system | 文件系统被内核自动转为只读(I/O 错误保护) | 先修复硬件问题;fsck -y /dev/sdX(卸载后);重新 mount 为读写 |
| Input/output error | 同 I/O error,硬盘故障或控制器异常 | 同上;云盘则联系云厂商;排查内核日志 dmesg -T |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| " 499 " | 客户端主动断开,Nginx 已收到请求但客户端超时走了 | 上游响应慢;排查 proxy_read_timeout 配置;awk '$9==499' access.log | awk '{print $7}' | sort | uniq -c |
| " 502 " | 上游连接失败,Backend 挂了或端口错误 | 检查 upstream 服务状态;curl -v upstream:port;看 error.log 里的 connect() failed |
| " 503 " | 上游主动返回不可用,或 no live upstreams | upstream 健康检查;所有后端节点状态;限流是否触发 503 |
| " 504 " | 上游响应超时,超过 proxy_read_timeout | 调大 proxy_read_timeout;排查 upstream 慢查询/GC 暂停 |
| " 413 " | 请求体超过 client_max_body_size 限制 | 调大 client_max_body_size;或在 location 块单独配置 |
| " 444 " | Nginx 主动关闭连接(不响应),常配合 deny 屏蔽恶意请求 | 属于主动防御;检查对应 location/server_name 的 deny 规则 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| upstream timed out | 后端响应超过 proxy_read_timeout(默认 60s) | 确认 upstream 接口响应时间;加大 timeout 或优化后端性能 |
| connect() failed | TCP 连接后端失败(Connection refused 或 timeout) | 后端服务是否存活;端口是否正确;网络/安全组是否放行 |
| no live upstreams | upstream 组内所有节点均已标记 down | nginx -s reload 后状态重置;排查所有 backend;检查健康检查配置 |
| upstream prematurely closed | 后端提前关闭连接(进程崩溃或主动退出) | 查 upstream 进程日志;是否有未捕获异常;OOM 被 kill |
| SSL_do_handshake() failed | SSL 握手失败,证书或协议版本不匹配 | openssl s_client -connect host:443;检查证书链、协议版本(TLSv1.2+) |
| worker_connections are not enough | 并发连接超过 worker_connections 上限 | 调大 worker_connections;同步调大系统 ulimit -n |
| open() failed | 文件找不到(404 根源)或权限不足 | 检查 root 路径配置;文件是否存在;nginx 用户是否有读权限 |
| client intended to send too large | 同 413,请求体超限(error.log 版) | 调大 client_max_body_size |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| OCI runtime create failed | 容器启动失败,OCI 运行时(runc)错误 | 看完整错误信息后几行;通常跟着具体原因(no such file、exec failed 等) |
| no such file or directory | 镜像内文件缺失,或挂载路径宿主机不存在 | docker run -it IMAGE sh 进镜像检查;确认 volume 宿主机路径存在 |
| executable file not found in $PATH | CMD/ENTRYPOINT 指定的命令在容器内找不到 | docker run -it IMAGE which COMMAND;检查 Dockerfile CMD 拼写;确认基础镜像包含该工具 |
| exec format error | 镜像架构与宿主机不匹配(ARM 镜像跑在 AMD64 上) | file /bin/ls 查宿主架构;拉对应架构镜像;或 docker buildx 多架构构建 |
| port is already allocated | 宿主机端口被其他容器或进程占用 | ss -tlnp | grep PORT;docker ps 查是否已有容器占用;改端口映射 |
| network ... not found | 引用的 Docker 网络不存在 | docker network ls;docker network create NAME 先创建网络 |
| pull access denied | 镜像仓库权限不足,或镜像名/tag 不存在 | docker login REGISTRY;确认镜像名和 tag;私有仓库检查 imagePullSecret |
| manifest unknown | 指定的镜像 tag 在仓库不存在 | docker search IMAGE;去 Docker Hub 确认可用 tag |
| context deadline exceeded | 拉镜像超时,registry 连接慢或网络问题 | 配置国内镜像加速;检查 /etc/docker/daemon.json 的 registry-mirrors;代理网络 |
| no space left on device → Docker | /var/lib/docker 磁盘满,无法创建容器层 | docker system df;docker system prune -a 清理;或扩容磁盘 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| ImagePullBackOff | 镜像拉取失败并进入退避重试 | kubectl describe pod 看 Events;检查 imagePullSecret;镜像名/tag 是否正确 |
| ErrImagePull | 拉镜像首次失败(ImagePullBackOff 的前置状态) | 同上;先确认节点有无网络访问 registry 的权限 |
| CrashLoopBackOff | 容器反复崩溃重启(最常见!) | kubectl logs POD --previous;查进程退出原因;检查 liveness probe 配置是否过严 |
| CreateContainerConfigError | ConfigMap 或 Secret 引用错误,容器无法创建 | kubectl describe pod;确认引用的 configmap/secret 存在于同一 namespace |
| RunContainerError | 容器运行时启动失败(OCI 层面) | 查节点 kubelet 日志;journalctl -u kubelet -n 100;检查 securityContext |
| OOMKilled | 容器内存超过 limits 限制,被 cgroup 强制 kill | 调大 resources.limits.memory;排查内存泄漏;kubectl top pod 监控 |
| Evicted | 节点资源压力触发驱逐(磁盘/内存不足) | kubectl describe node 查 Conditions;清理磁盘/扩容;设置 PodDisruptionBudget |
| Pending | Pod 调度不上去(资源不足/节点亲和性不满足) | kubectl describe pod 看 Events;kubectl get nodes;检查 nodeSelector/taints |
| ContainerCreating | 卡在容器创建,通常是 volume 挂载或 CNI 问题 | kubectl describe pod;检查 PVC 状态;查 CNI 插件日志(calico/flannel) |
| Terminating | 卡在终止状态,finalizer 未清除 | kubectl patch pod NAME -p '{"metadata":{"finalizers":null}}' 强制清除 finalizer |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| FailedScheduling | 调度失败,没有满足条件的节点 | 查资源是否充足;检查 nodeSelector、taints、affinity;kubectl describe node |
| FailedMount | Volume 挂载失败,PV/PVC 问题 | kubectl get pv,pvc;检查 StorageClass;查节点是否能访问存储后端 |
| FailedAttachVolume | 云盘/块存储挂载失败 | 检查云盘是否被其他节点占用;重启 node;查云厂商存储 CSI 驱动日志 |
| Unhealthy | 健康检查失败(liveness 或 readiness probe) | kubectl describe pod 看 probe 配置;手动 curl 检查端点;调整 initialDelaySeconds |
| NodeNotReady | 节点失联,kubelet 停止心跳 | SSH 进节点;systemctl status kubelet;检查节点资源(CPU/内存/磁盘) |
| DiskPressure / MemoryPressure / PIDPressure | 节点资源压力告警,即将触发驱逐 | kubectl describe node;清理日志/镜像;docker system prune;扩容节点 |
| NetworkNotReady | CNI 网络插件未就绪 | 检查 CNI Pod 状态(kube-system namespace);查 CNI 配置文件 /etc/cni/net.d/ |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| context deadline exceeded | etcd 慢或 API Server 与 etcd 之间网络问题 | 检查 etcd 集群状态;etcdctl endpoint health;查 etcd 磁盘 IO 性能 |
| x509: certificate | 证书过期或 CN/SAN 不匹配 | openssl x509 -in CERT -text -noout 检查 SAN/CN/过期时间;kubeadm certs renew all |
| Unauthorized / Forbidden | RBAC 权限不足,ServiceAccount 或 User 缺少权限 | kubectl auth can-i VERB RESOURCE --as=SA;检查 ClusterRole/RoleBinding;添加权限 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| Too many connections | 连接数达到 max_connections 上限 | SHOW STATUS LIKE 'Max_used_connections';调大 max_connections;用连接池复用连接 |
| Access denied for user | 账号密码错误,或 host 不匹配 | SELECT user,host FROM mysql.user;确认 host 是 % 还是具体 IP;FLUSH PRIVILEGES |
| Can't connect to MySQL server | 服务未启动,或端口/bind-address 配置错误 | systemctl status mysql;ss -tlnp | grep 3306;检查 bind-address |
| Lost connection to MySQL server | 网络抖动,或 wait_timeout/interactive_timeout 过短 | SHOW VARIABLES LIKE '%timeout%';调大 wait_timeout;应用层加重连逻辑 |
| MySQL server has gone away | 长连接超过 wait_timeout 被服务端关闭,客户端感知 | 调大 max_allowed_packet 和 wait_timeout;连接池配置心跳/validationQuery |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| Lock wait timeout exceeded | 行锁等待超过 innodb_lock_wait_timeout(默认 50s) | SHOW ENGINE INNODB STATUS;查 information_schema.INNODB_TRX 找长事务;kill 阻塞事务 |
| Deadlock found | 两个事务互相等待对方的锁,InnoDB 自动回滚一方 | SHOW ENGINE INNODB STATUS\G 看 LATEST DETECTED DEADLOCK;优化事务顺序;减少事务粒度 |
| Waiting for table metadata lock | MDL 锁,DDL 语句被长事务/查询阻塞 | SELECT * FROM performance_schema.metadata_locks;找并 kill 持有 MDL 的 session |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| Slave_IO_Running: No | IO 线程停止,无法从 master 拉 binlog | SHOW SLAVE STATUS\G;查 Last_IO_Error;检查 master 连通性和账号权限 |
| Slave_SQL_Running: No | SQL 线程停止,无法回放 binlog | 查 Last_SQL_Error;跳过错误 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1 或 GTID 模式下跳过 |
| Seconds_Behind_Master | 主从延迟秒数,大于 0 说明从库落后主库 | 查从库 IO/CPU 是否饱和;开启并行复制 slave_parallel_workers;减少主库大事务 |
| Got fatal error 1236 | 主库 binlog 位置错乱,从库无法继续同步 | 重新定位 binlog 位点;或使用 GTID 模式 MASTER_AUTO_POSITION=1 |
| Error 1062 | 主键冲突,双写或重放时重复插入 | 确认是否有双写;从库设 slave_skip_errors=1062(谨慎);排查数据一致性 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| OOM command not allowed | 内存达到 maxmemory 且策略为 noeviction,写命令被拒 | INFO memory;调大 maxmemory 或改淘汰策略为 allkeys-lru;清理大 key |
| MISCONF Redis is configured to save | RDB 持久化失败,通常是磁盘满或权限问题 | df -h /var/lib/redis;或 CONFIG SET stop-writes-on-bgsave-error no(临时解除写限制) |
| LOADING Redis is loading | 启动后正在加载 RDB/AOF,期间不可写 | 等待加载完成;大 RDB 文件加载慢,可考虑关闭 AOF 或减小 RDB 体积 |
| READONLY You can't write | 在从节点执行了写命令 | 确认连接的是主节点;Sentinel/Cluster 模式检查客户端路由;INFO replication |
| NOAUTH Authentication required | Redis 设置了 requirepass 但客户端未认证 | 客户端配置 AUTH password;检查配置文件 requirepass |
| WRONGPASS | 密码错误 | 确认密码;Redis 6.0+ 用 ACL 管理,检查 ACL LIST |
| max number of clients reached | 连接数达到 maxclients 上限 | INFO clients;调大 maxclients;检查是否连接泄漏(未释放) |
| CLUSTERDOWN | 集群部分槽位丢失,无主节点覆盖 | redis-cli --cluster check HOST:PORT;修复故障节点;重新分配槽位 |
| MOVED / ASK | 集群重定向,客户端未正确处理 Cluster 模式 | 使用支持 Cluster 的客户端;确认客户端开启了 cluster mode |
| Background saving error | bgsave 失败,磁盘或 fork 内存问题 | 检查磁盘空间;系统是否允许 overcommit:vm.overcommit_memory=1 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| java.lang.OutOfMemoryError | Jenkins JVM 堆内存不足 | 调大 -Xmx(如 -Xmx4g);JENKINS_OPTS 或 jvm.options 配置;排查内存泄漏插件 |
| GC overhead limit exceeded | GC 耗时超过 98%,几乎无效,JVM 抛出此错误 | 加大堆内存;清理 Jenkins 工作区和旧 build 历史;升级 Jenkins 版本 |
| workspace ... is offline | Jenkins Agent 掉线 | 检查 Agent 节点状态;重连 Agent;查 Agent 日志 agent.log;SSH/JNLP 连接配置 |
| Build step failed with exception | Pipeline 步骤抛出异常 | 看上下文的 Exception 类型和堆栈;通常是脚本语法、插件版本、外部服务不可用 |
| Cannot run program | Pipeline 中的命令找不到(PATH 问题) | 在 pipeline 中加 PATH 环境变量;或用绝对路径;检查 tool 配置(maven/jdk) |
| No such DSL method | Pipeline 语法错误或插件缺失 | 检查插件是否安装;查 Jenkins Pipeline 语法文档;在 Pipeline Syntax 页验证 |
| Permission denied (publickey) | SSH 认证失败,private key 问题 | Jenkins Credentials 中检查 SSH key;ssh -i KEY user@host -v 调试;确认公钥已加到 authorized_keys |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| context deadline exceeded | 抓取 exporter 超时(scrape_timeout) | 调大 scrape_timeout;优化 exporter 慢查询;减少 metrics 数量 |
| out of order sample | 时间戳乱序,通常是节点时钟不同步 | chronyc tracking / timedatectl;同步 NTP;检查 exporter 时间戳来源 |
| sample limit exceeded | 单次抓取指标数量超过 sample_limit | 调大 sample_limit;或为对应 job 单独配置;减少高基数 label |
| tsdb: out of bounds | 写入时间超出 TSDB 时间窗口(retention 或 backfill 边界) | 检查数据时间戳是否正常;--storage.tsdb.allow-overlapping-blocks |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| cluster_block_exception | 集群写入被阻断,通常是磁盘水位触发只读保护 | GET _cluster/settings;清理磁盘;调 cluster.routing.allocation.disk.watermark.*;解除只读:PUT _settings {"index.blocks.read_only_allow_delete":null} |
| FORBIDDEN/12/index read-only | 同上,索引被置为只读的 ES 错误码表述 | 同上;清理磁盘后手动解除只读标志 |
| circuit_breaking_exception | 内存熔断,查询/聚合消耗内存超过阈值 | 优化查询(加过滤条件、减少 aggregation 层级);调大 JVM heap;增加节点 |
| unassigned_shards | 分片未分配,集群 RED/YELLOW 状态 | GET _cluster/allocation/explain;查节点磁盘是否满;检查 replica 数量与节点数关系 |
| master_not_discovered_exception | Master 节点选举失败,集群不可用 | 检查 discovery.seed_hosts;确认 master eligible 节点数量(需 >1 且奇数);检查网络分区 |
| OutOfMemoryError | ES JVM 堆内存耗尽 | 调大 heap(建议不超过物理内存 50%,且 ≤31GB);检查 fielddata 使用量;优化聚合查询 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| Pipeline aborted | Logstash Pipeline 配置错误或运行时异常导致中止 | bin/logstash -f CONFIG --config.test_and_exit 先验证配置;查完整 error 堆栈 |
| _grokparsefailure | Grok 正则未匹配,日志解析失败 | 用 Grok Debugger 调试 pattern;加 match => ["message", "PATTERN1|PATTERN2"] 多 pattern 容错 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| NullPointerException | 空指针异常,最常见业务 Bug | 查堆栈行号;字段未初始化或数据库查不到数据;Optional 未判空 |
| IllegalArgumentException | 参数非法,通常是前端传参错误 | 查请求参数是否符合校验规则;日志里打印入参值;@Valid 校验失败 |
| DataIntegrityViolationException | 数据库约束违反(唯一索引、外键) | 确认数据是否重复;批量插入时主键冲突;ON DUPLICATE KEY |
| OptimisticLockException | 乐观锁更新失败 | 并发修改同一数据;重试机制;版本号(@Version)字段未传或过期 |
| TransactionRollbackException | 事务回滚异常 | 看嵌套事务;@Transactional 传播行为;异常被吞没导致回滚失败 |
| DataAccessException | 数据访问层通用异常 | 查具体子类型;常见为连接失败或 SQL 错误;检查数据库驱动兼容性 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| Connection is not available | 数据库连接池耗尽(如 HikariCP) | 查 maximumPoolSize;是否有慢 SQL 长期占用连接;调大超时 connectionTimeout |
| SQLSyntaxErrorException | SQL 语法错误 | 打印错误 SQL 语句;检查表名、字段名是否拼写错误;数据库方言与驱动是否匹配 |
| TimeoutException | 数据库查询超时 | 调大 queryTimeout;索引缺失导致慢查询;分页查询大表 |
| Cannot acquire JDBC connection | 获取连接超时 | 连接池满了或数据库挂了;检查数据库存活;查 maxLifetime 和 idleTimeout |
| Connection refused (DB) | 数据库服务未启动或端口错误 | telnet db_host 3306;检查 bind-address;安全组规则 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| ReadTimeoutException | 调用下游服务读取超时 | 下游服务慢;调整 readTimeout 参数;重试机制 |
| ConnectTimeoutException | 调用下游连接超时 | 下游服务宕机;网络不通;防火墙/安全组拦截 |
| FeignException | Feign 调用失败(含状态码) | e.printStackTrace() 看响应体;检查断路器是否触发;重试次数限制 |
| RetryableException | 重试异常 | 重试策略过重(死循环);检查 maxAttempts;幂等性是否破坏 |
| CircuitBreakerOpenException | 熔断器打开 | 下游服务故障率过高;调整熔断阈值;人工关闭熔断或快速恢复 |
| Socket hang up | TCP 连接被对端关闭(Node.js 常见) | 请求体过大;GC 暂停导致超时;调大 keepAliveTimeout |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| TraceId: [xxxx] | 请求追踪 ID(需集成 Sleuth/MDC) | 用 TraceID 跨服务串联日志;ELK 中按 traceId 聚合;定位全链路 |
| No registered service | 服务未注册到 Eureka/Nacos | 检查服务启动日志;注册中心状态;健康检查配置 |
| LoadBalancerException | 负载均衡异常(无法选到节点) | 所有服务实例都下线了;刷新服务列表;检查 ribbon.eureka.enabled |
| RedisConnectionFailure | Redis 连接失败 | 检查 Redis 服务是否存活;password 是否配错;connectTimeout 超时 |
| KafkaConsumerException | Kafka 消费异常 | 检查消费者组偏移量;序列化/反序列化错误;手动提交偏移量失败 |
| 关键词 | 含义 | 排查方向 |
|---|---|---|
| BeanCreationException (Spring) | Bean 初始化失败 | 查依赖循环;@Configuration 中 Bean 缺失;@ComponentScan 范围 |
| NoSuchBeanDefinitionException | Bean 未定义 | 检查 @Service/@Repository 是否扫描到;@Autowired 类型是否匹配 |
| runtime error: invalid memory address (Go) | 空指针/内存越界 | 查指针初始化;nil 切片操作;defer recover() 捕获 panic |
| context deadline exceeded (Go) | 超时(Gin + context.WithTimeout) | 调大超时;检查下游调用耗时;c.Request.Context() 传递 |
| DoesNotExist (Django) | get() 查不到数据 | 改用 filter().first();添加 try-except;加日志 |
| IntegrityError (Django) | 数据库完整性错误 | 同 DataIntegrityViolationException;检查 unique_together |
| UnhandledPromiseRejection (Node) | Promise 未捕获异常 | 添加 process.on('unhandledRejection');查 async/await 未加 try-catch |
grep -iE "error|fail|fatal|panic|timeout|refused|denied" /var/log/app.log
grep "$(date +%Y-%m-%d)" /var/log/xxx.log | grep -iE "error|fail"
grep -iE "error|crit|emerg" /var/log/nginx/error.log | grep -v "favicon"
dmesg -T | grep -iE "oom|killed process|out of memory"
kubectl get pods -A | grep -vE "Running|Completed" # 批量查看异常 Pod 日志 kubectl get pods -A | grep CrashLoopBackOff | awk '{print $1,$2}' | \ xargs -n2 sh -c 'kubectl logs $2 -n $1 --previous 2>&1 | tail -20' _
grep -iE "NullPointer|IllegalArgument|DataIntegrity|TransactionRollback" /app/logs/backend.log
# 慢查询日志分析 mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
# 磁盘空间 df -h # inode df -i # 找大目录 du -sh /* 2>/dev/null | sort -rh | head -10