线上服务 CPU 负载过高问题排查

当遇到服务器CPU负载异常升高时,可以通过`top`命令定位问题服务,如文中示例展示了如何使用Arthas在Docker容器中诊断Java应用,通过`dashboard`和`thread`命令找到高CPU使用线程并分析其调用栈。文章还提到了常见的CPU问题场景,如死循环、频繁GC等,并推荐使用Prometheus进行系统资源监控。

CPU 负载过高,在开发过程中每个人都或多或少遇到,在系统未部署正式环境时,看日志或打断点总会有办法解决掉。但总有些BUG的出现会给你意外惊喜,即使已在测试环境做了尽可能多的测试,依旧无法避免,其中有一种就是服务器CUP突然异常负载过高。本文重点叙述在线上环境排查该问题思路。

定位问题服务

CPU 负载过高,给用户的直观感受就是服务卡顿,响应时间边长,甚至严重一点整个服务网页崩溃,无法工作。特别是我们目前基于容器的部署并没有设置容器最大可用CPU数,整个服务器也没有部署系统资源监控时,这种问题一旦发生,就会影响到服务器上所有的服务,很难知道这个问题是哪个服务引起的。因而有了下文中这种基于top命令的排查方式:

top 命令可以列出该服务上目前所有的应用进程,并根据 CPU 使用进行排序,使用c 可以列出该进程启动命令,根据该命令是那个服务,如下图所示(正常情况下异常 CPU 进程会排在第一位置,我并不想将服务器搞崩,只是简单模拟了下)。
img
注意:使用 top 命令监控的方式查看服务器进程,是比较原始的方式,建议有条件的,还是搭建一套资源监控系统。开源中已有了很多优秀的软件,Prometheus 就是其中的一种,集监控和报警一体,通过监控日志,不仅可以排查问题还可以发现服务器的压力分布,以及周期性的规律。在此基础上实现资源的调整分配,让服务器的资源得到最大化的利用。除了这些之外,其还有更多的能力,就不再此说明了。有兴趣的同学可以参考网址:https://prometheus.io/

排查引发异常的进程

根据上文的问题服务定位,发现是一个名为 app Java 的服务导致的,现在就对该服务进行解剖,找出导致CPU 异常的进程。因为该台服务器上的服务是我部署的,根据名字我很清楚的知道该服务是一个封装在 docker 容器中的程序。如何在容器中定位问题成了问题,幸好已有公司将该类工具开源了出来,阿里的 Arthas 登场(java 自带的诊断工具也是非常好的,但是本人用起来感觉还是比较繁琐)。

步骤1:将 Arthas 放入docker 镜像中
具体的 Dockerfile 文件如下,注意开头依赖的基础镜像为 openjdk:8-jdk-slim。

FROM openjdk:8-jdk-slim
# 环境变量
ENV WORK_PATH /opt/arthas

EXPOSE 8080
VOLUME ["/usr/share/senn", "/tmp/data"]
# 编译时变量
ARG JAR_FILE
ADD target/${JAR_FILE} /usr/share/senn/app.jar
#COPY
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

WORKDIR $WORK_PATH
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

# ENTRYPOINT
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom"]
CMD ["-jar", "-Xmx512m", "/usr/share/senn/app.jar"]

说明:整个 Dockerfile 中有个非常重要的点就是基础镜像 openjdk 版本选择,我们常用的有以下三种:

  • 8-jre-slim:jre 的瘦身版本,去掉了UI、键盘、鼠标相关的库,适合服务端应用使用,支持自定义时区,只提供 java 运行时环境,71.13MB。
  • 8-jdk-alpine:基于极简 alpine linux 的jdk 版本,因为极简,所以不支持自定义时区,只能用UTC 时间,70.67MB。
  • 8-jdk-slim:jdk 的瘦身版本,去掉了UI、键盘、鼠标相关的库,适合服务端应用使用,支持自定义时区,132.76MB。

通过以上对比发现最适合使用的版本 8-jdk-slim,Arthas 需要 Java 开发工具包的支持,8-jre-slim弃用;国内时间和 UTC 相差 8个小时,对于不要求使用国内时间的可以使用,如果对国内时间敏感,8-jdk-alpine 只能放弃。

步骤2:进入容器运行 Arthas
Arthas 是一个 java 程序,看上面的Dockerfile 不难发现,该应用程序只是 copy 到了镜像中,出于对减少资源的考虑,并未运行起来,在我们需要其为我们诊断java 程序的时候需要进入程序运行起来,像运行所有 jar 包一样执行就可以。

docker exec -it <容器id> bash

img
img
步骤3:查找 CPU 使用最多的线程
Arthas dashboard 命令提供了一个可是化的看板,清晰的列出服务中各个线程使用的 CPU 率。如下图所示,该服务中使用最多 CPU 的线程是 main。
img
步骤4:分析线程
通过上文我们获取到该服务使用CPU 最多的线程是 main 其 id 是1,通过 thread 命令分析该线程调用栈,发现是InfiniteLoop 类下的 creatLoop 方法导致的 CPU 升高。
img
步骤5:反编译
使用 jad 命令对 nfiniteLoop 类反编译后发现,creatLoop 方法是一个死循环,至此找到了罪魁祸首,处理了该问题即可。
img
说明:当到反编译这里可能有存在疑问,都发现了具体出问题的类和方法还有必要反编译吗?有的,正式环境的代码可能和你想像的不一样。

  • 版本差异,最常出现,因为合并代码等原因,你写的正确代码可能并没有被发布到线上,这时就需要通过反编译来检查。
  • 异常值,线上有些bug 时因为数据导致的,在测试环境又无法复现,就需要监测线上的变量,这些变量可能时代理出来的对象,就需要使用反编译的方式,找处理,使用 watch 命令去监控。

总结

通过上文的描述,详细叙述了一个 CPU 异常升高的排查过程。本文中只是用程序模拟了最简单死循环场景,现实的功能要远比整个复杂的多,但大体的解决思路差不多。最常见的 Java 程序导致CPU 问题的场景一般有以下几种:

  • 死循环,一直占有cpu 资源
  • 频繁的GC,如果访问量很高,或者程序本身有内存泄漏,都会导致频繁的GC甚至FGC
  • 序列化和反序列化太多会导致CPU使用率升高,在程序日志中这种问题最常见,线上日志最好定义为 Error级别。

参考资料:
https://prometheus.io/
https://cloud.tencent.com/developer/article/1453353
https://arthas.aliyun.com/doc/quick-start.html#watch

检察院行业整体方案摘要在探讨检察院行业的整体解决方案时,一个全面而效的视频应用体系显得尤为重要。该体系不仅涵盖了基础视频应用的多个方面,还紧跟视频应用的新动态,并融入了前沿的视频应用新技术,为检察院的日常工作带来了革命性的变化。一、基础视频应用:构建全方位监控与沟通体系基础视频应用是检察院视频解决方案的基石,它集成了视频监控、视频会议、同步录音录像、远程接访、远程提讯、案件讨论、侦查指挥及监所联网等多项功能,形成了一个全方位、多层次的监控与沟通网络。在视频监控方面,清监控与实时调看功能确保了检察院内外环境的清晰可见,录像存储与平台联网则实现了监控数据的长期保存与远程访问,为安全防范提供了有力支持。视频会议系统则通过多点会议、会控管理及网络优化,实现了检察院内部及与外部机构的效沟通,数字录播功能更是让重要会议得以永久保存,便于后续查阅与分析。同步录音录像功能在检察工作中同样不可或缺,它实现了画面合成、录音录像、电子笔录及光盘刻录的一体化操作,确保了执法过程的全程记录与可追溯性。远程接访与远程提讯则打破了地域限制,使得检察院能够更加便捷地接待群众来访与开展提讯工作,提了工作效率与服务质量。案件讨论与侦查指挥功能则进一步提升了检察院的决策与执行能力。通过会议讨论、快速检索、实时录像及电子会签,检察院能够迅速形成案件处理意见,并借助快速决策、即时通讯、远程指导及协同审讯等手段,确保侦查工作的顺利进行。监所联网功能则实现了对监所的统一管理与资源互通,提升了监管效率与安全性。二、视频应用新动态:探索更效、智慧、集中的管理模式随着技术的不断进步,视频应用在检察院行业中也呈现出新的发展动态。监视居住、智能同录及视频中心等新概念的提出,标志着视频应用正朝着更效、更智慧、更集中的方向发展。监视居住系统通过整合清审讯与智能安防设备,实现了对犯罪嫌疑人的全方位监控与安全防范。全景清摄像机、保真拾音器及审讯主机的应用,确保了审讯过程的清晰记录与可追溯性。同时,智能安防系统的引入,如紧急报警联动、双向门禁联动等,进一步提升了办案环境的安全性。智能同录系统则通过集中刻录、智能刻录及便捷操作和管理,实现了审讯录像的效处理与长期保存。人员轨迹录像功能更是对犯罪嫌疑人行走轨迹的全程定位跟踪,以及办案人员人数的实时监测,有效规范了执法办案行为。此外,安全存储措施如扩展U盘或移动硬盘录像、录像哈希值加密及后台数据云存储等,确保了审讯数据的安全性与不可篡改性。视频中心作为视频应用的新亮点,通过集中调度、级联整合及集中联网等技术手段,实现了会议与监控的数字互通与资源共享。这不仅提升了检察院的工作效率与协同能力,还为业务大数据分析提供了丰富的视频资源支持。三、视频应用新技术:引领便捷、效、智慧的未来趋势在视频应用新技术方面,云视讯、无线4G+及智能应用等前沿技术的引入,为检察院行业带来了前所未有的便捷与效。云视讯平台通过公有、私有或公私混合的部署方式,提供了超大容量、动态资源池及虚拟化集群化的服务能力。云MCU集群化部署与双模混合会议技术的运用,使得会议资源得到更加灵活效的配置与利用。同时,多类型终端接入的支持,如会议室环境、固定办公环境、移动办公环境及监控联动环境等,满足了检察院在不同场景下的视频通讯需求。无线4G+技术的应用则进一步拓展了视频监控的边界。通过4G移动应用产品如移动车载设备、便携移动套包、数据采集工作站及统一管理平台等,检察院能够实现对移动目标的实时监控与数据采集。移动单兵与移动车载设备的引入,更是让执法人员在现场能够迅速获取清视频信息,提升了执法效率与响应速度。智能应用方面,基础智能功能的加入如区域进入/离开检测、警戒线设置、视频虚焦/遮挡检测及人脸检测等,为视频监控提供了更加精准的分析与预警能力。后端人员比对与前端人员抓拍技术的应用,则进一步提升了人员识别的准确性与效率。此外,环境数据采集功能的加入,如温湿度信息、红外探测及烟雾探测等,为检察院提供了更加全面的环境监控手段,确保了工作环境的安全与舒适。综上所述,检察院行业的视频应用体系正通过基础视频应用的完善、新动态的探索及新技术的引入,不断推动着检察院工作的智能化、效化发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值