一次线上服务器cpu使用率超过1250%的排查与优化
- 项目背景:
将35家海外酒店的房型数据通过40个定时任务同步到本地mongodb,这里用了5台服务器来部署项目,mongodb采用分片集群部署。定时任务采用lts,一个小时同步一次所有数据。项目中用多线程按天来同步35家酒店的365天的数据,高峰期可能会同时存在几百个线程在同时处理任务,项目上线之后mongodb服务器就出现问题了。
- 项目服务器部署架构:
先来看一下运维反馈的服务器cpu监控图:
上图是3台mongodb分片部署的服务器cpu使用率,9:00左右大量的定时任务开始执行,此时cpu使用率就开始飙升。
第一次优化:
给mongodb数据库加索引,但是效果不佳,此时的cpu使用率还是很高。
第二次优化:
给mongodb数据库加分片键,由于mongodb是分片集群部署的,所以此时可以充分利用机器的优势来更新、删除mongodb数据,此时的效果有一些,但是不是很好。
此时还是会一段时间内cpu使用率很高的情况,但是比之前好多了。
第三次优化:
1.在代码中加入监控,观察比较耗时的代码模块以便排查问题所在。
下面是慢查询日志
从代码监控和mongodb的慢查询日志来看,删除一条数据居然需要花费4秒钟,导致cpu飙升的应该是删除旧数据时候的查询比较耗时,由于删除的频率比较高,导致cpu一直在执行。
此时考虑到应该是两个地方不足:
a.索引没有被利用到,需要重建索引。
b.删除比较频繁、耗时,不能影响到主程序的执行,应该把删除逻辑放入kafka队列中执行。
2.程序优化如下:
a.重建更新和删除索引。
b.将主程序的删除操作改成逻辑删除,标记需要删除的数据,放入kaka队列。
c.新建定时任务,在23:59:59批量删除标记的数据。
经过优化之后明显的能看到,每个线程的更新mongodb的逻辑耗时明显减少
此时,cpu的使用率从最开始的1250%回归到正常状态,从7月4号12点之后cpu使用率正常,磁盘的使用率也回归正常,显然此次优化效果显著。
总结:
1.mongodb删除操作比较耗时,应当将删除操作剥离主程序执行并建立合理的索引。
2.在代码中加入耗时监控可以更加准确的定位到问题所在。
以上是因为已经定位到代码中的哪个地方导致cpu使用率超高,一般的定位代码导致cup过高的方法如下:
- 通过top命令找到cpu占用高的进程pid
这里进程号为21038占用cpu过高
- top -H -p 进程号Pid(通过进程号找到该进程下占用cpu过高的线程号)
top -H -p 21038
这里线程号为21125占用cpu过高
- printf "%x\n" 线程号Pid(将线程号Pid转换为16进制)
printf "%x\n" 21125
- jstack 进程号|grep 16进制线程号 -A50 (-A50 日志最后50行)
jstack 21038|grep 5285 -A50
定位到代码中,发现代码中有个死循环,导致该线程一直抢占cpu。
一次线上服务器cpu使用率超过1250%的排查与优化相关推荐
- 原创|面试官:线上服务器CPU占用率高如何排查定位问题?
国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...
- 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...
面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...
- 面试官:线上服务器CPU占用率高如何排查定位问题?
开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...
- 线上服务器CPU占用率高如何排查定位问题?
(关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...
- 服务器cpu占用率高怎么解决,线上服务器CPU占用率高怎么办?
如果线上服务器发生CPU占用率高时,应该如何排查并定位问题. 1.问题发现 本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题. 在每次大促之前,我们的测试人员都会对网站 ...
- 线上服务器CPU负载过高的问题解决过程
线上服务器CPU负载过高的问题解决过程 一.找到CPU占用过高进程 执行top命令,发现PID为12443的Java进程占用CPU高达350%,出现故障. 二.定位具体线程或代码 找到该进程后,接下来 ...
- 线上服务器CPU占用过高?7步带你搞定
一. 前言 在Java开发岗位的面试中,时不时会出现一些运维类的题目,其实这也反映了后端面试的一种趋势.现在企业对后端开发的要求越来越全面,不仅要求我们会写代码,还要我们能够进行部署和运维. 今天壹哥 ...
- 线上告警CPU使用率过高排查分析
本文主要列举了如下几种可能造成CPU过高的场景进行排查分析. 1.代码死循环 启动了两个线程(线程一定要起一个合适的名称,出了问题时方便排查),一个线程空循环,一个线程每500ms循环一次. publ ...
- ECS服务器CPU使用率异常100%问题排查
服务器莫名其妙的出现了CPU使用率100%,而且top.htop等一些命令,都无法查询到消耗CPU,这时会陷入到困境,是什么消耗了CPU资源? 可以参考以下的方式,进行分析排查,确定问题原因. 1.在 ...
最新文章
- sys.argv[]学习
- 分布式系统理论基础1: 一致性、2PC和3PC
- Unet项目解析(1): run_training.py
- uniapp的目录结构反思与整理 app.vue【base】pages.json【配置】main.json【框架入口文件】
- CentOS 下多线程下载工具:axel
- C#合并文件夹图片列表 自定义排版顺序
- C# message简单实现窗口间信息接收与发送
- linux下的shell多线程用法,shell多线程操作
- 笔试编程题常用的一些技巧方法
- 20175213 2018-2019-2 《Java程序设计》第3周学习总结
- (原创)c#学习笔记03--变量和表达式03--变量04--变量的声明和赋值
- 迅雷禁止更新设置方法【禁止升级】【禁止更新】
- 芝麻开门-如何解决电脑PIN码忘记了不能登录问题
- 自我觉察-4:觉察“不浪费食物”和“胃过饱食”的信念
- docker命令总结
- vscode常用插件-Auto Close Tag
- Wannafly挑战赛26 御坂网络
- win11家庭版如何彻底关闭病毒实时保护
- 京东云对话Cloudflare:畅谈更懂产业的云与未来科技趋势
- 如何对pdf进行编辑修改linux,Xournal: 随心编辑PDF