• 项目背景:

将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%的排查与优化相关推荐

  1. 原创|面试官:线上服务器CPU占用率高如何排查定位问题?

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  2. 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...

    面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...

  3. 面试官:线上服务器CPU占用率高如何排查定位问题?

    开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...

  4. 线上服务器CPU占用率高如何排查定位问题?

    (关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...

  5. 服务器cpu占用率高怎么解决,线上服务器CPU占用率高怎么办?

    如果线上服务器发生CPU占用率高时,应该如何排查并定位问题. 1.问题发现 本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题. 在每次大促之前,我们的测试人员都会对网站 ...

  6. 线上服务器CPU负载过高的问题解决过程

    线上服务器CPU负载过高的问题解决过程 一.找到CPU占用过高进程 执行top命令,发现PID为12443的Java进程占用CPU高达350%,出现故障. 二.定位具体线程或代码 找到该进程后,接下来 ...

  7. 线上服务器CPU占用过高?7步带你搞定

    一. 前言 在Java开发岗位的面试中,时不时会出现一些运维类的题目,其实这也反映了后端面试的一种趋势.现在企业对后端开发的要求越来越全面,不仅要求我们会写代码,还要我们能够进行部署和运维. 今天壹哥 ...

  8. 线上告警CPU使用率过高排查分析

    本文主要列举了如下几种可能造成CPU过高的场景进行排查分析. 1.代码死循环 启动了两个线程(线程一定要起一个合适的名称,出了问题时方便排查),一个线程空循环,一个线程每500ms循环一次. publ ...

  9. ECS服务器CPU使用率异常100%问题排查

    服务器莫名其妙的出现了CPU使用率100%,而且top.htop等一些命令,都无法查询到消耗CPU,这时会陷入到困境,是什么消耗了CPU资源? 可以参考以下的方式,进行分析排查,确定问题原因. 1.在 ...

最新文章

  1. sys.argv[]学习
  2. 分布式系统理论基础1: 一致性、2PC和3PC
  3. Unet项目解析(1): run_training.py
  4. uniapp的目录结构反思与整理 app.vue【base】pages.json【配置】main.json【框架入口文件】
  5. CentOS 下多线程下载工具:axel
  6. C#合并文件夹图片列表 自定义排版顺序
  7. C# message简单实现窗口间信息接收与发送
  8. linux下的shell多线程用法,shell多线程操作
  9. 笔试编程题常用的一些技巧方法
  10. 20175213 2018-2019-2 《Java程序设计》第3周学习总结
  11. (原创)c#学习笔记03--变量和表达式03--变量04--变量的声明和赋值
  12. 迅雷禁止更新设置方法【禁止升级】【禁止更新】
  13. 芝麻开门-如何解决电脑PIN码忘记了不能登录问题
  14. 自我觉察-4:觉察“不浪费食物”和“胃过饱食”的信念
  15. docker命令总结
  16. vscode常用插件-Auto Close Tag
  17. Wannafly挑战赛26 御坂网络
  18. win11家庭版如何彻底关闭病毒实时保护
  19. 京东云对话Cloudflare:畅谈更懂产业的云与未来科技趋势
  20. 如何对pdf进行编辑修改linux,Xournal: 随心编辑PDF

热门文章

  1. 区块链APP怎么开发?深入分析
  2. java 设置纸张大小设置_java 用itext设置pdf纸张大小操作
  3. 微信支付宝网站二维码收款个人免签收款接口代搭建
  4. Windows CMD命令添加开机启动项
  5. Delphi中打开网页连接的几种方法
  6. Java实现中文名字排序
  7. Vue.js 响应式原理
  8. 如何在SYSTEM权限下实现屏幕监控
  9. Linux——服务器文件备份(一)
  10. 还弄不懂相对路径和绝对路径,这篇文章带你简单剖析