首页 文章 精选 留言 我的

精选列表

搜索[高并发],共10000篇文章
优秀的个人博客,低调大师

再一次生产 CPU 负载排查实践

前言 前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨。 其实早在去年我也处理过类似的问题,并记录下来:《一次生产 CPU 100% 排查优化实践》 不过本次问题产生的原因却和上次不太一样,大家可以接着往下看。 问题分析 收到邮件后我马上登陆那台服务器,看了下案发现场还在(负载依然很高)。 于是我便利用这类问题的排查套路定位一遍。 首先利用 top -c 将系统资源使用情况实时显示出来 (-c 参数可以完整显示命令)。 接着输入大写 P 将应用按照 CPU 使用率排序,第一个就是使用率最高的程序。 果不其然就是我们的一个 Java 应用。 这个应用简单来说就是定时跑一些报表使的,每天凌晨会触发任务调度,正常情况下几个小时就会运行完毕。 常规操作第二步自然是得知道这个应用中最耗 CPU 的线程到底再干嘛。 利用 top -Hp pid 然后输入 P 依然可以按照 CPU 使用率将线程排序。 这时我们只需要记住线程的 ID 将其转换为 16 进制存储起来,通过 jstack pid >pid.log 生成日志文件,利用刚才保存的 16 进制进程 ID 去这个线程快照中搜索即可知道消耗 CPU 的线程在干啥了。 如果你嫌麻烦,我也强烈推荐阿里开源的问题定位神器 arthas 来定位问题。 比如上述操作便可精简为一个命令 thread -n 3 即可将最忙碌的三个线程快照打印出来,非常高效。 更多关于 arthas 使用教程请参考官方文档。 由于之前忘记截图了,这里我直接得出结论吧: 最忙绿的线程是一个 GC 线程,也就意味着它在忙着做垃圾回收。 GC 查看 排查到这里,有经验的老司机一定会想到:多半是应用内存使用有问题导致的。 于是我通过 jstat -gcutil pid 200 50 将内存使用、gc 回收状况打印出来(每隔 200ms 打印 50次)。 从图中可以得到以下几个信息: Eden 区和 old 区都快占满了,可见内存回收是有问题的。 fgc 回收频次很高,10s 之内发生了 8 次回收((866493-866485)/ (200 *5))。 持续的时间较长,fgc 已经发生了 8W 多次。 内存分析 既然是初步定位是内存问题,所以还是得拿一份内存快照分析才能最终定位到问题。 通过命令 jmap -dump:live,format=b,file=dump.hprof pid 可以导出一份快照文件。 这时就得借助 MAT 这类的分析工具出马了。 问题定位 通过这张图其实很明显可以看出,在内存中存在一个非常大的字符串,而这个字符串正好是被这个定时任务的线程引用着。 大概算了一下这个字符串所占的内存为 258m 左右,就一个字符串来说已经是非常大的对象了。 那这个字符串是咋产生的呢? 其实看上图中的引用关系及字符串的内容不难看出这是一个 insert 的 SQL 语句。 这时不得不赞叹 MAT 这个工具,他还能帮你预测出这个内存快照可能出现问题地方同时给出线程快照。 最终通过这个线程快照找到了具体的业务代码: 他调用一个写入数据库的方法,而这个方法会拼接一个 insert 语句,其中的 values 是循环拼接生成,大概如下: <insert id="insert" parameterType="java.util.List"> insert into xx (files) values <foreach collection="list" item="item" separator=","> xxx </foreach> </insert> 所以一旦这个 list 非常大时,这个拼接的 SQL 语句也会很长。 通过刚才的内存分析其实可以看出这个 List 也是非常大的,也就导致了最终的这个 insert 语句占用的内存巨大。 优化策略 既然找到问题原因那就好解决了,有两个方向: 控制源头 List 的大小,这个 List 也是从某张表中获取的数据,可以分页获取;这样后续的 insert 语句就会减小。 控制批量写入数据的大小,其实本质还是要把这个拼接的 SQL 长度降下来。 整个的写入效率需要重新评估。 总结 本次问题从分析到解决花的时间并不长,也还比较典型,其中的过程再总结一下: 首先定位消耗 CPU 进程。 再定位消耗 CPU 的具体线程。 内存问题 dump 出快照进行分析。 得出结论,调整代码,测试结果。 最后愿大家都别接到生产告警。 你的点赞与分享是对我最大的支持

优秀的个人博客,低调大师

剖析 | 可扩展性、高性能、生产级的 SOFARPC 框架

小蚂蚁说: SOFA(ScalableOpenFinancialArchitecture)是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 本篇文章整理自《剖析 | SOFARPC 框架》系列文章,由SOFA 团队和源码爱好者们共同出品,项目代号:<SOFA:RPCLab/>。由于原文 系列篇幅较长,小蚂蚁为大家节选了部分内容,想要了解更多有关 SOFARPC 框架内容,可通过文中链接跳转获取~ 相关阅读: 《开源 | 蚂蚁金服启动分布式中间件开源计划,用于快速构建金融级云原生架构》 《开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系》 目录 一、前言 二、SOFARPC 总体设计与扩展机制 三、SOFARPC 链路追踪 四、SOFARPC 连接管理与心

优秀的个人博客,低调大师

自定义的小程序 UI 组件库 wuss-weapp

如何使用 方法一 [推荐] (通过npm安装依赖并在小程序构建npm模块) 通过使用shell命令或git定位到当前小程序开发目录,然后使用npm或者yarn安装依赖。npm install --production wuss-weapp 或者 yarn add --production wuss-weapp 当依赖安装完成后即可在微信小程序开发者工具里点击 [工具] => [构建npm],此时若出现弹窗则记得吧 “使用npm模块” 勾上,若无弹窗则待构建完成后在详情里面手动勾上 “使用npm模块”。 构建完成后即可添加需要的组件。在页面的 json 中配置: "usingComponents": { "w-button": "wuss-weapp/w-button/index" } 在 wxml 中使用组件:<w-button type="info" bind:click="buttonClick">这是一个按钮</w-button> 在JavaScript中使用:import { Alert, Toast } from 'wuss-weapp'; Alert({ title: '提示', content: 'wuss weapp is good', }); Toast.show({ message: 'wuss小程序UI库', }); 方法二(通过clone当前项目的dist拷贝到自己项目中使用) 到GitHub下载 Wuss Weapp 的代码,将dist目录拷贝到自己的项目中。然后按照如下的方式使用组件,以 Button 为例,其它组件在对应的文档页查看: 添加需要的组件。在页面的 json 中配置(路径根据自己项目位置配置): "usingComponents": { "w-button": "/dist/w-button/index" } 在 wxml 中使用组件:<w-button type="info" bind:click="buttonClick">这是一个按钮</w-button> 预览所有组件 我们内置了所有组件的示例,您可以扫描上方的的小程序码体验,或按以下方式在微信开发者工具中查看: git clone https://github.com/phonycode/wuss-weapp.git 然后,直接将项目在微信开发者工具中打开即可。 本文来自云栖社区合作伙伴“开源中国” 本文作者:达尔文 原文链接

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册