本文介绍: 线上一个功能打开日志显示如下,ClientAbortException客户端中止异常,此功能公司测试环境正常,另外线上服务都是docker部署的。

场景

线上一个功能打开日志显示如下,ClientAbortException客户端中止异常,此功能公司测试环境正常,另外线上服务都是docker部署的,使用的是动态数据源,微服务库用的mysql库,业务库用的postgreSql库

Finished to call API:/process/getTaskAndFileBag/cf192870-e1a1-11ed-891a-5a5fd865df76/zb
Elapsed time : 68596 ms

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:341)

排查工具

arthas

 现象分析

发现日志接口响应时间约69s了,而网关gateway设置响应时间为60s,超时所以客户断开了,按理讲此时只要修改gateway客户响应时间就可了,但是一个简单接口怎么如此耗时呢?

用arthas追踪了一下接口发现两个问题

第一:

用arthastrace命令显示如下,在对象实例化的时候非常耗时。

第二:

接口请求发出到arthas的追踪请求方法过程中,非常慢!!!大概要1~2分钟才触发arthas

分析

按理讲一个简单构造函数怎么会如此耗时呢,根据arthas使用过程发现第二个问题,初步定位网关转发问题,因为第一个问题在追踪的过程中,内部调用了其它服务接口,因为网关转发很慢,所以追踪到的接口就非常耗时,那么网关为什么转发的如此慢呢?代码测试环境是没问题的(网关已经很多地方都在用了,而且还用的很久),所以排除是代码问题

配置排查

cpu排查

top命令发现cpu正常

(注:131785这个进程cpu占比100%,但是网上查阅资料由于占用内存是0,所以对系统的性能是没有影响项目经理讲这样做是提供cpu利用率)

 负载排查

uptime查看负载负载最大的是5.39

线上cpu是16核,正常

 内存网络磁盘IO排查

free -h 

iftop

iotop

项目经理图未截取,告诉我正常的。

数据库

索引,慢查询sql排查

SET GLOBAL slow_query_log = ‘ON’;
SET GLOBAL long_query_time = 5;
FLUSH LOGS;

索引本地测试环境建立的索引一样,且没有生成超过5秒的慢sql.因此结果正常  

死锁排查

SHOW OPEN TABLES WHERE In_use > 0;

结论:mysql是表级锁,未查到任何,因此没有问题

SELECT pidrelnamemode FROM pg_locks JOIN pg_class ON pg_locks.relation = pg_class.oid;

结论:postgresql是行级锁,虽然查到了存在但是与我的业务没有任何关系,因此没有问题

数据库连接排查

HOW STATUS WHERE `variable_name` = ‘Threads_connected’;

注:配置文件数据库设置的最大连接数200,而线上排查是60,因此正常。

docker stats命令

docker stats这个命令之前排查问题的时候很少使用,因此使用docker部署的服务有时候性能问题可以尝试使用这个命令

 问题原因终于找到了,问了运维在部署gateway和oauth服务内存大小限制在1G,线上内存占用都超过50%那不鸡鸡了!!!!,修改后正常了

原文地址:https://blog.csdn.net/qq_38423256/article/details/130551320

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_7175.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注