【线上问题】服务CPU彪高排查

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 后端程序员出去面试经常会有面试官喜欢问你有没有排查过线上问题,遇到后怎么排查的。


记一次CPU飙高问题排查


后端程序员出去面试经常会有面试官喜欢问你有没有排查过线上问题,遇到后怎么排查的,什么cpu飙高了,任务队列消息挤压了等等。


但是工作了两年多发现哪有这么多线上问题让你查,再加上又不是所有程序员所在公司都有saas服务,一般来说toc的企业的服务很少出现这种情况。由于我们的主线业务就是toc,所以每次在集成环境里出现这种问题得立马逮到把握住,毕竟面试常考题。


大家不要担心,看完这篇文章就算没排查过线上问题你也能说出个一二三四来。我总结排查CPU飙高主要就是三板斧。


事情是这样,我把上篇提到的redis stream当作服务于服务之间的消息通知组件搭了个demo,然后趁着有新功能版本发布到集成测试环境试了一波。果不其然上午发布下午就@我了。



第一板斧,查TOP


cpu高可以理解成计算机没有资源去处理用户新的事件了,通常表现为页面卡顿,请求一直处理中不返回结构。这时候登陆到对应服务器上直接用`TOP`命令看各个进程情况和负载情况。


top里的各个参数有兴趣可以深入了解下,包括load average平均负载zombie僵尸进程wa IO等待占用CPU的百分比0.0%。不过从这次这个例子中一眼就能看到其中一个Java服务的cpu使用率达到了快300%,显然是不正常的。


image.png


按c可以展示进程启动命令发现就是引入了消息流转的服务,厚礼蟹,cpu直接到快300%,不管这个现象跟卡顿有没有关系都要查一下为啥会出现这种情况。


top里定位到异常进程复制PID,输入top -Hp pid查看该进程下所有的线程信息。


image.png


一看排在第一位的哪个线程消耗的cpu也是最高,复制pid,用`printf "%x"线程pid` 拿到16进制的线程号。


image.png


第二板斧,查堆栈


再用jstack命令搜一下线程信息,jstack 异常进程的pid | grep "16进制线程号"


image.png

其实这里就已经能看出来了,lettuce线程,springboot2.3之后默认的redis客户端从redission改为了lettuce,肯定是跟redis相关的


但其实到这里我还是没反应过来,用jstack -l pid > dump.txt导出堆栈信息,用https://fastthread.io/(非常好用的jvm堆栈分析网站) 又是一顿分析。一直怀疑是因为上次迭代升级springboot版本导致的。


后来找东找西都没有头绪,又一顿分析日志发现都卡在epoll这里,了解些io的都是到这是多路复用接口搁那轮询处理io事件的,又联想起为了适配redis stream的java api升springboot版本,终于定位到了。


第三板斧,查代码


@Bean("listenerContainer")
@DependsOn(value="redisConnectionFactory")
publicStreamMessageListenerContainer<String, ObjectRecord<String, Object>>init() {
StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, Object>>options=StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder()
        .batchSize(10)
        .serializer(newStringRedisSerializer())
        .executor(newForkJoinPool())
        .pollTimeout(Duration.ofSeconds(2)) 
        .targetType(Object.class)
        .build();
returnStreamMessageListenerContainer.create(redisConnectionFactory, options);
 }


设置StreamMessageListenerContainer的时候,有一项pollTimeout(Duration.ofSeconds(2)),`向redis不断poll数据的时间延迟,单位为s`,我当时想着要什么延迟,0就完事了,一直搁那监控数据就完了,有数据就拿回来。


小改成2s,一套打包连招放服务器上一测。



image.png

280%降到2.6%




总结


这样一来以后面试官问有没有解决过cpu飙升的问题就不虚了,先来一套丝滑连招


1. 去服务器top命令查看进程资源情况,top -Hp pid查看异常进程里的线程详情

2. 复制pid,用`printf "%x"线程pid` 拿到16进制的线程号,jstack pid | grep 16进制线程

3. 分析代码



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
安全 Windows
一次简单的服务器 cpu 占用率高的快速排查实战
一次简单的服务器 cpu 占用率高的快速排查实战
|
5月前
|
Arthas 测试技术
Arthas排查生产环境CPU飚高问题
Arthas排查生产环境CPU飚高问题
Arthas排查生产环境CPU飚高问题
|
8月前
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
1346 5
|
3月前
|
监控 Java Linux
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
疯狂飙高!怎么排查CPU导致系统反应缓慢的问题?
|
4月前
|
弹性计算 Linux 数据安全/隐私保护
Linux【问题记录 01】阿里云CPU使用率 100% ECS 同时连接数峰值 25k+ 问题排查无果(附阿里云重新初始化云盘详细步骤)
Linux【问题记录 01】阿里云CPU使用率 100% ECS 同时连接数峰值 25k+ 问题排查无果(附阿里云重新初始化云盘详细步骤)
119 0
|
6月前
|
Java 调度
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
文章主要讨论了服务器中常见性能问题的一些排查思路,这篇文章主要讨论了CPU负载过高,频繁GC和频繁切换上线文这三个问题。
308 0
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
|
7月前
|
Java 调度
CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?
面试过程中,场景类的问题更容易检测出一个开发人员的基本能力。这不,有一位小伙伴去阿里面试,第一面就遇到了关于“CPU 飙高系统反应慢怎么排查”的问题?当时这位小伙伴不知从何下手。 今天,我给大家分享一下我的解决思路。
109 0
|
8月前
|
Java
CPU飙升排查
CPU飙升排查
|
8月前
|
监控 Java
【线上问题排查】CPU100%和内存100%排查
【线上问题排查】CPU100%和内存100%排查
117 1
|
9月前
|
Arthas 存储 运维
记Arthas实现一次CPU排查与代码热更新
线上代码经常会出现CPU占用过高的情况,按以往经验我会使用top指令,进一步借助于jstack去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,即使是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下Arthas,说是可以进行代码的热更新操作,正好来试一下。
355 0