如何用BIP分析项目中的问题

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: BIP

1.总体统计网络调用的应用负载是否过大
netstat -tuanlp | grep pid
image.png

如果接收队列数较大,说明本应用负载过大, 需要优化处理速度或扩容;
如果发送队列数较大,说明对端应用负载过大。
使用网络状态跟踪方法,可以分析出应用、中间件、数据库等的各类 TCP 调用的负载情况。

2.线程栈分析
通过命令: jstack -l pid 分析, 可以看出线上的应用阻塞或死锁的代码位置,然后针对性的进行优化。
如果发现大量线程阻塞, 会导致线程池满而无法生成新的线程,此时可调整线程池大小。
通常表现在单个请求时本来应用响应缓慢, 当请求人数较多时,很多时候会出现请求超时异常(客户端设置的超时 等待时间已经超过了服务的响应时间),这种情况如果程序不便于做优化,通常需要调整线程池大小,同时部署实例数 相应增加。
查看 tomcat 工作线程数:jstack pid | grep exec

image.png

3.GC分析
image.png

FGC 一列如果数值较大 (通常超过 10 以上) ,通常都是因为内存不足, 引起了 FULL GC。
S0C 和S1C:幸存区容量
S0U 和 S1U:幸存区已使用量
EC 和 EU:伊甸区容量和使用量
OC 和 OU:老年代容量和使用量
FGC:full GC 的次数
FGCT:full GC 耗费时间 (单位:秒)
以上几个是比较重要的指标, 通常 EU 接近 EC 时(即-gcutil 中, E 接近 100 时),说明伊甸区太小,容易导致 YGC; OU 接近 OC 时(即-gcutil 中, O 接近 100 时),说明老年代太小,容易导致 FGC。以上两种情况, 通常都是需要增加 JVM 内存大小(Xmx)的。

4.访问日志分析

image.png

image.png

从以上能看出来服务请求路径、响应状态码、服务耗时 、响应的数据量等,如果客户端慢则可以根据这些信息分 析是服务响应慢还是网络慢,或者数据量大造成的传输耗时长。
实时过滤耗时大于 1 秒的请求:
tail -fn 1000 localhost_access_log.2020 -08-28.txt| awk -F ' ' '{if($16>1000)print $0}'

有些 spring boot 应用使用 JAR 包的方式启动的应用,其访问日志的位置可以查看其 properties 配置文件: #内嵌 tomcat 日志
logging.path=/data/logs/app
server.tomcat.accesslog.buffered=true
server.tomcat.accesslog.directory=${logging.path}
server.tomcat.accesslog.enabled=true

每天保存一个

server.tomcat.accesslog.file-date-format=yyyy-MM-dd
server.tomcat.accesslog.pattern=%h %l %D %t %r %s %b %{Referer}i %{User -Agent}i
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.rename -on-rotate=false
server.tomcat.accesslog.request -attributes -enabled=false
server.tomcat.accesslog.rotate=true
server.tomcat.accesslog.suffix=.log
从以上得知其访问日志的位置为/data/logs/app

以上的配置, 实时查看耗时大于 1 秒的请求:
tail -fn 10000 /data/logs/app/access_log2021-01-08.log | awk -F ' ' '{if($3>1000)print $0}'

5.OOM分析
1.设置内存参数:
如果应用的内存设置如下:

image.png

则,设置 JVM 内存参数如下:
-Xms256m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/
( -Xmx 不能超过应用内存最大值,否则 jvm OOM 时,容器会被 croup oomkiller 杀掉,而导致无法进行dump)

image.png

模拟 OOM 场景:测试地址:
http://iuap-boot-train.dev.app.yyuap.com/test

image.png

JVM OOM 时,会自动 dump 出 heap 文件到/tmp/目录下。
将 dump 文件从容器中拷到宿主机,再拷到本地机器。

2.堆文件分析:
使用 JDK 自带工具 jvisualvm 进行分析。
image.png

image.png

从以上概要信息可以看出导致 OOM 的线程,点击可以显示线程栈详情
image.png

以上可以看出导致 OOM 的类和方法,以及本地变量,点击本地变量,并点击计算保留大小:

image.png

此时,可以看出来每个对象占用的内存大小,空间占用比较大的通常就是内存溢出的原因。

6.监控分析
1.资源池主机总资源分配和剩余量,主要涉及 CPU、Memory、磁盘分区的使用率指标。

image.png

2.单台资源池主机的监控资源
点击资源池工具箱中---> 查看监控页面

image.png

可在选择主机的选择框中选择对应的主机,查看单台主机的资源分配,主要指标有 CPU 总数和负载、内存的总量和使用率、根分区和磁盘分区的总使用量、tcp 连接数、以及网卡的流入流出带宽。

image.png

3.容器资源监控
对于容器的资源监控,我们可以在应用管理中的“监控与报警”页面查看

image.png

在容器监控面板中, 我们应常关注的资源为CPU 和内存在范围时间内的负载情况, 在cpu 方面需要关注资源的峰值是否有到达100%的情况,内存方面需要关注峰值是否达到分配的最大内存资源中。

image.png

4.中间件资源监控
对于技术中台自身的中间件,我们可以通过admin/admin123 账户登陆运维后台页面,在监控管理中查看对应中间件的监控指标:
例如 mysql 中的已启动时间、QPS(每秒查询率) 指标、InnoDB 的缓冲池大小等。

image.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
WRF模式案例运行初体验--飓风示例全过程记录
本文主要记录一下首次学习WRF并运行官网案例的全过程。
WRF模式案例运行初体验--飓风示例全过程记录
|
8天前
|
数据采集 人工智能 自然语言处理
万字干货|复杂表格多Agent方案:从LLM洞察、系统性 思考到实践经验总结
笔者结合实践经验以近期在负责的复杂表格智能问答为切入点,结合大模型的哲学三问(“是谁、从哪里来、到哪里去”),穿插阐述自己对大模型的一些理解与判断,以及面向公共云LLM的建设模式思考,并分享软件设计+模型算法结合的一些研发实践经验。
|
5月前
|
Linux
数据流转的艺术:深度解析tee命令的应用技巧
数据流转的艺术:深度解析tee命令的应用技巧
69 0
|
6月前
|
前端开发
R语言实现随机前沿分析SFA、数据包络分析DEA、自由处置包分析FDH和BOOTSTRAP方法
R语言实现随机前沿分析SFA、数据包络分析DEA、自由处置包分析FDH和BOOTSTRAP方法
|
6月前
|
数据采集 监控 前端开发
数据治理必读系列(二)丨3步提升企业数据标准化程度
数据治理必读系列(二)丨3步提升企业数据标准化程度
216 0
|
数据采集 存储 监控
数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第10章参考数据和主数据篇
数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第10章参考数据和主数据篇
|
JSON 前端开发 数据可视化
SolidUI AI生成可视化,0.1.0版本模块划分以及源码讲解
SolidUI AI生成可视化,0.1.0版本模块划分以及源码讲解
107 0
RFM用户分层模型|原理+Python全流程实现
详细解读如何使用RFM模型进行用户分层(附代码)
RFM用户分层模型|原理+Python全流程实现
|
编解码 Shell Linux
使用GFS数据驱动WRF模式场--2层嵌套 全过程学习记录
使用GFS数据驱动WRF模式场--2层嵌套 全过程学习记录
使用GFS数据驱动WRF模式场--2层嵌套 全过程学习记录
|
数据挖掘
一文速览-数据分析基础以及常规流程
一文速览-数据分析基础以及常规流程
124 0
一文速览-数据分析基础以及常规流程