Java程序CPU使用率过高问题排查与修复
问题现象:CPU负载过高
我们线上的java系统,时不时会发生CPU负载过高的现象。问题排查
应对Java程序导致的CPU使用率过高这一问题,GitHub上有现成的解决方案:showbusyjavathreads。https:github。comoldratleeusefulscriptswgetnocheckcertificatehttps:github。comoldratleeusefulscriptsarchiverelease2。x。zipunziprelease2。x。zip
登录上机器,在CPU使用率高时候,执行showbusyjavathreads脚本。showbusyjavathreads
摘选其中的一些输出如下:Thestackofbusy(25。0)thread(202390x4f0f)ofjavaprocess(248927)ofuser(jenkins):HandlingGETjobjenkinstestjobapijsonfrom172。168。1。1:qtp164180884631273127prio5osprio0tid0x00007f7380014000nid0x4f0frunnable〔0x00007f722c392000〕java。lang。Thread。State:RUNNABLEatjava。util。Arrays。copyOfRange(Arrays。java:3664)atjava。lang。String。init(String。java:207)atjava。lang。String。substring(String。java:1933)atnet。sf。json。util。JSONTokener。matches(JSONTokener。java:110)atnet。sf。json。JSONObject。fromJSONTokener(JSONObject。java:912)atnet。sf。json。JSONObject。fromObject(JSONObject。java:156)atnet。sf。json。util。JSONTokener。nextValue(JSONTokener。java:348)atnet。sf。json。JSONArray。fromJSONTokener(JSONArray。java:1131)atnet。sf。json。JSONArray。fromObject(JSONArray。java:125)atnet。sf。json。util。JSONTokener。nextValue(JSONTokener。java:351)atnet。sf。json。JSONObject。fromJSONTokener(JSONObject。java:955)atnet。sf。json。JSONObject。fromObject(JSONObject。java:156)atnet。sf。json。util。JSONTokener。nextValue(JSONTokener。java:348)atnet。sf。json。JSONObject。fromJSONTokener(JSONObject。java:955)atnet。sf。json。JSONObject。fromObject(JSONObject。java:156)atnet。sf。json。util。JSONTokener。nextValue(JSONTokener。java:348)atnet。sf。json。JSONObject。fromJSONTokener(JSONObject。java:955)atnet。sf。json。JSONObject。fromObject(JSONObject。java:156)atnet。sf。json。util。JSONTokener。nextValue(JSONTokener。java:348)atnet。sf。json。JSONObject。fromJSONTokener(JSONObject。java:955)atnet。sf。json。JSONObject。fromString(JSONObject。java:1145)atnet。sf。json。JSONObject。fromObject(JSONObject。java:162)atnet。sf。json。JSONObject。fromObject(JSONObject。java:132)atsam。Sam。sendRequestReturnJson(Sam。java:517)atsam。Sam。getPermissionByUser(Sam。java:225)atsam。Sam。checkUserPermissionLocal(Sam。java:243)atcom。michelin。cio。hudson。plugins。rolestrategy。PermissionCache。getPermissionSam(RoleMap。java:155)atcom。michelin。cio。hudson。plugins。rolestrategy。PermissionCache。getPermission(RoleMap。java:106)atcom。michelin。cio。hudson。plugins。rolestrategy。RoleMap。hasPermission(RoleMap。java:220)atcom。michelin。cio。hudson。plugins。rolestrategy。RoleMap。access000(RoleMap。java:166)atcom。michelin。cio。hudson。plugins。rolestrategy。RoleMapAclImpl。hasPermission(RoleMap。java:569)athudson。security。SidACL。hasPermission(SidACL。java:70)
从上面的输出可以看到,25。0的CPU资源在处理HandlingGET
jobjenkinstestjobapijsonfrom172。168。1。1这个请求。
运维同学根据这个ip,定位到发起请求的是某同学A。这个同学在跑一些定时任务,定时拉取job的执行结果。
问题是当我直接访问这个接口:
jobjenkinstestjobapijson时,返回并不慢,几乎很快就可以返回。问题应该不是这个接口的问题。
我们接着从。showbusyjavathreads输出往下看:看到其中有问题的调用栈:atnet。sf。json。JSONObject。fromObject(JSONObject。java:132)atsam。Sam。sendRequestReturnJson(Sam。java:517)atsam。Sam。getPermissionByUser(Sam。java:225)atsam。Sam。checkUserPermissionLocal(Sam。java:243)
看起来是这个Sam校验用户权限导致的CPU使用率过高,而接着看上面的代码
net。sf。json。JSONObject。fromObject,这个是在做json的反序列化。
通常来说,json的序列化、反序列化都是比较费CPU的,更糟糕的是,这里用到的json序列化框架是net。sf。json,而不是Java常用的jackson和gson等。
直觉告诉我,肯定是这个net。sf。json反序列化引起的CPU使用率过高问题。
备注:
通过跟之前维护jenkins的同学了解到,他们基于rolestrategy插件,重写了jenkins权限验证逻辑,用的就是Sam权限。翻看sam权限插件的代码,确实有用net。sf。json做json反序列化。
到这里,定位到大概率是Sam权限插件的net。sf。json反序列化引起的问题。问题复现
为了验证这个问题,我们拿到Sam权限插件的代码。找到出问题的关键代码:publicvoidgetPermissionByUser(Stringemail){JSONObjectparamsnewJSONObject();params。put(useremail,email);params。put(subsystemid,SAMJENKINSSUMSYSTEMID);JSONObjectressendRequestReturnJson(URL,GET,params);if(res。get(success)。equals(true)){cacheUserPermission(params。getString(useremail),res。getJSONObject(permission)。getJSONObject(email)。getJSONObject(SERVICE));}}publicstaticJSONObjectsendRequestReturnJson(Stringendpoint,Stringmethod,JSONObjectparams){if(method。equals(POST)){returnJSONObject。fromObject(sendPostRequest(endpoint,params));}elseif(method。equals(GET)){returnJSONObject。fromObject(sendGetRequest(endpoint,params));}returnnewJSONObject();}
可以看到,这段代码会根据用户邮箱,发送http请求调用Sam系统,获取用户的权限数据,然后将数据反序列化成JSONObject,即:JSONObject。fromObject(sendGetRequest(endpoint,params,token))
在本地,通过复现A同学的请求,发现这个请求确实比较慢,而且费CPU。通过debug得知,这个用户返回的json数据有1M左右,json反序列化CPU打满。
而通过其他用户请求,发现处理很快,返回的json数据也比较小。
到这里,确认就是net。sf。json框架的反序列化性能问题,引起的CPU使用率过高。我们需要替换成其他高性能的json序列化框架。
备选有:gson、jackson、fastjson等。fastjson因为经常出安全漏洞,暂不考虑,我们考虑从gson、jackson选择一个。替换成gson
将之前的代码替换成gson,代码如下:publicvoidgetPermissionByUser(Stringemail){JSONObjectparamsnewJSONObject();params。put(useremail,email);params。put(subsystemid,SAMJENKINSSUMSYSTEMID);JsonObjectressendRequestReturnJsonV2(URL,GET,params);if(res。get(success)。getAsBoolean()){cacheUserPermission(params。getString(useremail),res。getAsJsonObject(permission)。getAsJsonObject(email)。getAsJsonObject(SERVICE));}}publicstaticJsonObjectsendRequestReturnJsonV2(Stringendpoint,Stringmethod,JSONObjectparams)throwsIOException{if(method。equals(POST)){returnGSON。fromJson(sendPostRequest(endpoint,params,token),JsonObject。class);}elseif(method。equals(GET)){returnGSON。fromJson(sendGetRequest(endpoint,params,token),JsonObject。class);}returnnewJsonObject();}
重新编译权限插件后上线,再次查看CPU负载监控,发现CPU负载确实降下来了(0513晚上0点左右上线的)。
为什么现在是购买新能源汽车的最佳时机目前新能源汽车市场占有率节节高升,在部分城市,市场占有率已超过20,新能源汽车已经不再有骗补、PPT等标签,很多消费者考虑性能、经济性、政策,都会选择体验新能源汽车。以下会简单……
回顾2021丨互联网年度三大关键词反垄断个人信息保护与互联互即将过去的2021年对于互联网行业来讲相当漫长。这一年里,有两家互联网大型平台公司因垄断问题被开出天价罚单,《个人信息保护法》正式出台实施,互联网平台互联互通正在稳步推进。以上……
关于手机的作文爸爸的手机我爸爸的手机是名牌的,大概是2009年买的,它是爸爸最亲最亲的宝贝呀!爸爸的手机是黑色的,形状是长方形的,机子的前面有一个大屏幕,里面的图片是小汽车的图片,它的侧面有一个……
糖果国去打汽水国小学生作文300字一天,糖果国的国王说他自己喜欢喝汽水,大臣们就提议:我们的邻居汽水国有很多瓶汽水,(都能排成一条长河了),我们直接去抢不就行了吗?每一个糖果国的。老百姓都说这个方法不好,可是国……
2020那一刻我长大了作文8篇不知不觉,随着时间,我们一天天的成长着。以下是小编为您整理的2020那一刻我长大了作文,欢迎阅读!2020那一刻我长大了作文1坐在窗边,静静地聆听着窗外的雨声,懵懂的我已……
秋天的田野作文范文400字秋天是一个五彩缤纷的秋天,秋姑娘让地上的生物穿上了五颜绿色的礼服,让它们去参加它的晚宴。有火红的高梁,好象一把把火焰。有绿色的甘蔗、金黄色的稻谷。一阵风拂过,就好象海浪在……
java基础知识11、List,Set,Map是否继承自Collection接口?存取元素时,有何差异?List,Set是继承Collection接口,Map不是。List:元素有放入顺序,元素……
我的烦恼小学作文600字四篇在日常生活或是工作学习中,大家都写过作文吧,作文是由文字组成,经过人的思想考虑,通过语言组织来表达一个主题意义的文体。那么问题来了,到底应如何写一篇优秀的作文呢?以下是小编为大……
描写小鲤鱼的小学作文400字我家养了两条小鲤鱼,一条是桔黄色的,鳍上点缀着细微的乳白色,另一条全身火红,在水底犹如一块红色的鹅卵石。它们就像一对朝夕相处的好朋友,每天不离左右。小鲤鱼在我家住了一段时……
看春节联欢会作文除夕之夜,守在电视机旁边看春节晚会已然成为现在每个家庭的习俗了。接下来小编搜集了看春节联欢会作文,仅供大家参考,希望帮助到大家。篇一:看春节联欢会作文寒假就像流水般匆匆而……
谁能通俗解释下,国资入股蚂蚁集团,代表着什么?防止资本野蛮生长,加强资本控制与导向,避免大而不能倒。第一、它的本身主要是金融公司,在有关钱财的方面,是一直会被监管的。第二、蚂蚁集团的发展已经开始不利于市场的稳定……
余额宝安全吗?你们都存了多少?感谢邀请,更感谢楼主的提问。楼主你好,余额宝安全吗?你们都存了多少钱呢?余额宝实际上已经问世很多年了,但是我个人使用的经验来谈这个问题,我觉得是非常安全的,而且支付宝他拥……
四年级作文雷雨四篇【导语】雨是一种常见的自然现象,但是夏天的雷雨来去匆匆,速度十分的快。以下是小编为大家搜集的四年级作文雷雨【四篇】,供大家参考。小学四年级作文雷雨一午后,我吃过中饭……
封车试解放双手智能汽车或许才是未来的正解随着国内新能源汽车市场蓬勃发展,近年来涌现出一批批产品力过硬的纯电车型。小鹏P5、比亚迪汉、特斯拉Model3、广汽AIONS等等一众新车型的出现,在竞争最为激烈的家轿细分赛道……
最新2020央视主持人大赛观后感5篇看央视主持人大赛感想《中央广播电视总台20xx主持人大赛》是中央广播电视总台成立后推出的第一个电视大赛,也是集合了总台优势制作和传播资源推出的一个创新型融媒体产品。观看央视主持人大赛,每位选手的选……
描写黄山怪石的作文导语:从黄山的玉屏楼向南望,只见一座山峰上堆着几块大石头。下面是小编整理的一些黄山的作文,欢迎查阅,谢谢!篇一:黄山怪石暑假的一天,我跟爸爸来到了ldquo;天下第一山r……
重阳节敬老作文在学习、工作或生活中,大家都写过作文,肯定对各类作文都很熟悉吧,写作文是培养人们的观察力、联想力、想象力、思考力和记忆力的重要手段。你知道作文怎样写才规范吗?下面是小编为大家整……
爷爷大概是在我上幼儿园时,他每天都去接送我,现在他已经是两鬓斑白了,带着一副看似古董样子的老花镜,一双很久没上油不发亮的皮鞋。我亲爱的爷爷。尽管他现在已经老的至于行走都不是件容易的……
一年级小学生写冬天的日记50字冬季已悄悄来临,它没有穿像秋天那样华丽的衣服,而是随便地穿上了一件白如雪的衣服,轻轻地来到大地。关于一年级小学生写冬天的日记内容详情如下。一年级小学生写冬天的日记50字……
花蕊小学生作文水培吊兰这个名字好耳熟呀!不禁让我想起我家的吊兰,翠绿而又不是很显眼的绿,种在花盆里,一支钩子让它垂吊在我家的阳台上,长长的枝条垂落下来,好似美少女那光泽的一头黑发。说到水培吊……
运动会作文400字4篇踏着秋天的气息,迈着轻盈的脚步,我们又迎来了运动会。下面是小编收集整理的运动会作文400字4篇,欢迎阅读参考!篇一:运动会作文400字今天周五是个大晴天,我们学校的秋季运……
给自己一次狂野作文800字四周很静,城市中特有的车鸣被隔绝在外。太阳已自向西沉下去了,天色有些暗。我走在学校的小道上,右手边是成片的树,左手边是一幢幢矮小的洗衣房。屋顶仍是用瓦砌成的,有些复古的建筑。这……
关于小学生军训作文400字集锦5篇无论是身处学校还是步入社会,大家总免不了要接触或使用作文吧,作文一定要做到主题集中,围绕同一主题作深入阐述,切忌东拉西扯,主题涣散甚至无主题。作文的注意事项有许多,你确定会写吗……
我们的心近了盼,盼什么?大山不语。盼万绿丛中一点红的美景吗?那一个个七彩缤纷的小精灵已悄然爬上你的双眉,为你装扮泛白的双鬓。盼雨后的彩虹吗?天空的云彩形状各异,雄鹰传递着春的消息。巍巍的大……