客户端 CPU100%问题分析

问题描述:

测试运行一段时间后,测试客户端CPU100%,Loadrunner界面有错误报出。

问题分析过程:

抓取堆栈信息

分析堆栈发现线程有1000多,大部分为BLOCKED状态,ACTIVE状态基本看到的都是nio的,暂时没看到问题。

搜索测试代码类名,看看有没有测试代码引起的问题。

发现测试代码有好几个以下的堆栈

Thread 1134: (state = IN_NATIVE)

?- java.net.NetworkInterface.getAll() @bci=0 (Compiled frame; information may be imprecise)

?- java.net.NetworkInterface.getNetworkInterfaces() @bci=0, line=334 (Compiled frame)

?- com.alibaba.rocketmq.remoting.common.RemotingUtil.getLocalAddress() @bci=0, line=112 (Compiled frame)

?- com.alibaba.rocketmq.client.ClientConfig.<init>() @bci=19, line=32 (Compiled frame)

?- com.alibaba.rocketmq.client.producer.DefaultMQProducer.<init>

(java.lang.String, com.alibaba.rocketmq.remoting.RPCHook) @bci=1, line=95 (Compiled frame)

?- com.alibaba.rocketmq.client.producer.DefaultMQProducer.<init>(java.lang.String) @bci=3, line=86 (Compiled frame)

?-?********************MQProducer.<init>(java.lang.String, java.lang.String) @bci=71, line=62 (Compiled frame)

?-?********************.RocketMQ.sendMessage() @bci=76,line=119?(Compiled frame)?????//119为源代码行号

?-?********************.RocketMQ$1$1.safeRun() @bci=7, line=53 (Compiled frame)

?-?********************.SafeRunnable.run() @bci=1, line=13 (Compiled frame)

?- java.util.concurrent.ThreadPoolExecutor.runWorker

(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=95, line=1145 (Compiled frame)

?- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=615 (Interpreted frame)

?- java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)

发现 java.net.NetworkInterface.getAll() ,此方法比较耗费CPU,之前遇到过类似案例。接着分析为什么这几个线程会卡到这。

以下是问题代码,119行是(1)的位置

public void sendMessage() {

????????try {

????????????// 略…

????????????t = UserManager.getTransManager().CreateTransaction("Performace-client", trace);

????????????Message msg = new Message("Performace", msgContent.getBytes("UTF-8"));

????????????if (producer == null) {

????????????????producer = new MQProducer("Performace", "192.168.143.135:9876");??????(1)

????????????????producer.start();

????????????????rst = producer.product(msg);

????????????} else {

????????????????rst = producer.product(msg);

????????????}

?
?

????????????// 略…

?
?

????????} catch (Exception e) {

????????????// 略…

????????????if (producer != null) {

????????????????producer.shutdown();

????????????????producer = null;

????????????}

????????}

????}

问题分析

sendMessage方法会被随机的注册到一个timer线程池上,有可能会在同一时间点或者很近时间点同时执行该方法。

producer.product(msg);为给远端发送信息,如果因为网络原因或者其他未知原因导致Exception,会把producer赋值为null。

当再次执行sendMessage会重新初始化producer,如果恰好有多线程并发执行sendMessage,可能会导致重复初始化以及其他并发问题,导致恶性循环。

修改后

public void sendMessage() {

????????try {

????????????// 略…

????????????t = UserManager.getTransManager().CreateTransaction("Performace-client", trace);

????????????Message msg = new Message("Performace", msgContent.getBytes("UTF-8"));

????????????synchronized (this) {

????????????????if (producer == null) {

????????????????????producer = new MQProducer("Performace", "192.168.143.135:9876");

????????????????????producer.start();

????????????????}

????????????}

????????????rst = producer.product(msg);

?
?

????????????// 略…

?
?

????????} catch (Exception e) {

????????????// 略…

????????????if (producer != null) {

????????????????producer.shutdown();

????????????????producer = null;

????????????}

????????}

????}

加个同步等待,问题解决

?
?

作者:No.40

Blog:http://www.cnblogs.com/no40

时间: 2024-10-15 17:14:22

客户端 CPU100%问题分析的相关文章

电商客户端竞品分析-手机淘宝、京东、唯品会、聚美优品

市场状况 艾瑞最新统计数据显示,2013年移动网购整体交易规模1676.4亿元,同比增幅高达165.4%,而同期PC端网购规模将近16000多亿元,同比增速35.7%.预计2017年市场规模将近万亿,增速39.4%. 图1 2011-2017年中国移动购物市场交易规模 2013年中国移动网购渗透率9.1%,同比去年增长超过四个百分点.预计到2017年移动购物渗透率达到24.1%. 图2 2011-2017年中国网购交易额PC端和移动端占比 2013年移动网购企业份额中,手机淘宝占比76.1%,京

个人博客作业Week2(微软必应词典客户端的案例分析)

提要:我们生活中很多时候要和软件打交道,大家上课开小差时候玩的手机游戏,买火车票的网站,互相联系用的微信微博,等等都是软件,都很值得分析. 你为何成为它们的用户?它们的团队做对了什么,做错了什么?如果你来做,会做得更好么? 通过各种案例分析,评测,辩论,总结,我们就能看到软件工程的原则在实践中的种种体现. 产品:必应词典客户端 (http://bing.msn.cn/dict/) 关于 微软必应词典客户端 的案例分析 (桌面版 version 3.5.0) 第一部分 调研,评测 调研 1)采访对

Eoe客户端源码分析---SlidingMenu的使用

Eoe客户端源码分析及代码注释 使用滑动菜单SlidingMenu,单击滑动菜单的不同选项,可以通过ViewPager和PagerIndicator显示对应的数据内容. 0  BaseSlidingFragmentActivity.java 主要函数: (1)showMenu() /** * Opens the menu and shows the menu view.*/ public void showMenu() { showMenu(true); } (2)showContent() /

Eureka 系列(02)客户端源码分析

Eureka 系列(02)客户端源码分析 [TOC] 在上一篇 Eureka 系列(01)最简使用姿态 中对 Eureka 的简单用法做了一个讲解,本节分析一下 EurekaClient 的实现 DiscoveryClient.本文的源码是基于 Eureka-1.9.8. 1)服务注册(发送注册请求到注册中心) 2)服务发现(本质就是获取调用服务名所对应的服务提供者实例信息,包括IP.port等) 3)服务续约(本质就是发送当前应用的心跳请求到注册中心) 4)服务下线(本质就是发送取消注册的HT

zookeeper - 客户端源码分析

zookeeper客户端的主类入口是Zookeeper类,负责与zookeeper server端的通信以及触发watcher等. 下文主要分析zookeeper客户端的工作流程. 1 zookeeper构造函数 主要分两类,一是不带sessionid的,这是客户端第一次连接server时采用 public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly) thr

个人博客3-微软必应词典客户端的案例分析

产品:必应词典客户端 (http://bing.msn.cn/dict/)必应词典有PC,Win8/10, Windows Phone,iPhone,Android,iPad 客户端 一.调研评测: 1.软件bug: bug1.就如同词典自己显示的标志一样,他的翻译完全来自计算机翻译,完全是直译单词再组合成句子,所以翻译出来的内容别扭而且无法理解.但是这个bug不仅仅是必应词典的问题,到目前为止我使用过的全部词典软件里没有能够像人一样已能够直译也能够意译的功能. bug2.关于页面设计我个人认为

Hadoop RPC通信Client客户端的流程分析

Hadoop的RPC的通信与其他系统的RPC通信不太一样,作者针对Hadoop的使用特点,专门的设计了一套RPC框架,这套框架个人感觉还是有点小复杂的.所以我打算分成Client客户端和Server服务端2个模块做分析.如果你对RPC的整套流程已经非常了解的前提下,对于Hadoop的RPC,你也一定可以非常迅速的了解的.OK,下面切入正题. Hadoop的RPC的相关代码都在org.apache.hadoop.ipc的包下,首先RPC的通信必须遵守许多的协议,其中最最基本的协议即使如下: /**

关于 微软必应词典客户端 的案例分析

测试产品:必应词典客户端 iPhone—4.3.5 @第一部分 调研,评测 评测: 第一个bug: Bug等级-E类测试建议 当用中文查询词义获得的英文单词解释,没有办法直接从当前界面直接点击其中的英文解释单词来查询,获得这个单词的详细含义.下图为必应词典和有道词典的比较,从可操作区域和只读区域可以清楚区分是否有这个功能.个人觉得这个功能对于词典的用户来说应该是比较便捷和常用的功能. 第二个bug: Bug等级-D类较小错误(辅助说明描述不清) 单词匹配不完整.不正确.在我们查询单词是经常会有包

开源中国 OsChina Android 客户端源码分析(9)下载APK功能

源码中用以下载客户端的类为DownloadService,是一个服务.如果你对android服务不够理解的话,建议先查阅下有关服务的知识点.源码分析如下: 1首先我们先来看下该服务中几个重写的方法: 1.1onCreate()中 首先声明了自定义的绑定器对象,并在自定义的绑定器中添加了几个界面可以访问服务的方法,我们发现在这几个方法中,目前实际用到的start()方法用以开始下载APK,其他的没有用到.获取通知管理器.设置服务为 非前台服务.代码注释中,火蚁表明了不确定性. 其实如果将服务设置为