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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
相关文章
|
3月前
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
260 1
【Java】服务CPU占用率100%,教你用jstack排查定位
|
3月前
|
监控 安全 算法
在Linux中,cpu使用率过高可能是什么原因引起的?排查思路是什么?
在Linux中,cpu使用率过高可能是什么原因引起的?排查思路是什么?
|
3月前
|
消息中间件 Java 调度
一次线上服务CPU100%的排查过程
文章记录了一次线上服务CPU使用率达到100%的排查过程,通过使用top命令和jstack工具确定了导致高CPU使用的线程,并分析了Disruptor组件的不当配置是问题原因,通过修改组件的策略成功解决了问题。
58 0
|
3月前
|
Java
靠这三步就能排查CPU占用100%?
靠这三步就能排查CPU占用100%?
153 0
|
5月前
|
监控 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之使用自定义镜像部署GPU服务时,报错 "CPU is required but not provided",是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
缓存 弹性计算 监控
云服务器 CPU 使用率高的问题排查与优化
云服务器 CPU 使用率高的问题排查与优化
381 0
|
5月前
|
SQL Java Linux
Linux系统cpu飙升到100%排查方案
Linux系统cpu飙升到100%排查方案
405 0
|
6月前
|
SQL 运维 NoSQL
【Redis 故障排查】「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案
【Redis 故障排查】「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案
195 0
|
1天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
|
10天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
174 1

热门文章

最新文章