前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >技术组件优化分析:原理、方法与实战分享

技术组件优化分析:原理、方法与实战分享

作者头像
JavaEdge
发布于 2023-04-12 01:27:42
发布于 2023-04-12 01:27:42
33700
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

对一个固定的技术组件的分析优化思路,即组件不是我们开发的,但又要分析优化它,怎么办?

数据库的CPU并没有全部用完,而是只用了几颗的时候,如何具体定向?将用到查看数据库本身线程栈的方法,这和前面直接看trx表有所不同。

1 场景运行数据

对于支付前查询订单列表接口,先看第一次运行的性能场景结果:

从运行的场景数据来看,这接口TPS一开始还挺高,达800。但响应时间也增加,瓶颈已出现。只要知道瓶颈在哪,就能知道这个接口有无优化空间。

2 架构图

可见,当前接口的逻辑为:Gateway - Order - Member,其中也使用到MySQLRedis

3 拆分响应时间

  • Gateway:
  • Order:
  • Member:

从响应时间分布看,Gateway(网关)消耗时间长。接下来从Gateway下手,分析到底哪消耗了时间。

4 第一阶段

4.1 全局监控分析

先看这个接口的全局监控:

由于Gateway消耗的响应时间长,看过全局监控视图后,要判断Gateway在哪个worker:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@k8s-master-2 ~]# kubectl get pods -o wide | grep gateway
gateway-mall-gateway-757659dbc9-tdwnm       1/1     Running     0          3d16h   10.100.79.96     k8s-worker-4   <none>           <none>
[root@k8s-master-2 ~]#

在worker-4,同时在全局监控图上可看到,虽然Gateway只消耗70%CPU,但它还是消耗最多响应时间。那就看Gateway的线程状态,在处理什么。

4.2 定向监控分析

先看一下线程的CPU消耗:

通过上图可看,Gateway有两类重要工作线程:

  • reactor-http-epoll reactor-http-epoll线程的设置最好与CPU个数一致。当前reactor-http-epoll线程4个,而这个worker有6C,所以还能增加两个
  • boundedElastic 有边界的弹性线程池,默认为CPU核x10,也没啥可优化

再持续看一会儿Gateway服务中的线程所消耗的时间比例,看方法级的时间消耗有没有异常的情况,即比例非常高的:

当前的执行方法也都没啥异常。

现在我们就把线程增加到6个,看能不能把CPU用高一点。如果CPU用多了之后,仍然是Gateway消耗的时间长,那就只有再继续加CPU。

性能项目中,不要轻易给出加CPU这样的建议。一定要在你分析了逻辑后,确定没有其他优化空间,再给这样的建议。

4.3 优化效果

通过回归测试,看到TPS有一点增加,只是在图的后半段(由于在测试过程中,Gateway重启过,前面的TPS就当是预热了)增加的并不明显,大概有50多TPS的样子。不过,也算是有了效果。

还没结束,查看各Worker的过程中,还发现DB里有两个CPU使用率很高。

优化效果不咋样,重新开始分析。

5 二阶段

5.1 全局监控分析

DB所在的worker-1也没啥大的资源消耗。

文章中经常用这个界面看全局监控数据。但这不是只看这界面。当我在这界面中看不到明显问题点时,也会去看命令像top/vmstat,这和我一直说的全局监控的完整计数器有关。因此,你要有全局监控计数器的视图,然后才能真正看全第一层的计数器。

再看DB所在的worker上的top数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bash-4.2$ top      
top - 09:57:43 up 3 days, 17:54,  0 users,  load average: 4.40, 3.57, 3.11
Tasks:  11 total,   1 running,   9 sleeping,   1 stopped,   0 zombie
%Cpu0  :  8.0 us,  4.7 sy,  0.0 ni, 84.3 id,  0.0 wa,  0.0 hi,  2.2 si,  0.7 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  6.5 us,  4.4 sy,  0.0 ni, 85.5 id,  0.0 wa,  0.0 hi,  2.2 si,  1.5 st
%Cpu3  :  7.8 us,  5.7 sy,  0.0 ni, 83.7 id,  0.0 wa,  0.0 hi,  2.1 si,  0.7 st
%Cpu4  : 96.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  4.0 si,  0.0 st
%Cpu5  :  7.0 us,  4.0 sy,  0.0 ni, 84.9 id,  0.0 wa,  0.0 hi,  2.6 si,  1.5 st
KiB Mem : 16265992 total,  1203032 free,  6695156 used,  8367804 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  9050344 avail Mem 


  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                      
    1 mysql     20   0 8272536   4.7g  13196 S 248.8 30.5   6184:36 mysqld 

有两个CPU的使用率高,就定向分析DB。

5.2 定向监控分析

可在DB上又不是所有CPU使用率都高,所以,要看DB线程到底在做啥。有了上面的进程信息后,再深入线程级:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bash-4.2$ top -Hp 1
top - 09:56:40 up 3 days, 17:53,  0 users,  load average: 3.05, 3.30, 3.01
Threads:  92 total,   2 running,  90 sleeping,   0 stopped,   0 zombie
%Cpu0  :  5.4 us,  2.9 sy,  0.0 ni, 89.2 id,  0.0 wa,  0.0 hi,  2.2 si,  0.4 st
%Cpu1  : 99.7 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.3 st
%Cpu2  :  5.4 us,  3.2 sy,  0.0 ni, 88.2 id,  0.0 wa,  0.0 hi,  2.5 si,  0.7 st
%Cpu3  :  6.3 us,  4.2 sy,  0.0 ni, 87.0 id,  0.0 wa,  0.0 hi,  2.1 si,  0.4 st
%Cpu4  : 96.3 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  3.7 si,  0.0 st
%Cpu5  :  4.0 us,  2.5 sy,  0.0 ni, 91.0 id,  0.0 wa,  0.0 hi,  1.8 si,  0.7 st
KiB Mem : 16265992 total,  1205356 free,  6692736 used,  8367900 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  9052664 avail Mem 


  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                       
  311 mysql     20   0 8272536   4.7g  13196 R 99.9 30.5  18:20.34 mysqld                                                                        
  241 mysql     20   0 8272536   4.7g  13196 R 99.7 30.5   1906:40 mysqld                                                                        
  291 mysql     20   0 8272536   4.7g  13196 S  3.3 30.5  15:49.21 mysqld                                                                        
  319 mysql     20   0 8272536   4.7g  13196 S  3.0 30.5  11:50.34 mysqld                                                                        
  355 mysql     20   0 8272536   4.7g  13196 S  3.0 30.5  13:01.53 mysqld                                                                        
  265 mysql     20   0 8272536   4.7g  13196 S  2.7 30.5  18:17.48 mysqld                                                                        
  307 mysql     20   0 8272536   4.7g  13196 S  2.7 30.5  16:47.77 mysqld                                                                        
  328 mysql     20   0 8272536   4.7g  13196 S  2.7 30.5  15:34.92 mysqld                                                                        
  335 mysql     20   0 8272536   4.7g  13196 S  2.7 30.5   8:55.38 mysqld                                                                        
  316 mysql     20   0 8272536   4.7g  13196 S  2.3 30.5  14:38.68 mysqld                                                                        
  350 mysql     20   0 8272536   4.7g  13196 S  2.3 30.5  10:37.94 mysqld                                                                        
  233 mysql     20   0 8272536   4.7g  13196 S  2.0 30.5  14:19.32 mysqld                                                                        
  279 mysql     20   0 8272536   4.7g  13196 S  2.0 30.5  19:51.80 mysqld                                                                        
  318 mysql     20   0 8272536   4.7g  13196 S  2.0 30.5  11:34.62 mysqld                                                                        
  331 mysql     20   0 8272536   4.7g  13196 S  2.0 30.5  11:46.94 mysqld                                                                        
  375 mysql     20   0 8272536   4.7g  13196 S  2.0 30.5   1:29.22 mysqld                                                                        
  300 mysql     20   0 8272536   4.7g  13196 S  1.7 30.5  17:45.26 mysqld                                                                        
  380 mysql     20   0 8272536   4.7g  13196 S  1.7 30.5   1:24.32 mysqld            

只有两个MySQL的线程在使用CPU。接下来查SQL!虽然可能就是SQL的问题,但建议你找到相应证据。

gstack(装了GDB后就有的命令)打印这两个MySQL的栈,看具体函数。把那两个PID(311、241)的栈拿出来之后,看到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Thread 59 (Thread 0x7f1d60174700 (LWP 241)):
#0  0x000055a431fefea9 in JOIN_CACHE::read_record_field(st_cache_field*, bool) ()
#1  0x000055a431ff01ca in JOIN_CACHE::read_some_record_fields() ()
#2  0x000055a431ff070f in JOIN_CACHE::get_record() ()
#3  0x000055a431ff2a92 in JOIN_CACHE_BNL::join_matching_records(bool) ()
#4  0x000055a431ff18f0 in JOIN_CACHE::join_records(bool) ()
#5  0x000055a431e397c0 in evaluate_join_record(JOIN*, QEP_TAB*) ()
#6  0x000055a431e3f1a5 in sub_select(JOIN*, QEP_TAB*, bool) ()
#7  0x000055a431e37a90 in JOIN::exec() ()
#8  0x000055a431eaa0ba in handle_query(THD*, LEX*, Query_result*, unsigned long long, unsigned long long) ()
#9  0x000055a43194760d in execute_sqlcom_select(THD*, TABLE_LIST*) ()
#10 0x000055a431e6accf in mysql_execute_command(THD*, bool) ()
#11 0x000055a431e6d455 in mysql_parse(THD*, Parser_state*) ()
#12 0x000055a431e6e3b6 in dispatch_command(THD*, COM_DATA const*, enum_server_command) ()
#13 0x000055a431e6fc00 in do_command(THD*) ()
#14 0x000055a431f33938 in handle_connection ()
#15 0x000055a4320e66d4 in pfs_spawn_thread ()
#16 0x00007f1e8f1fcdd5 in start_thread () from /lib64/libpthread.so.0
#17 0x00007f1e8d3cc02d in clone () from /lib64/libc.so.6
Thread 41 (Thread 0x7f1d585e0700 (LWP 311)):
#0  0x000055a4319dbe44 in Item_field::val_int() ()
#1  0x000055a4319fb839 in Arg_comparator::compare_int_signed() ()
#2  0x000055a4319fbd9b in Item_func_eq::val_int() ()
#3  0x000055a431ff24ab in JOIN_CACHE::check_match(unsigned char*) ()
#4  0x000055a431ff26ec in JOIN_CACHE::generate_full_extensions(unsigned char*) ()
#5  0x000055a431ff2ab4 in JOIN_CACHE_BNL::join_matching_records(bool) ()
#6  0x000055a431ff18f0 in JOIN_CACHE::join_records(bool) ()
#7  0x000055a431e397c0 in evaluate_join_record(JOIN*, QEP_TAB*) ()
#8  0x000055a431e3f1a5 in sub_select(JOIN*, QEP_TAB*, bool) ()
#9  0x000055a431e37a90 in JOIN::exec() ()
#10 0x000055a431eaa0ba in handle_query(THD*, LEX*, Query_result*, unsigned long long, unsigned long long) ()
#11 0x000055a43194760d in execute_sqlcom_select(THD*, TABLE_LIST*) ()
#12 0x000055a431e6accf in mysql_execute_command(THD*, bool) ()
#13 0x000055a431e6d455 in mysql_parse(THD*, Parser_state*) ()
#14 0x000055a431e6e3b6 in dispatch_command(THD*, COM_DATA const*, enum_server_command) ()
#15 0x000055a431e6fc00 in do_command(THD*) ()
#16 0x000055a431f33938 in handle_connection ()
#17 0x000055a4320e66d4 in pfs_spawn_thread ()
#18 0x00007f1e8f1fcdd5 in start_thread () from /lib64/libpthread.so.0
#19 0x00007f1e8d3cc02d in clone () from /lib64/libc.so.6

两个execute_sqlcom_select函数,即两个select语句。接着往上看栈,还可看到JOIN函数。既然是select语句中的JOIN,直接找SQL语句。

直接查innodb_trx表,看正在执行SQL有没有消耗时间长的。你也许会执行show processlist之类的命令,但为看全SQL,建议直接查trx表。

由于我们使用的thread_handling是默认的one-thread-per-connection,os的线程和MySQL里的线程都是一一对应。所以,这里直接查trx表不会有误判。

查找innodb_trx表,看到这两个SQL消耗时间长:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- sql1
SELECT
	count(*)
FROM
	oms_order o
LEFT JOIN oms_order_item ot ON o.id = ot.order_id
WHERE
	o. STATUS = 0
AND o.create_time < date_add(NOW(), INTERVAL - 120 MINUTE)
LIMIT 0,
 1000


-- sql2:
SELECT
	o.id,
	o.order_sn,
	o.coupon_id,
	o.integration,
	o.member_id,
	o.use_integration,
	ot.id ot_id,
	ot.product_name ot_product_name,
	ot.product_sku_id ot_product_sku_id,
	ot.product_sku_code ot_product_sku_code,
	ot.product_quantity ot_product_quantity
FROM
	oms_order o
LEFT JOIN oms_order_item ot ON o.id = ot.order_id
WHERE
	o. STATUS = 0
AND o.create_time < date_add(NOW(), INTERVAL - 120 MINUTE)

想看SQL慢,就看SQL执行计划(MySQL执行计划看不清楚,还可看Profile信息):

全表扫描。

支付前查询订单列表这个接口并没有用到这俩SQL。到代码看下这两个SQL的生成过程,反向查找到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Scheduled(cron = "0 0/20 * ? * ?")
    private void cancelTimeOutOrder(){
        Integer count = portalOrderService.cancelTimeOutOrder();
        LOGGER.info("取消订单释放锁定库存:{}",count);
    }

这是个定时计划,每20分钟执行一次。原来是定时任务调用了这两个批量的查询语句,导致两个CPU使用率达到100%,并且持续了一段时间。

像这样的定时任务,要格外关注,注意把它和实时业务分开部署和处理,减少批量业务对实时业务的资源争用。若放在一起处理,要控制好要批量查询的数据量级,让SQL查询更合理。

由于数据库可用的CPU较多,这定时任务对TPS并没有产生明显影响,在这里我们不用做什么处理,以后注意分开就好。

6 总结

虽然优化没有让TPS明显增加,但因为分析的技术细节不一样,也完整记录了分析过程。

一阶段分析不同点在于,对一个成熟固定组件,要想优化它,就要去了解它的架构,找到相关性能参数。因为实际性能项目中,面对这样的组件,往往没有时间去纠结内部的实现,需要非常快速地作出判断。如时间允许,慢慢折腾。

理解一个技术组件的原理,并没有想像中的那么高不可攀、深不可测,只要耐心看下去,总会成长。

二阶段分析,由某几个CPU高的现象分析到了具体的SQL问题。这个过程虽然简单,但从这问题,可以看出这系统还有很多优化空间,如主从分离、定时任务拆为单独的服务等等。

不过,性能分析中,重点仍是分析思路。

FAQ

为什么要看全部的全局监控计数器?

也可能存在关联系统影响导致性能差?在性能分析中没有“可能”。其实这个问题要问的是一个思路,而不是原因。

因为一个全局监控方法可能不能包含所有性能计数器,要知道自己想看什么计数器,知道计数器可以通过哪些工具来查看,使用全部是为了不漏点存在问题的任何可能性。

单CPU高时,如何定位具体的问题点?你有什么思路?

单cpu高,可以先查看cpu在跑哪些线程,找到对应高效耗线程,然后再去使用工具查看这些线程在干什么,从而定位问题。 CPU使用率高,也可以使用perf抓去调用函数?也同样是问思路。不过cpu使用率,应该先看是哪个计数器,再确定后续的思路,而不是直接用perf去看系统调用。

一切性能问题,都能通过jstack pid找到线索

那要看是不是和代码有关的问题。 jstack是查看栈信息的,也就是代码的执行逻辑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
故障分析 | 是谁偷走了我的 IO
爱可生DBA团队成员,主要负责MySQL和DMP平台日常的维持工作,对数据库自动化运维存有浓厚兴趣。
爱可生开源社区
2022/05/23
6780
MySQL全面优化思路-基础内容
通过 top -Hp 10380 指定占用高的进程,可以看到具体是那些线程占用过高
Yuou
2022/09/26
3970
CPU、负载、磁盘同时飙升的问题分析
上周五下午的时候,线上的一个服务器出了一个报警,报警内容是CPU利用率大于80%,持续时间五分钟。
AsiaYe
2019/12/18
1.9K0
MySQL导致的CPU高负载问题
在某个新服务器上,新建了一个MySQL的实例,该服务器上面只有MySQL这一个进程,但是CPU的负载却居高不下,使用top命令查询的结果如下:
AsiaYe
2019/11/06
2.4K0
Linux高负载排查最佳实践
在Linux系统中,经常会因为负载过高导致各种性能问题。那么如何进行排查,其实是有迹可循,而且模式固定。
十里桃花舞丶
2024/03/15
4700
Linux高负载排查最佳实践
MySQL并不孤单的存在—硬件环境的限制与优化
之所以写这篇文章也是因为前几天出的一个问题,当时业务感觉到卡顿,并且伴随着锁超时的报错。最后通过分析发现是由于磁盘I/Q繁忙导致SQL耗时增加,部分锁竞争激烈的热数据出现了锁等待和锁超时。由此可见,系统的硬件环境对数据库整体性能的影响也是非常大的,MySQL在运行环境中并不是孤立存在的,它的整体性能往往受限于系统最薄弱的环节,今天想和大家分享下,都有哪些系统指标会对数据库的整体性能产生影响,我们又如何进行分析。
MySQL数据库技术栈
2020/08/04
1.3K0
docker cgroup技术之cpu和cpuset
  在centos7的/sys/fs/cgroup下面可以看到与cpu相关的有cpu,cpuacct和cpuset 3个subsystem。cpu用于对cpu使用率的划分;cpuset用于设置cpu的亲和性等,主要用于numa架构的os;cpuacct记录了cpu的部分信息。对cpu资源的设置可以从2个维度考察:cpu使用百分比和cpu核数目。前者使用cpu subsystem进行配置,后者使用cpuset subsystem进程配置。首先看cpu subsystem的用法
charlieroro
2020/03/24
2.1K0
docker cgroup技术之cpu和cpuset
业务逻辑复杂如何解决性能问题
上节针对生成订单信息这个接口做了三个阶段的分析定位和优化动作,让TPS变得正常。不过,系统资源并没有完全用起来,这个接口显然还有优化空间。性能优化的过程中,要把资源都用起来。
JavaEdge
2023/04/12
5410
业务逻辑复杂如何解决性能问题
如何避免JDBC池和内存溢出?优化策略大揭秘!
40个压力线程只跑出50多的TPS,响应时间也蹭蹭跑了近700ms。这显然是很慢的接口。
JavaEdge
2023/04/12
8930
如何避免JDBC池和内存溢出?优化策略大揭秘!
实例解析MySQL性能瓶颈排查定位
登入服务器后,我们的目的是首先要确认当前到底是哪些进程引起的负载高,以及这些进程卡在什么地方,瓶颈是什么。
用户1278550
2020/02/26
1.7K0
在 Linux 中找出 CPU 占用高的进程
你可能也会遇到在 Linux 系统中找出 CPU 占用高的进程的情形。如果是这样,那么你需要列出系统中 CPU 占用高的进程列表来确定。我认为只有两种方法能实现:使用 top 命令 和 ps 命令。出于一些理由,我更倾向于用 top 命令而不是 ps 命令。但是两个工具都能达到你要的目的,所以你可以根据需求决定使用哪个。这两个工具都被 Linux 系统管理员广泛使用。 1) 怎样使用 top 命令找出 Linux 中 CPU 占用高的进程 在所有监控 Linux 系统性能的工具中,Linux 的 top 命令是最好的也是最知名的一个。top 命令提供了 Linux 系统运行中的进程的动态实时视图。它能显示系统的概览信息和 Linux 内核当前管理的进程列表。它显示了大量的系统信息,如 CPU 使用、内存使用、交换内存、运行的进程数、目前系统开机时间、系统负载、缓冲区大小、缓存大小、进程 PID 等等。默认情况下,top 命令的输出结果按 CPU 占用进行排序,每 5 秒中更新一次结果。如果你想要一个更清晰的视图来更深入的分析结果,以批处理模式运行 top 命令 是最好的方法。同时,你需要 理解 top 命令输出结果的含义 ,这样才能解决系统的性能问题。
用户2590762
2021/08/11
4K0
软件性能测试(连载14)
由于内核CPU为sy 6.5%并不是很高,而等待I/O的CPU时间为93.8%是比较高的,另外在进程信息中心可以看到Python3的进程CPU占有率为7.2%,也是比较高的,它的PID为16520。可以定位在I/O上出现了瓶颈,可能是Python3引起的。于是用iostat来分析。
顾翔
2020/03/04
4190
java性能调优
随着系统自身数据量的增长,访问量增加,系统的响应通常会越来越慢,或者是新的功能在性能上无法满足修去,这个时候需要对系统进行性能调优。调优是一个复杂的过程,涉及的方面有:硬件,操作系统,运行环境软件和应用本身。
zhangheng
2020/04/28
1.2K0
理解 CPU 利用率
在 Linux shell 上执行 top 命令,可以看到这样一行 CPU 利用率的数据:
linjinhe
2018/12/06
2.5K0
Centos7查看内存使用情况
除了上述常用参数外,free 命令还支持其他一些选项,可以通过 man free 命令查看完整的帮助文档。
九转成圣
2024/04/15
1.8K0
Centos7查看内存使用情况
python 让cpu满载
搞zabbix监控的时候,linux服务器的负载很低,如何写一个python脚本,让它满载呢?
py3study
2020/01/20
4.8K0
Cgroup测试&CFS计算方法
首先,Linux把CGroup这个事实现成了一个file system,你可以mount。在我的Ubuntu 14.04下,你输入以下命令你就可以看到cgroup已为你mount好了。
mingjie
2022/05/12
1.1K0
linux每日命令(37):top命令
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.
用户1214487
2018/12/24
1.4K0
Linux下java进程CPU占用率高分析方法
在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。这种情况发生时,我们怎么去找出原因并解决。
用户1212940
2022/04/13
2.7K0
Java项目上线后,CPU过高如何定位原因
将16进制转为jstack 进程PID |grep 16进制线程PID -A 20
JokerDJ
2023/12/04
2790
相关推荐
故障分析 | 是谁偷走了我的 IO
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文