0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

线上机器CPU占用高分析实践

京东云 来源:京东零售 王江波 作者:京东零售 王江波 2025-02-18 14:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:京东零售 王江波

1. 线程运行状态

1.1 total

wKgZO2e0K4iAUWSmAAPq2vdj1K0085.png



1.2 timed_waiting

wKgZPGe0K4mAXzE4AAMUL7ckbRY633.png



wKgZO2e0K4qAKhnsAAEfBtxpT6g700.png



通过上图我们可以发现timed_waiting的topN线程都是查询国补资质的。

1.3 waiting

wKgZPGe0K4uAEqx2AAIxDoYW2JQ568.png



wKgZO2e0K4uAEslDAALKeLlm70w870.png



通过上图我们可以发现waiting的topN线程都是查询国补活动的。

1.4 线程分析

下面我们分析上述两种状态:

1. WAITING 状态

定义:当一个线程处于 WAITING 状态时,它在等待另一个线程的特定操作(如通知或中断),并且不会继续执行。

触发条件:线程进入 WAITING 状态的常见情况包括:

调用 Object.wait() 方法:线程在等待某个对象的监视器(锁)被其他线程通知。

调用 Thread.join() 方法:等待另一个线程完成。

调用 LockSupport.park() 方法:线程被阻塞,直到它被其他线程唤醒。

恢复:线程在 WAITING 状态下将一直保持此状态,直到其他线程调用 notify() 或 notifyAll()(对于 Object.wait()),或者被中断。

2. TIMED_WAITING 状态

定义:当一个线程处于 TIMED_WAITING 状态时,它在等待某个条件的发生,但它会在指定的时间后自动返回。

触发条件:线程进入 TIMED_WAITING 状态的常见情况包括:

调用 Thread.sleep(milliseconds):线程休眠指定的毫秒数。

调用 Object.wait(milliseconds):线程在等待某个对象的监视器(锁),并且在指定的时间内等待。

调用 Thread.join(milliseconds):等待另一个线程完成,但有时间限制。

调用 LockSupport.parkNanos() 或 LockSupport.parkUntil()。

恢复:线程在 TIMED_WAITING 状态下会在指定的时间结束后自动恢复,或者在其他线程调用 notify() 或 notifyAll() 时恢复。

| 状态           | 描述                                     | 触发条件                                    | 恢复方式                                   |
|----------------|------------------------------------------|---------------------------------------------|--------------------------------------------|
| **WAITING**    | 线程等待另一个线程的特定操作,不会继续执行 | `Object.wait()`, `Thread.join()`, `LockSupport.park()` | 其他线程调用 `notify()`/`notifyAll()` 或被中断 |
| **TIMED_WAITING** | 线程等待某个条件的发生,但有时间限制   | `Thread.sleep(milliseconds)`, `Object.wait(milliseconds)`, `Thread.join(milliseconds)` | 超过指定时间后自动恢复,或其他线程调用 `notify()`/`notifyAll()` |

下面我们结合实际代码情况分析:

wKgZPGe0K42ALX4tAAPnywM_5ZI317.png



上文中 queryActTp 为 getActivityInfo 执行并发任务,其中包含两个子任务、 queryQualityTp 为 getQualityInfo 执行并发任务,其中五个子任务。同时将这俩任务放到queryActAndQualityTp中并行。

getActivityInfo所在的秒级监控如下:

wKgZO2e0K46AE1-PAAIoNZXJJLE768.png



getQualityInfo所在的秒级监控如下;

wKgZPGe0K4-AT78sAALfDAaj9hY787.png



上文中同样的调用方式,但是出现了两种线程状态,理论上应该都是TIMED_WAITING。针对queryActTp我们可以发现堆栈信息中也是LockSupport.park而不是LockSupport.parkNanos。具体原因有待进一步分析。

上述代码中还有一个问题就是A线程池中又并行调用了B、C线程池,在大流量情况下,CPU频繁切换也会造成一定的CPU压力,我们改写这块逻辑用一个线程池实现活动和资质的并发查询。鉴于改动较大,本次先不动。

2. 火焰图分析

wKgZO2e0K5CADIzrAAFlIjl_MMk997.png



2.1 wait线程

wKgZPGe0K5KAbzQ4AAS-vXOvmLQ104.png



2.2 锁性能

wKgZO2e0K5OAbT9fAABVTv8WRRg556.png



2.3 CPU采样

wKgZPGe0K5SAEN51AAVJrQt6tI8976.png



2.3.1 getFatherActivity分析

wKgZO2e0K5WAJnlpAASFE89Jb-A955.png



Q1:调用场景:循环中调用getFatherActivity

Q2:查看配置数据,json格式化后50000字符,大对象的反序列化

Q3:使用new ArrayList() 创建新对象

Q4:分组后只用了对象中的第一个元素,这里用toMap更佳

优化1:

wKgZPGe0K5aAKN8XAAJwzhk-DqE043.png



我们可以发现上文在循环中还是会存在多次的stream调用,继而将toMap逻辑提到循环外,如下:

wKgZO2e0K5iAJn0PAASLwbZPUT8987.png



其他方法确实占用CPU较高,这里先不处理。

下文再优化一项获取并发线程执行结果的工具类:

wKgZPGe0K5qAe7g2AAkqVb6pW3o510.png



1、 allOf异常后,取消所有线程的继续执行。这么做为了防止有些线程超时后仍在执行,浪费部分CPU资源,线上发现确实存在较多的超时情况。
2、 这里的异常日志较多,根据异常类型进行区分,去掉没用的堆栈日志。

并发线程中所有的等待统一都使用了上文的方法,前文中的queryActTp处于WAITING状态可能也是执行没取消导致,修改部署后再观察分析。同样的调用方式 queryQualityTp 处于Timed_waiting状态可能与一次父任务中子任务的执行耗时有关,见上文监控,活动和资质相差较大,具体原因有待进一步分析。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11218

    浏览量

    222973
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    低 ESR 突破 3mΩ:固态叠层高分子电容在车载 DC-DC 的应用实践

    MLCC与液态电容的核心方案。 以下从技术特性、应用场景、性能优化及行业实践四个维度展开分析:    一、低ESR特性:突破3mΩ的技术优势 能量损耗降低 MLPC采用导电高分子电解质(如PEDOT)与纳米级导电层技术,ESR可
    的头像 发表于 11-22 08:50 614次阅读
    低 ESR 突破 3mΩ:固态叠层<b class='flag-5'>高分</b>子电容在车载 DC-DC 的应用<b class='flag-5'>实践</b>

    时钟周期、机器周期、指令周期介绍

    执行操作,以时钟作为驱动完成每一步。因此时钟周期决定了计算机的工作节奏,进而影响到计算机工作速度。 机器周期:通常用从内存中读取一个指令字的最短时间来规定CPU周期(机器周期),也即CPU
    发表于 11-17 07:54

    在英伟达Thor平台部署EtherCAT主站:实测高性能、低抖动与低占用

    基础。通过部署acontisEC-Master主站协议栈,并结合实时内核与优化驱动,我们在JetsonThor上实现了低抖动、低CPU占用的EtherCAT通信性
    的头像 发表于 10-31 15:38 233次阅读
    在英伟达Thor平台部署EtherCAT主站:实测高性能、低抖动与低<b class='flag-5'>占用</b>

    在英伟达Thor平台部署EtherCAT主站:实测高性能、低抖动与低占用

    基础。通过部署acontisEC-Master主站协议栈,并结合实时内核与优化驱动,我们在JetsonThor上实现了低抖动、低CPU占用的EtherCAT通信性
    的头像 发表于 10-31 09:24 25次阅读
    在英伟达Thor平台部署EtherCAT主站:实测高性能、低抖动与低<b class='flag-5'>占用</b>

    在高性能 AI 平台上部署 EtherCAT 主站:实测低抖动、低占用方案

    基础。通过部署acontisEC-Master主站协议栈,并结合实时内核与优化驱动,我们在JetsonThor上实现了低抖动、低CPU占用的EtherCAT通信性
    的头像 发表于 10-30 15:35 699次阅读
    在高性能 AI 平台上部署 EtherCAT 主站:实测低抖动、低<b class='flag-5'>占用</b>方案

    RK3576机器人核心:三屏异显+八路摄像头,重塑机器人交互与感知

    瑞芯微RK3576 AIoT处理器处理器凭借其卓越的多屏异显与8路摄像头接入能力,为机器人领域带来革新。米尔电子MYD-LR3576开发板实测数据显示,在高负载下CPU占用仅34%,完美实现多路视觉
    发表于 10-29 16:41

    小批量SMT打样上机费,是“乱收费”还是“必要成本”?

    一站式PCBA加工厂家今天为大家讲讲为什么小批量SMT打样收取上机费?小批量SMT打样中上机费的价值。小批量SMT打样中收取上机费是必要的,其价值主要体现在设备调试与固定成本分摊、工艺调整与质量
    的头像 发表于 10-21 09:08 350次阅读

    单核CPU网关和双核CPU网关有什么区别

    单核CPU网关与双核CPU网关的核心区别在于处理能力、多任务效率、性能表现及适用场景,双核CPU网关在多任务处理、复杂计算和响应速度上具有显著优势,而单核CPU网关则更适合轻量级、低负
    的头像 发表于 07-05 14:37 740次阅读

    热重分析仪在高分子材料中的应用

    高分子材料以其轻质、高强度、耐腐蚀等特性广泛应用于工业、医疗、电子等领域。然而,其热稳定性直接影响加工性能、使用寿命及安全性。热重分析仪作为一种表征材料热性能的关键仪器,能够精准测定高分子材料在升温
    的头像 发表于 05-27 14:19 341次阅读
    热重<b class='flag-5'>分析</b>仪在<b class='flag-5'>高分</b>子材料中的应用

    【「# ROS 2智能机器人开发实践」阅读体验】视觉实现的基础算法的应用

    : 一、机器人视觉:从理论到实践 第7章详细介绍了ROS2在机器视觉领域的应用,涵盖了相机标定、OpenCV集成、视觉巡线、二维码识别以及深度学习目标检测等内容。通过学习,我认识到: 相机标定的重要性
    发表于 05-03 19:41

    【「# ROS 2智能机器人开发实践」阅读体验】机器人入门的引路书

    ROS的全称:Robot Operating System 机器人操作系统 ROS的 目的 :ROS支持通用库,是通信总线,协调多个传感器 为了解决机器人里各厂商模块不通用的问题,让机器人快速开发
    发表于 04-30 01:05

    【「# ROS 2智能机器人开发实践」阅读体验】+ROS2应用案例

    的知识,还需要对ROS 2的节点通信和数据处理有一定的了解。通过实践这一部分内容,我掌握了如何在ROS 2中实现二维码识别,这对于提高机器人的智能性和交互性具有重要意义。 地图构建:SLAM技术
    发表于 04-27 11:42

    【「# ROS 2智能机器人开发实践」阅读体验】+内容初识

    控制机器人沿着路径行驶,同时实时检测环境变化,调整路径规划和导航控制策略。书中提供了完整的导航系统搭建示例,包括代码实现和参数配置,帮助读者快速掌握导航系统的开发。 3. 案例分析实践 机器
    发表于 04-27 11:24

    名单公布!【书籍评测活动NO.58】ROS 2智能机器人开发实践

    Jazzy长期稳定版推出,这也代表着ROS 2走向成熟。《ROS 2智能机器人开发实践》 一书全部代码便基于长期稳定版撰写。 ROS的发展 从2012年开始,使用ROS的人越来越多,ROS社区开始举办
    发表于 03-03 14:18

    DLPC的boot flash在上机贴片之前需要预先烧写程序吗?

    您好,请问下,DLPC的boot flash在上机贴片之前需要预先烧写程序吗?是否可以先贴片后经过USB 烧写img启动?
    发表于 02-21 16:56