日常问题排查手册

------------------------------------------------------------------------------------------------------

springboot日常问题排查工具

SpringBoot 线上 / 日常问题排查全套工具(运维 + 开发必备,直接照着用)

一、JDK 自带原生工具(无需安装,万能)

  1. jps查看 Java 进程 PIDjps -l
  2. jstack PID排查线程死锁、线程阻塞、CPU 飙高、接口卡死导出线程堆栈,分析等待、死锁、阻塞
  3. jmap PID / jheapdump排查内存溢出 OOM、内存泄漏、堆内存占用过高生成堆快照
  4. jstat监控 GC 频繁、GC 卡顿、内存回收异常
  5. jconsole / VisualVM可视化监控:内存、线程、GC、类加载、CPU本地 + 远程都能用

二、SpringBoot 自带监控神器(Actuator)

引入依赖即可开箱即用
xml
 
 
spring-boot-starter-actuator
 
常用端点:
  • /actuator/health 服务健康
  • /actuator/beans 所有 Bean
  • /actuator/dump 线程堆栈
  • /actuator/env 配置参数
  • /actuator/logfile 实时日志
  • /actuator/metrics CPU、内存、接口耗时
配合 Prometheus + Grafana 做大盘监控

三、线上性能诊断神器 Arthas(阿里开源,必用)

无脑一键排查:CPU 高、慢接口、死锁、参数不对、异常堆栈、接口耗时
  1. 一键附着进程
  2. dashboard 全局概览
  3. thread 查看线程
  4. watch 实时查看方法入参出参
  5. trace 追踪接口调用耗时链路
  6. heapdump 导出内存快照
微服务排查首选,比 JDK 工具好用 10 倍

四、日志排查工具

  1. Logback/Log4j2 日志分级 ERROR/WARN/INFO
  2. ELK / Loki 集中日志检索,海量日志秒查
  3. Arthas 实时打印方法日志,不用改代码

五、接口 & 链路排查

  1. Sleuth + Zipkin 微服务 OpenFeign 调用链路追踪
     
    排查:哪个服务慢、哪个接口超时、调用断层
  2. Knife4j/Swagger 接口参数、响应异常
  3. Postman 复现线上接口异常

六、常见问题 + 对应工具

  1. 服务 CPU 飙升 → Arthas thread / jstack
  2. 内存爆满 OOM → jmap / Arthas heapdump
  3. 接口超时卡死无响应 → jstack + trace
  4. 事务不回滚、分布式事务异常 → 日志 + Seata 控制台
  5. Feign 调用失败、超时 → Sleuth 链路追踪
  6. Bean 注入失败、配置不生效 → actuator/env/beans
  7. GC 频繁卡顿 → jstat、VisualVM

七、极简记忆口诀

  • 线程卡死:jstack / Arthas thread
  • 内存溢出:jmap / heapdump
  • 接口慢链路乱:Zipkin 链路追踪
  • 线上临时排查:Arthas 一键神器
  • 健康配置监控:Actuator
需要我给你整理Arthas 常用一键排查命令大全吗?
数据库死锁排查

MySQL + SpringBoot 数据库死锁 全套排查方法(线上直接用)

一、MySQL 查看当前死锁日志(必用)

sql
 
 
-- 查看最近一次死锁详情
show engine innodb status;
 
往下找到 LATEST DETECTED DEADLOCK里面会清清楚楚显示:
  • 哪个事务、哪条 SQL
  • 谁持有行锁
  • 谁等待锁
  • 锁等待顺序、循环等待 → 死锁原因

二、查看当前正在锁等待的事务

sql
 
 
-- 查看正在等待锁的事务
select * from information_schema.innodb_lock_waits;

-- 查看所有运行事务
select * from information_schema.innodb_trx;
 

三、SpringBoot 事务 + Feign 最常见死锁场景

  1. 服务 A 更新表 1 → Feign 调用服务 B 更新表 2
  2. 服务 B 反过来更新表 1互相等待对方行锁 → 环形死锁
  3. 同一批数据多线程更新顺序不一致线程 1:先改 id=1 再改 id=2线程 2:先改 id=2 再改 id=1→ 99% 必出死锁
  4. @Transactional 传播级别配置错误嵌套事务、 REQUIRES_NEW 混用导致长事务不释放锁

四、Java 层面排查长事务(锁持有太久)

  1. Arthas 查看事务持有时长
  2. 排查是否:
    • 事务里调用 Feign 远程(超级大忌!)
    • 事务里查数据库循环
    • 事务里 IO、文件、等待
Spring 事务内不要写 OpenFeign 调用!远程耗时越长,锁持有越久,死锁爆炸概率翻倍

五、死锁快速定位流程图

plaintext
 
 
出现锁超时/死锁报错
        ↓
show engine innodb status 看死锁日志
        ↓
看两个事务SQL更新顺序是否颠倒
        ↓
统一所有线程更新ID排序(从小到大)
        ↓
缩短事务时长、事务内不远程调用
        ↓
innodb锁级别优化 RC 代替 RR
 

六、根治死锁 3 个黄金方案

  1. 所有多线程更新多行,必须按主键 ID 顺序统一更新
  2. @Transactional 事务尽可能短小,事务内禁止 Feign、RPC
  3. MySQL 隔离级别改用 READ COMMITTED(大幅减少间隙锁死锁)

七、线上快速杀阻塞事务

sql
 
 
-- 查到trx_mysql_thread_id
kill 线程ID;
 

要不要我给你MySQL 死锁日志解读模板,你粘贴日志我一秒帮你定位是谁跟谁互锁?
mysql 如何执行死锁语句

MySQL 手动模拟死锁(2 个会话同时执行,100% 复现)

准备:2 个 MySQL 查询窗口(会话 A、会话 B)

MySQL 隔离级别默认 RR(可重复读) 即可

测试表

sql
 
 
CREATE TABLE t_lock(
id INT PRIMARY KEY,
name VARCHAR(20)
);

INSERT INTO t_lock VALUES(1,'a'),(2,'b');
 

步骤 1:会话 A 执行

sql
 
 
BEGIN;
UPDATE t_lock SET name='aa' WHERE id=1;
 
会话 A 锁住 id=1

步骤 2:会话 B 执行

sql
 
 
BEGIN;
UPDATE t_lock SET name='bb' WHERE id=2;
 
会话 B 锁住 id=2

步骤 3:会话 A 再执行

sql
 
 
UPDATE t_lock SET name='aaa' WHERE id=2;
 
会话 A 等待 会话 B 的 id=2 锁

步骤 4:会话 B 再执行

sql
 
 
UPDATE t_lock SET name='bbb' WHERE id=1;
 
👉 立刻触发死锁!
plaintext
 
 
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
 

查看刚刚产生的死锁日志

sql
 
 
SHOW ENGINE INNODB STATUS;
 
往下找到 LATEST DETECTED DEADLOCK 就是完整死锁信息

为什么会死锁?

  1. A 占 1,等 2
  2. B 占 2,等 1
     
    循环等待 → 死锁

SpringBoot+MySQL 高频死锁元凶

  1. 多线程更新主键顺序不一致
  2. @Transactional 里面调用 Feign 远程,长事务不释放锁
  3. RR 隔离级别间隙锁,范围更新互相等待
需要我顺便教你怎么看死锁日志、怎么根治吗?
mysql执行计划查看

MySQL 执行计划 EXPLAIN 超通俗易懂完整版

1、最简单用法

SQL 前面加 explain
sql
 
 
explain select * from case_info where case_id = '123';
 

2、关键字段看懂(面试 + 排查必背)

1. type 🔴 SQL 好坏等级(最重要)

从好到差:system > const > eq_ref > ref > range > index > ALL
  • ref / eq_ref:走索引,优秀
  • range:范围查询(between/in)一般
  • index:扫描索引全表
  • ALL:全表扫描!垃圾 SQL,必加索引

2. key

  • 显示实际用到的索引
  • NULL = 没走索引

3. rows

MySQL 预估扫描多少行数据,越小越快

4. Extra 额外信息

  • Using index:覆盖索引,极好
  • Using filesort:文件排序,很慢,order by 没索引
  • Using temporary:临时表,group by 差
  • Using join buffer:join 没索引

5. possible_keys

可能用到的所有索引

3、常见问题一眼判断

  1. type=ALL → 没走索引,加索引
  2. Extra=Using filesort → order by 字段建索引
  3. Extra=Using temporary → group by 优化
  4. rows 几百万 → 大 SQL 慢查询

4、进阶详细执行计划

sql
 
 
explain extended select ... ;
show warnings;
 
可以看到 MySQL真实优化后的 SQL

5、你案件业务高频慢 SQL 场景

  1. 附件表、案件表没加 caseId 索引 → ALL 全表扫描
  2. 多表 join 关联字段没索引
  3. 事务 + 大查询 → 锁等待 + 慢 SQL 叠加死锁

------------------------------------------------------------------------------------------------------

 

gitlab如何查询所以访问过的ip

GitLab 查询所有访问过的 IP(含网页访问、容器访问、代码拉取推送)

GitLab 最准、最全的 IP 在 内置 Nginx 访问日志,其次是应用日志,下面直接给你可复制命令。

一、Nginx 访问日志(最准,所有 HTTP/8081 访问都在这里)

日志路径:
plaintext
 
 
/var/log/gitlab/nginx/gitlab_access.log
 

1. 查看所有访问 IP(去重,统计)

bash
 
运行
 
 
 
# 提取所有访问IP,去重,排序
awk '{print $1}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq
 

2. 统计每个 IP 访问次数

bash
 
运行
 
 
 
awk '{print $1}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq -c | sort -nr
 

3. 实时看当前访问 IP

bash
 
运行
 
 
 
tail -f /var/log/gitlab/nginx/gitlab_access.log
 

二、GitLab 应用日志(网页登录、用户操作、容器访问记录)

bash
 
运行
 
 
 
# 查看所有登录/访问IP
grep -i "ip_address" /var/log/gitlab/gitlab-rails/production.log
 

三、查 Docker 容器访问 GitLab 的 IP(你重点要的)

容器访问源 IP 一般是:172.17.x.x直接过滤:
bash
 
运行
 
 
 
# 只看docker网段访问记录
awk '$1 ~ /^172\.17\./ {print $1}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq
 

四、gitlab-ctl 一键实时看所有访问

bash
 
运行
 
 
 
gitlab-ctl tail nginx
 

五、和你防火墙白名单对应(重点)

  • 日志里出现的 IP → 加到 iptables 白名单
  • 出现 172.17.0.0/16 → 说明Docker 容器正在访问,必须放行该网段
需要我帮你把日志里所有 IP 自动导出,直接生成 iptables 放行命令吗?
 
gitlab服务器在哪看所有访问过的ip

GitLab(Omnibus 安装,8081 端口)查看所有访问 IP,3 个最准路径,直接给你命令 + 路径

一、核心日志位置(Nginx 访问日志,所有网页 / 容器 / 拉代码都在这里)

plaintext
 
 
/var/log/gitlab/nginx/gitlab_access.log
 

1. 提取所有访问过的 IP(去重)

bash
 
运行
 
 
 
awk '{print $1}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq
 

2. 统计每个 IP 访问次数(最多的排前面)

bash
 
运行
 
 
 
awk '{print $1}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq -c | sort -nr
 

3. 实时看当前谁在访问

bash
 
运行
 
 
 
tail -f /var/log/gitlab/nginx/gitlab_access.log
 

二、GitLab 登录 / 操作 IP(用户登录、账号 IP)

plaintext
 
 
/var/log/gitlab/gitlab-rails/production.log
 
查询登录 IP:
bash
 
运行
 
 
 
grep ip_address /var/log/gitlab/gitlab-rails/production.log
 

三、快速一键查看(gitlab-ctl 实时)

bash
 
运行
 
 
 
gitlab-ctl tail nginx
 

重点针对你:Docker 访问 GitLab

容器访问时,日志里看到的源 IP 是 Docker 内网段 172.17.x.x直接过滤容器 IP:
bash
 
运行
 
 
 
awk '$1 ~ /^172\.17\./ {print $1}' /var/log/gitlab/nginx/gitlab_access.log | sort | uniq
 
出现 172.17 开头,就说明容器在访问,必须放行 172.17.0.0/16 网段

四、日志切割后看历史访问

日志会自动切割,历史日志:
plaintext
 
 
/var/log/gitlab/nginx/gitlab_access.log-*.gz
 
查看压缩日志里的 IP:
bash
 
运行
 
 
 
zcat /var/log/gitlab/nginx/gitlab_access.log-*.gz | awk '{print $1}' | sort | uniq
 
gitlab 服务器会记录访问过的所有ip么

一句话结论

会记录,但分两种情况:Nginx 记录所有 IP;GitLab 程序只记录登录 / 操作 IP,普通浏览也会留痕。下面用最直白的话讲清楚,结合你 Docker 访问、8081 端口、白名单 场景。

1. Nginx 访问日志(必记所有 IP,最完整)

路径:/var/log/gitlab/nginx/gitlab_access.log只要访问过 8081 端口,不管是:
  • 浏览器网页访问
  • Docker 容器访问
  • Git 拉代码、推送
  • 爬虫、扫描、恶意 IP
全部都会记录源 IP、时间、访问路径、状态码Docker 访问这里会显示:172.17.x.x 内网 IP
这是最完整的访问 IP 清单,不会漏

2. GitLab 应用日志(只记用户行为 IP)

路径:/var/log/gitlab/gitlab-rails/production.log只记录:
  • 用户登录账号
  • 提交代码、合并、下载
  • API 调用
单纯打开网页、匿名浏览,这里不记录

3. 容器访问的特殊点(你最关心)

Docker 访问 GitLab:
  • Nginx 日志记录:172.17.x.x(容器内网 IP)
  • 不是你宿主机外网 IP
  • 所以你防火墙必须放行 172.17.0.0/16

4. 会不会漏记?

  • 不会漏:Nginx 是第一层反向代理,所有流量必经它,全部记
  • 日志会按天切割压缩,历史访问 IP 在 .gz 压缩文件里

5. 快速提取所有访问过的 IP(直接复制)

bash
 
运行
 
 
 
# 当前日志所有IP
awk '{print $1}' /var/log/gitlab/nginx/gitlab_access.log |sort|uniq

# 历史压缩日志所有IP
zcat /var/log/gitlab/nginx/gitlab_access.log-*.gz |awk '{print $1}'|sort|uniq
 
需要我帮你把所有访问过 GitLab 的 IP 整理出来,直接生成 iptables 白名单吗?

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

posted @ 2026-04-21 11:16  hanease  阅读(27)  评论(0)    收藏  举报