排查实时tail功能cpu占用过高问题
“你的python应用cpu占用快90%了!!!”,良哥朝我眨了眨布满血丝的眼睛
“不会吧”,我心想:我这是好的啊
没接触过kafka的同学可以先了解下:([http://www.jasongj.com/2015/03/10/KafkaColumn1/])
SSH到远程机器上,运行top命令看一下,果然平常4%不到的cpu占用,现在飙升到90%左右了。
这是一个简单的应用:server端从kafka读消息,通过websocket发送到client端,整个server端代码也就几百行。
那就直接看代码吧。
由于线上环境的kafka没有开放端口,我是在本地搭的kafka环境,所以为了快速开发,就在server端直接写了一个kafka生产者,向kafka提交消息。因此,
猜想1: 难道是不小心把kafka生产者的代码也提交上去了?
check最新代码,生产者的代码明显被注释掉了,并没生效。
猜想2:websocket与server端链接太多了?
不可能,这个功能目前还没开始公测,而且只有这一个server cpu占比过高。
那还是server和kafka之间出现了问题。
server端会在每个请求到来时创建一个websocket连接,同时创建一个kafka消费者线程,用来监听特定topic的消息。
client端与server端的websocket会在用户刷新页面或者关闭页面时断开连接,这个不会有问题。那问题有可能出在:创建的kafka消费者线程没有正确地退出。
每个python线程会有一个daemon属性,默认为False。python主线程会在所有daemon为False的线程退出后才终止,而daemon为True的线程(也就是后台线程)会在主线程退出时一起退出。
所以无论如何,每次发布时都是重启整个进程,不会有资源回收失败的问题。
那就是在server运行时创建了过多的kafka消费者线程。
验证一下,打开pycharm的并发状态检测开关并启动server,新开一个页面,连续刷新几次,pycharm里就可以看到刚才创建的线程活的好好的!!!
那来看看kafka消费者线程在干什么。
kafka消费者线程负责:
连接kafka 向websocket连接写入消息
祭出debug神器:断点
根据多年打断点的经验,果断滴选择了“获取消息”。
经过一段时间的调试,原来是kafka-python从kafka获取消息时会进入无限while循环,从而阻塞线程。
既然弄明白了问题的来龙去脉,解决起来就容易了。
首先看kaka-python有没有异步api,在官方文档里找了一圈,并没有,最后发现
,利用异常我们可以跳出while循环,从而有机会结束当前线程。大致代码如下:
class ConsumerThread(Threading.thread): def fetchMsg(self): for message in self.consumer: if self.stopThread: break message_value = message.value socket.pubsub(message_value) else: logger.error(consumer timeout) if not self.stopThread: self.fetchMsg() else: self.consumer.close()
连接kafka的kafka-python竟然没做成事件驱动,反而是阻塞式,这不明显是挖坑让人跳么?
60-微服务技术栈(高级):在线检测工具Arthas(实现CPU排查与代码热更新) 线上代码经常会出现CPU占用过高的情况,按以往经验我会使用top指令,进一步借助于jstack去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,即使是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下Arthas,说是可以进行代码的热更新操作,正好来试一下。
再一次生产 CPU 高负载排查实践 前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨。 其实早在去年我也处理过类似的问题,并记录下来:《一次生产 CPU 100% 排查优化实践》 不过本次问题产生的原因却和上次不太一样,大家可以接着往下看。
CPU高使用率排查 Java程序在实际生产过程中经常遇到所在服务器CPU使用率高的问题,那么应该如何排查问题的原因呢,本文大概描述一下排查方法,作为一个排查手册。
相关文章
- SQL 开发任务超 50% !滴滴实时计算的演进与优化
- Linux rsync同步操作和inotify实时同步 、 Cobbler装机平台 (SERVICE06—-DAY21)[通俗易懂]
- Typecho Handsome 主题显示实时在线人数
- 实时数仓方案五花八门,实际落地如何选型和构建!
- Cpu指令重排_cpu的指令集
- vue.js客服系统实时聊天项目开发(十四)点击加载展示历史消息列表
- 过高MongoDB CPU 利用率过高问题排查(mongodb占用cpu)
- Linux进程实现CPU绑定功能(linux进程绑定cpu)
- 继华为后,小米开始内测小爱同学 AI 字幕:实时翻译外语原声视频和直播
- 基于Linux的实时运行状态监控平台(linux监控平台)
- 深入浅出:Linux线程绑定CPU(linux线程绑定cpu)
- Linux查看CPU详解:如何掌握CPU信息?(linux查cpu)
- 占用过高分析并解决Oracle 进程CPU占用过高问题(oracle进程cpu)
- 利用Oracle极大发挥多核CPU性能(oracle多核cpu)
- 占用MSSQL的CPU占用情况分析(mssql 查看cpu)
- 解决mysql连接CPU乱码问题(cpu连接mysql乱码)
- 如何连接CPU与MySQL(cpu怎么连接mysql)
- Oracle购买了两块CPU以增强性能(oracle买了两cpu)
- 实时使用Redis队列判断技能(redis队列判断)
- Redis过期监听改善实时应用效率(redis过期监听的应用)
- 调度Redis请求等待CPU调度之路(redis请求等待cpu)
- 实时信息交互Redis 订阅关系(redis 订阅关系)
- Oracle数据库服务器CPU配额(oracle cpu配额)
- 使用Oracle CPU,提高运算效率吧(oracle cpu用户)