排查实时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竟然没做成事件驱动,反而是阻塞式,这不明显是挖坑让人跳么?
排查实时tail功能cpu占用过高问题的更多相关文章
- 记一次用arthas排查jvm中CPU占用过高问题
记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...
- 一次java Cpu占用过高的排查
某一个项目CPU占用率一直很高,经常在40%-50%之间,最近比较闲,就开始了排查工作. 1.通过 jstack命令输出进程的堆栈信息 jstack 2788 >C:\log.txt 将堆栈信息 ...
- java 一次CPU占用过高问题的排查及解决
最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID ...
- 性能优化-CPU占用过高问题排查
1. 性能优化是什么? 1.1 性能优化就是发挥机器本来的性能 1.2 性能瓶颈在哪里,木桶效应. CPU占用过高 1.现象重现 CPU占用过高一般情况是代码中出现了循环调用,最容易出现的情况有几 ...
- 【笔记】排查CPU占用过高
本文是该教程视频的笔记 https://www.bilibili.com/video/BV15T4y1y7eH 1. 问题演示 将演示项目打包放到服务器运行 执行 curl http://localh ...
- kswapd0 进程CPU占用过高
前几天遇到的一个问题,自己本地用VM配置的虚拟机,一般会top查看进程以及CPU占用的一些情况.又一次用laravel 打印对象,里面的内容比较多,浏览器当时就卡了. 然后看进程的情况.我以为会是ng ...
- Android去除CPU占用过高时屏幕四周闪红框
话说有些时间没有更新博客了,今天正好解决这个问题,顺便把它记录下来.. 今天遇到的情况是这样的,当CPU占用过高时,屏幕四周会出现一个红框. 闪一次两次算了,但是挺萌的(TMD)不停的闪,我的钛合金狗 ...
- 性能测试问题_Mysql数据库服务器的CPU占用很高
MySQl服务器CPU占用很高 1. 问题描述 一个简单的接口,根据传入的号段查询号码归属地,运行性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引 ...
- Atitit. 最佳实践 QA----减少cpu占有率--cpu占用太高怎么办
Atitit. 最佳实践 QA----减少cpu占有率--cpu占用太高怎么办 跟个磁盘队列长度雅十,一到李80%走不行兰.... 1. 寻找线程too 多的.关闭... Taskman>> ...
随机推荐
- js时间日期格式
Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month &quo ...
- 7.29NOIP模拟赛
7.29NOIP模拟赛 T1 YSG (1s,64MB,ysg.in,ysg.out) 描述 ysg,yxy,azw 三人正在刷题. 他们每做一题的时间都是一个有理数. 如果在某一时刻,三人同时做完一 ...
- flume ng 1.3 安装(转)
http://blog.csdn.net/hijk139/article/details/8308224 业务系统需要收集监控系统日志,想到了hadoop的flume.经过试验,虽说功能不算足够强大, ...
- 我和我的广告前端代码(六):webpack工程合并、也许我不需要gulp
随着年初开始使用webpack重构公司的广告代码,已经有将近一年的时间了,需求也渐渐的稳定了.我想也是时候将这几个工程整理一下,顺带着处理一些历史问题. 由于当年各个业务线没有整合.需求也没有固定,考 ...
- 移动端flex自适应方案。(px to rem)
define(function (require, exports, module) { exports.mobileUtilMethod = function () { (function (e, ...
- 小白袍 -- Chapter 1 Java中的Encode与Decode
前几天做一个邮件发送功能,一些常用信息配置在properties文件中,通过prop.getProperty(key)来获取配置的信息,结果配置文件中是用中文写的,邮件发送成功后,邮箱中的激活链接是乱 ...
- 简析--HashCode
内容转载自:http://www.cnblogs.com/szlbm/p/5806226.html 哈希表 在了解HashCode之前,我们先来认识一下哈希表; 散列表(Hash table,也叫哈希 ...
- SpingMVC前置控制器过滤问题
/<servlet-mapping> <servlet-name>Springmvc</servlet-name> <url-pattern>/< ...
- JavaScript 表单处理
表单对象的属性 name action method encoding target elements 表单对象的方法 submit reset 表单元素事件 文本域事件:onFocus(获得焦点) ...
- 第十四届浙江财经大学程序设计竞赛重现赛--A-A Sad Story
链接:https://www.nowcoder.com/acm/contest/89/A 来源:牛客网 1.题目描述 The Great Wall story of Meng Jiangnv’s Bi ...