如何用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日志并进行多维度分析。
相关文章
|
自然语言处理 Java Go
项目总监必看:如何利用Git深度统计团队代码贡献?多语言实践教程揭秘!
项目总监必看:如何利用Git深度统计团队代码贡献?多语言实践教程揭秘!
336 0
WRF模式案例运行初体验--飓风示例全过程记录
本文主要记录一下首次学习WRF并运行官网案例的全过程。
WRF模式案例运行初体验--飓风示例全过程记录
|
3月前
|
前端开发 安全 JavaScript
官网构建不再难:全方位解析高效解决方案,让企业形象在线上‘大放异彩’
【8月更文挑战第29天】企业门户网站是展示品牌和传递信息的重要窗口,其构建需综合考虑技术选型、内容管理和用户交互等。本文从内容管理系统(CMS)、前端框架、响应式设计、SEO优化及安全防护等方面,评估高效构建方案。WordPress适合快速搭建内容丰富的网站,而Drupal则适用于复杂内容管理和定制化需求;React和Vue提高前端开发效率,Bootstrap助力响应式布局;SEO技术和工具提升搜索引擎排名;SSL/TLS证书和Web应用防火墙保障安全。通过综合应用这些技术,企业可构建功能全面、体验优秀的门户网站。
40 1
|
8天前
|
数据采集 人工智能 自然语言处理
万字干货|复杂表格多Agent方案:从LLM洞察、系统性 思考到实践经验总结
笔者结合实践经验以近期在负责的复杂表格智能问答为切入点,结合大模型的哲学三问(“是谁、从哪里来、到哪里去”),穿插阐述自己对大模型的一些理解与判断,以及面向公共云LLM的建设模式思考,并分享软件设计+模型算法结合的一些研发实践经验。
|
5月前
|
Linux
数据流转的艺术:深度解析tee命令的应用技巧
数据流转的艺术:深度解析tee命令的应用技巧
69 0
|
6月前
|
数据可视化 API uml
【有奖调研】开发文档功能升级:接口分组更清晰;增加参数中文名
【有奖调研】开发文档功能升级:接口分组更清晰;增加参数中文名
61 0
|
6月前
|
数据可视化 数据管理 数据建模
CodeWave智能开发平台--02--目标:文档快速阅读--01快速构建一个应用
CodeWave智能开发平台--02--目标:文档快速阅读--01快速构建一个应用
|
11月前
|
XML JSON 供应链
技术分享 | 不同格式标准SBOM清单横评:SPDX、CDX和DSDX
使用清晰的软件物料清单(SBOM)收集和共享信息,并在此基础上进行漏洞、许可证和授权管理等,可以揭示整个软件供应链中的弱点、提高软件供应链的透明度并增进供应链上下游间的相互信任、有效管控软件供应链攻击的威胁。
775 0
|
存储 缓存 算法
藏不住了!一线大厂内部图可视分析的需求清单
藏不住了!一线大厂内部图可视分析的需求清单
148 0
|
编解码 Shell Linux
使用GFS数据驱动WRF模式场--2层嵌套 全过程学习记录
使用GFS数据驱动WRF模式场--2层嵌套 全过程学习记录
使用GFS数据驱动WRF模式场--2层嵌套 全过程学习记录