本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结。

一 Windbg介绍

1、Windbg是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试。针对几个常用的应用场景进行了对比分析

支持的类型

说明

应用场景

用户态调试

附加进程的方式调试。调试器与被调试程序建立联系,程序像调试器发送暂停和恢复调试指令。

类似VS的单步调试,可以是设置断点单步调制

内核态调试

用来在本地和远程计算机调试内核

1、在系统启动的早期阶段或者系统关闭的后期阶段当不存在交互式的控制台时调试进程;

2、分析进程间通信问题

转储文件调试

转储文件(Dump)是一个快照,它显示正在执行的进程和某个时刻为应用程序加载的模块。转储文件带有堆信息的转储还包括应用程序在该点的内存快照。

1、性能分析,内存泄漏,线程阻塞,

2、故障异常排查

3、进程Crash分析等

远程调试

通过调试服务期DbgSrv进行远程调试

1、程序运行需要时候全屏

2、程序在客户的机器上Crash崩溃

2、Windbg典型的窗口程序,但是它的大多数的调试功能,还是以输入命令进行的,命令不区分大小写。

命令分类

用途

数量

举例

说明

标准命令

适用于各种调试目标的最基本调试功能:查看,结束,帮助等

20多个

观察栈的命令K

显示线程的命令~

显示进程的命令|

结束调试的命令q

显示标准命令的?

1、通常是一两个字符或者符合,例外:version

2、部分命令待办一系列以这个字符开头的双字符命令

元命令

标准命令没有提供的调试功能。

140多个

加载模块 .loadby

.load

显示已加载模块  .chain

元命令是内置在调试器引擎或者程序文件中的,可以直接用的

都是一个点开始(.)也叫点命令

扩展命令

1、用于扩展某一方面的调试功能;

2、用户也可以编写自己的扩展模块和命令

难以计数

查看线程 !threads

查看对象信息:!do

使用扩展命令时,命令以!开头

完整的格式:

![扩展模块名].<扩展命令名>[参数]

其中扩展模块名可以省略

3、加载扩展的命令:

1)使用 .load 命令加上扩展模块的完整路径来加载它

2)使用.loadby命令加上扩展模块的名称,自动到扩展模块路径中搜索匹配的模块

3)使用!扩展模块名.扩展命令名的方式会自动搜索和加载指定的模块

4、默认的符号设置:

srv*c:\symcache*http://msdl.microsoft.com/download/symbolsc:\symcache

二、一个网关服务性能问题的Dump分析

•       问题环境: 开发环境服务器

•       问题现象:EPM的SG站点的所有服务响应时间大于10s,  最终也能返回有效数据,影响开发联调的效率

•       问题分析:尝试抓取dump,试图分析原因。

•       问题根因:Redis hang住导致服务连接超时。    重启redis,修改redis的默认设置问题解决     

•       问题具体分析的步骤:

        1、打开dump文件,加载符号文件.loadby sos clr ;     .load  c:\mycache\mex.dll

0:000> .loadby sos clr
0:000> .load c:\symcache\mex.dll
Mex External 3.0.0.7172 Loaded!

2、查看所有的线程!threads, 发现存在lock的46号线程。

0:000> !threads
PDB symbol for clr.dll not loaded
ThreadCount: 40
UnstartedThread: 0
BackgroundThread: 27
PendingThread: 0
DeadThread: 11
Hosted Runtime: no
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
14 1 121e4 000001d447d948e0 28220 Preemptive 000001D5C85CC5A8:000001D5C85CE008 000001d447d8a0f0 0 Ukn
32 2 107d4 000001d447efa1e0 2b220 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 MTA (Finalizer)
34 3 11318 000001d8d3ace3e0 102a220 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 MTA (Threadpool Worker)
35 4 134dc 000001d8d3adf920 21220 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
37 6 101d8 000001d8d3bc89b0 1020220 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn (Threadpool Worker)
39 7 b808 000001d8d3c68870 202b220 Preemptive 000001D6C81F6560:000001D6C81F7FD0 000001d8d3ade8e0 1 MTA
40 8 102c0 000001d8d3c67840 8029220 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 MTA (Threadpool Completion Port)
41 10 10994 000001d8d3c70ae0 8029220 Preemptive 000001D7481920A0:000001D748193FD0 000001d447d8a0f0 0 MTA (Threadpool Completion Port)
22 9 145a8 000001d8d3c70310 8028220 Preemptive 000001D4486DA060:000001D4486DBFD0 000001d447d8a0f0 0 MTA (Threadpool Completion Port)
42 11 1425c 000001d8d3c712b0 202b220 Preemptive 000001D5C86C91B0:000001D5C86C9FD0 000001d8d3ade8e0 0 MTA
44 12 11a5c 000001d8d4ec22c0 3029220 Preemptive 000001D548294B00:000001D548295FD0 000001d8d3ade8e0 0 MTA (Threadpool Worker)
45 13 7ca0 000001d8d4ec2a90 3029220 Preemptive 000001D6484E75D0:000001D6484E8FD0 000001d8d3ade8e0 0 MTA (Threadpool Worker)
46 14 13320 000001d8d4ec6ca0 3029220 Preemptive 000001D7C8454AE8:000001D7C8455FD0 000001d8d3ade8e0 3 MTA (Threadpool Worker)
47 15 11098 000001d8d4ec7470 1029220 Preemptive 000001D6C8201300:000001D6C8201FD0 000001d447d8a0f0 0 MTA (Threadpool Worker)
48 16 a670 000001d8d4eca730 202b220 Preemptive 000001D4C8365CF8:000001D4C8365FD0 000001d8d3ade8e0 0 MTA
49 17 12b2c 000001d8d4ed4ca0 202b220 Preemptive 000001D6484E9330:000001D6484EAFD0 000001d8d3ade8e0 0 MTA
50 18 11dc8 000001d8d4eec8e0 202b220 Preemptive 000001D4486D01C8:000001D4486D1FD0 000001d8d3ade8e0 0 MTA
51 19 13da0 000001d8d3e58f60 2b020 Preemptive 000001D6C81FC508:000001D6C81FDFD0 000001d8d3ade8e0 1 MTA
52 20 cd10 000001d8d3e5ed20 202b220 Preemptive 0000000000000000:0000000000000000 000001d8d3ade8e0 0 MTA
53 21 101e8 000001d8d3e59730 202b220 Preemptive 000001D4C85C4CB8:000001D4C85C5FD0 000001d8d3ade8e0 0 MTA
54 22 2d90 000001d8d3e5fcc0 202b220 Preemptive 000001D4486E6178:000001D4486E7FD0 000001d8d3ade8e0 0 MTA
55 23 13a74 000001d8d4f16d90 202b220 Preemptive 000001D7C8413638:000001D7C8413FD0 000001d8d3ade8e0 0 MTA
56 24 1364c 000001d8d4f15df0 2b020 Preemptive 000001D6484EF488:000001D6484F0FD0 000001d8d3ade8e0 1 MTA
57 25 13890 000001d8d4f165c0 202b220 Preemptive 000001D6C81FE0A0:000001D6C81FFFD0 000001d8d3ade8e0 0 MTA
58 26 119d8 000001d8d4f18500 1029220 Preemptive 000001D4486E9C58:000001D4486E9FD0 000001d447d8a0f0 0 MTA (Threadpool Worker)
59 27 14614 000001d4475e59f0 1029220 Preemptive 000001D5485ACAD8:000001D5485ADFD0 000001d447d8a0f0 0 MTA (Threadpool Worker)
XXXX 28 0 000001d4475e61c0 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 29 0 000001d4475e2b10 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 30 0 000001d4475e1b70 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 31 0 000001d4475e6990 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 32 0 000001d4475e32e0 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 33 0 000001d4475e13a0 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 34 0 000001d4475e3ab0 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 35 0 000001d4475e2340 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 36 0 000001d4475e5220 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
XXXX 37 0 000001d4475e4280 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
60 38 46f4 000001d4475e4a50 1029220 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 MTA (Threadpool Worker)
61 39 13d24 000001d4475e8100 1029220 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 MTA (Threadpool Worker)
XXXX 5 0 000001d8d4f93b70 839820 Preemptive 0000000000000000:0000000000000000 000001d447d8a0f0 0 Ukn
62 40 10980 000001d8d4f9a8d0 2b220 Preemptive 000001D5485D63B8:000001D5485D7FD0 000001d8d3ade8e0 0 MTA

3、查看线程的用户态执行时间,发现46号线程的执行时间较长

0:000> !runaway
User Mode Time
Thread Time
14:121e4 0 days 0:00:00.625
46:13320 0 days 0:00:00.156
42:1425c 0 days 0:00:00.062
53:101e8 0 days 0:00:00.046
48:a670 0 days 0:00:00.031
55:13a74 0 days 0:00:00.015
32:107d4 0 days 0:00:00.015
0:116dc 0 days 0:00:00.015
62:10980 0 days 0:00:00.000
61:13d24 0 days 0:00:00.000
60:46f4 0 days 0:00:00.000
59:14614 0 days 0:00:00.000
58:119d8 0 days 0:00:00.000
57:13890 0 days 0:00:00.000
56:1364c 0 days 0:00:00.000
54:2d90 0 days 0:00:00.000
52:cd10 0 days 0:00:00.000
51:13da0 0 days 0:00:00.000
50:11dc8 0 days 0:00:00.000
49:12b2c 0 days 0:00:00.000
47:11098 0 days 0:00:00.000
45:7ca0 0 days 0:00:00.000
44:11a5c 0 days 0:00:00.000
43:14518 0 days 0:00:00.000
41:10994 0 days 0:00:00.000
40:102c0 0 days 0:00:00.000
39:b808 0 days 0:00:00.000
38:fee4 0 days 0:00:00.000
37:101d8 0 days 0:00:00.000
36:334 0 days 0:00:00.000
35:134dc 0 days 0:00:00.000
34:11318 0 days 0:00:00.000
33:eaf0 0 days 0:00:00.000
31:1858 0 days 0:00:00.000
30:11a98 0 days 0:00:00.000
29:e30 0 days 0:00:00.000
28:10840 0 days 0:00:00.000
27:117c0 0 days 0:00:00.000
26:b0f8 0 days 0:00:00.000
25:baf0 0 days 0:00:00.000
24:ffb8 0 days 0:00:00.000
23:11c14 0 days 0:00:00.000
22:145a8 0 days 0:00:00.000
21:145d4 0 days 0:00:00.000
20:12660 0 days 0:00:00.000
19:d7f0 0 days 0:00:00.000
18:230c 0 days 0:00:00.000
17:12378 0 days 0:00:00.000
16:8134 0 days 0:00:00.000
15:12914 0 days 0:00:00.000
13:11fd8 0 days 0:00:00.000
12:13044 0 days 0:00:00.000
11:3ef8 0 days 0:00:00.000
10:1160c 0 days 0:00:00.000
9:13a5c 0 days 0:00:00.000
8:11924 0 days 0:00:00.000
7:12068 0 days 0:00:00.000
6:1386c 0 days 0:00:00.000
5:e73c 0 days 0:00:00.000
4:13b34 0 days 0:00:00.000
3:f4a0 0 days 0:00:00.000
2:10cdc 0 days 0:00:00.000
1:14688 0 days 0:00:00.000

4、切换到46号线程   ~46s

0:000> ~46s
ntdll!NtWaitForMultipleObjects+0x14:
00007ff8`d8ac67c4 c3 ret

5、查看线程的调用栈信息   !clrstack,发现访问redis获取配置信息时存在异常,并重新连接调用信息

0:046> !clrstack
PDB symbol for clr.dll not loaded
OS Thread Id: 0x13320 (46)
Child SP IP Call Site
0000002f001fb3a8 00007ff8d8ac67c4 [HelperMethodFrame_1OBJ: 0000002f001fb3a8] System.Threading.Thread.JoinInternal(Int32)
0000002f001fb4b0 00007ff86780b33a ServiceStack.Redis.RedisNativeClient.Connect()
0000002f001fb580 00007ff86780b1d4 ServiceStack.Redis.RedisNativeClient.TryConnectIfNeeded()
0000002f001fb5c0 00007ff86781590a ServiceStack.Redis.RedisNativeClient.SendReceive[[System.__Canon, mscorlib]](Byte[][], System.Func`1<System.__Canon>, System.Action`1<System.Func`1<System.__Canon>>, Boolean)
0000002f001fb620 00007ff867815cb4 ServiceStack.Redis.RedisNativeClient.SendExpectData(Byte[][])
0000002f001fb690 00007ff867817a22 ServiceStack.Redis.RedisNativeClient.get_Info()
0000002f001fb700 00007ff86780ae9e ServiceStack.Redis.RedisClient.GetServerRole()
0000002f001fb730 00007ff867809ec3 ServiceStack.Redis.RedisResolver.CreateRedisClient(ServiceStack.Redis.RedisEndpoint, Boolean)
0000002f001fb7e0 00007ff867809bed ServiceStack.Redis.PooledRedisClientManager.CreateRedisClient()
0000002f001fb850 00007ff867805d2c ServiceStack.Redis.PooledRedisClientManager.GetClient()
0000002f001fb8f0 00007ff867663e75 ****.****.****.RedisPoolManager.GetClient(System.String)
0000002f001fb9a0 00007ff867663bc4 ****.****.****.CacheService.GetClient()
0000002f001fb9e0 00007ff867662ccd ****.****.****.ServiceConfigCacheService.GetAvailableConfigByCache(Boolean)
0000002f001fbc30 00007ff8676619a1 ****.****.****.ServiceDAC.GetAvailableConfig()
0000002f001fbc70 00007ff867661646 ****.****.****.ServiceConfigCache.GetConfigFromCache()
0000002f001fbcb0 00007ff86766157c ****.****.****.ServiceConfigCache..ctor()
0000002f001fbd10 00007ff86765e778 ****.****.****.ServiceConfigCache.get_Current()
0000002f001fbd80 00007ff86765fadb ****.****.****.TCPRounter.Load()
0000002f001fbee0 00007ff86765ebce ****.****.****.TCPRounter..ctor()
0000002f001fbfc0 00007ff86765d7dd ****.****.****.RounterService.GetService(****.****.****.RounterContext, ****.****.****.ProxyModel, System.Collections.Generic.List`1<System.String>)
0000002f001fc090 00007ff86765de1b ****.****.****.TCPProxy.GetService[[System.__Canon, mscorlib]](System.Collections.Generic.List`1<****.****.****.SPI.ServiceConfig>, Boolean, System.Collections.Generic.List`1<System.String>)
…………

6、!dso 查看线程栈上的托管对象。发现存在redis连接异常,并尝试连接的信息。


0:046> !dso
OS Thread Id: 0x13320 (46)
RSP/REG Object Name
0000002F001FAF50 000001d5482fd000 System.Web.Http.Filters.IExceptionFilter[]
0000002F001FB0D8 000001d5482a32c0 System.Web.AspNetSynchronizationContext
0000002F001FB1F8 000001d7c84548e0 System.Threading.ThreadStart
0000002F001FB248 000001d7c8454858 System.Threading.Thread
0000002F001FB290 000001d5482fd000 System.Web.Http.Filters.IExceptionFilter[]
0000002F001FB2C0 000001d7c8454858 System.Threading.Thread
0000002F001FB348 000001d7c8454818 System.Threading.ThreadStart
0000002F001FB368 000001d7c8454858 System.Threading.Thread
0000002F001FB3D8 000001d5482aa550 System.Security.Principal.GenericPrincipal
0000002F001FB3F0 000001d7c8454818 System.Threading.ThreadStart
0000002F001FB410 000001d5482fd000 System.Web.Http.Filters.IExceptionFilter[]
0000002F001FB420 000001d5482fd2f0 System.Web.Http.Controllers.ExceptionFilterResult
0000002F001FB428 000001d7c8452838 System.Random
0000002F001FB430 000001d54834dd30 System.Threading.ExecutionContext
0000002F001FB440 000001d7c8454858 System.Threading.Thread
0000002F001FB460 000001d5482fd2f0 System.Web.Http.Controllers.ExceptionFilterResult
0000002F001FB488 000001d5482aa550 System.Security.Principal.GenericPrincipal
0000002F001FB490 000001d5482fd2f0 System.Web.Http.Controllers.ExceptionFilterResult
0000002F001FB498 000001d7c8452838 System.Random
0000002F001FB4B0 000001d7c8453d48 System.Func`1[[System.Byte[], mscorlib]]
0000002F001FB4C0 000001d7c8454818 System.Threading.ThreadStart
0000002F001FB4C8 000001d7c8454858 System.Threading.Thread
0000002F001FB550 000001d7c8453d48 System.Func`1[[System.Byte[], mscorlib]]
0000002F001FB558 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB560 000001d7c8453cd8 System.Byte[][]
0000002F001FB568 000001d7c8452838 System.Random
0000002F001FB580 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB5A8 000001d7c8454618 ServiceStack.Redis.RedisRetryableException
0000002F001FB5B0 000001d7c8453cd8 System.Byte[][]
0000002F001FB5D0 000001d7c8454618 ServiceStack.Redis.RedisRetryableException
0000002F001FB5D8 000001d7c8453cd8 System.Byte[][]
0000002F001FB5E8 000001d7c8454148 ServiceStack.Redis.RedisRetryableException
0000002F001FB600 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB608 000001d7c8453cd8 System.Byte[][]
0000002F001FB620 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB628 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB630 000001d7c8453cd8 System.Byte[][]
0000002F001FB638 000001d7c8453d48 System.Func`1[[System.Byte[], mscorlib]]
0000002F001FB650 000001d7c8452838 System.Random
0000002F001FB658 000001d7c8453cf8 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]]
0000002F001FB668 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB670 000001d7c8453cd8 System.Byte[][]
0000002F001FB678 000001d7c8452838 System.Random
0000002F001FB680 000001d5482fd2f0 System.Web.Http.Controllers.ExceptionFilterResult
0000002F001FB690 000001d7c8453cd8 System.Byte[][]
0000002F001FB6A0 000001d5485ae110 System.Byte[]
0000002F001FB6B0 000001d7c8452838 System.Random
0000002F001FB6B8 000001d54858ec78 ServiceStack.Redis.RedisResolver
0000002F001FB6C8 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB6E0 000001d5482fd000 System.Web.Http.Filters.IExceptionFilter[]
0000002F001FB6E8 000001d7c8452838 System.Random
0000002F001FB6F0 000001d5482fd2f0 System.Web.Http.Controllers.ExceptionFilterResult
0000002F001FB700 000001d5485a6c78 ServiceStack.Redis.RedisEndpoint
0000002F001FB718 000001d5485a6c78 ServiceStack.Redis.RedisEndpoint
0000002F001FB720 000001d5485a6c78 ServiceStack.Redis.RedisEndpoint
0000002F001FB788 000001d7c8453140 ServiceStack.Redis.RedisClient
0000002F001FB790 000001d7c8452950 ServiceStack.Redis.RedisClient
0000002F001FB7B0 000001d54858ec78 ServiceStack.Redis.RedisResolver
0000002F001FB7B8 000001d54858e7d8 ServiceStack.Redis.PooledRedisClientManager
0000002F001FB7C0 000001d7c8452818 ServiceStack.Redis.PooledRedisClientManager+<>c__DisplayClass77_0
0000002F001FB7C8 000001d7c8452838 System.Random
0000002F001FB7E0 000001d54858ec78 ServiceStack.Redis.RedisResolver
0000002F001FB810 000001d54858ebe8 System.Object
0000002F001FB828 000001d54858ebc8 System.Collections.Concurrent.ConcurrentStack`1[[ServiceStack.Redis.RedisClient, ServiceStack.Redis]]
0000002F001FB838 000001d5482fd1d0 System.Web.Http.ExceptionHandling.CompositeExceptionLogger
0000002F001FB868 000001d548334ad8 System.Object[] (System.Object[])
0000002F001FB870 000001d7c84527f0 System.Diagnostics.Stopwatch
0000002F001FB8C8 000001d548334ad8 System.Object[] (System.Object[])
0000002F001FB8D0 000001d7c84527f0 System.Diagnostics.Stopwatch
………………

7、使用命令!mex.do2查看redis的访问信息   ,连接的是本服务器上的redis

0:046> !mex.do2 000001d7c8452950
0x000001d7c8452950 ServiceStack.Redis.RedisClient
[statics]
0000 endData : 000001d7c8452ad0 (System.Byte[]) [Length: 2]
0008 lastCommand : NULL
0010 lastSocketException : NULL
0018 socket : NULL
0020 Bstream : NULL
0028 sslStream : NULL
0030 transaction : 000001d7c8452988 (System.Void)
0038 pipeline : NULL
0040 <ClientManager>k__BackingField : NULL
0048 <Host>k__BackingField : 000001d5485a6c20 "127.0.0.1" [9] (System.String)
0050 <NamespacePrefix>k__BackingField : NULL
0058 <Password>k__BackingField : 000001d5485a6b60 "***********" [16] (System.String)
0060 <Client>k__BackingField : NULL
0068 <ConnectionFilter>k__BackingField : NULL
0070 <SendCmdFilter>k__BackingField : NULL
0078 cmdBuffer : 000001d7c8452af0 (System.Collections.Generic.List<System.ArraySegment<System.Byte>>) [Length: 0]
0080 currentBuffer : 000001d7c8452b18 (System.Byte[]) [Length: 1450]
0088 <OnBeforeFlush>k__BackingField : NULL
0090 deactivatedAtTicks : 0 (System.Int64)
0098 LastConnectedAtTimestamp : 0 (System.Int64)
00a0 <Id>k__BackingField : 0 (System.Int64)
00a8 db : 0 (System.Int64)
00b0 clientPort : 0 (System.Int32)
00b4 active : 0 (System.Int32)
00b8 <Port>k__BackingField : 6379 (System.Int32)
00bc <ConnectTimeout>k__BackingField : -1 (System.Int32)
00c0 <RetryCount>k__BackingField : 0 (System.Int32)
00c4 <SendTimeout>k__BackingField : -1 (System.Int32)
00c8 <ReceiveTimeout>k__BackingField : -1 (System.Int32)
00cc <IdleTimeOutSecs>k__BackingField : 240 (System.Int32)
00d0 currentBufferIndex : 0 (System.Int32)
00d4 <Ssl>k__BackingField : False (System.Boolean)
00d5 <IsDisposed>k__BackingField : False (System.Boolean)
00d8 <SslProtocols>k__BackingField : 000001d7c8452a30 (System.Nullable<System.Security.Authentication.SslProtocols>)
00e0 retryTimeout : 000001d7c8452a38 00:00:03 (System.TimeSpan)
00e8 <Name>k__BackingField : NULL
00f0 OnDispose : NULL
00f8 registeredTypeIdsWithinPipelineMap : 000001d7c8452a80 (System.Collections.Generic.Dictionary<System.String,System.Collections.Generic.HashSet<System.String>>)
0100 <Hashes>k__BackingField : 000001d7c8453128 (ServiceStack.Redis.RedisClient+RedisClientHashes)
0108 <Lists>k__BackingField : 000001d7c84530e0 (ServiceStack.Redis.RedisClient+RedisClientLists)
0110 <Sets>k__BackingField : 000001d7c84530f8 (ServiceStack.Redis.RedisClient+RedisClientSets)
0118 <SortedSets>k__BackingField : 000001d7c8453110 (ServiceStack.Redis.RedisClient+RedisClientSortedSets)

8、使用命令!mex.do2查看连接redis抛出的异常,  提示连接redis异常

0:046> !mex.do2 000001d7c8454618
0x000001d7c8454618 ServiceStack.Redis.RedisRetryableException
0000 _className : NULL
0008 _exceptionMethod : NULL
0010 _exceptionMethodString : NULL
0018 _message : 000001d5485afca8 "Socket is not connected" [23] (System.String)
0020 _data : NULL
0028 _innerException : NULL
0030 _helpURL : NULL
0038 _stackTrace : 000001d7c84546f8 (System.SByte[]) [Length: 48]
0040 _watsonBuckets : NULL
0048 _stackTraceString : NULL
0050 _remoteStackTraceString : NULL
0058 _dynamicMethods : NULL
0060 _source : NULL
0068 _safeSerializationManager : 000001d7c84546c0 (System.Runtime.Serialization.SafeSerializationManager)
0070 _xptrs : 0000000000000000 (System.IntPtr)
0078 _ipForWatsonBuckets : 00007ff867815a33 (System.UIntPtr)
0080 _remoteStackIndex : 0 (System.Int32)
0084 _HResult : -2146233088 (System.Int32)
0088 _xcode : -532462766 (System.Int32)
0090 <Code>k__BackingField : NULL

9、问题根因:检查Redis运行窗口,发现redis没有正常启动,重新启动redis,服务访问恢复正常

检测redis 窗口时,发现Redis为hang住的状态,如下图所示:

重启Redis,下图是正常运行的效果:

确定到问题根因: redis属性中【快速编辑模型模式】属性设置为勾选的情况下,启动过程中,点击页面中的位置,会中止启动,此时redis为不可用状态。

三、问题分析方法论总结

1、找和问题相关的因素(锁,运行时间等)

2、定位疑似存在问题的线程,查看线程的堆栈

3、查看堆栈上的托管对象,看到明细的异常信息。

4、明确问题根因

5、修复验证

以上是这个性能问题的总结,分享给大家,希望对大家有所帮助。

张宁涛

2021/12/27

一个网关服务性能问题的Dump分析的更多相关文章

  1. OpenResty从入门到开发一个网关服务(使用etcd作为注册中心)

    简介 OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过揉和众多设计良 ...

  2. Spring Cloud微服务中网关服务是如何实现的?(Zuul篇)

    导读 我们知道在基于Spring Cloud的微服务体系中,各个微服务除了在内部提供服务外,有些服务接口还需要直接提供给客户端,如Andirod.IOS.H5等等. 而一个很尴尬的境地是,如果直接将提 ...

  3. spring cloud 入门系列六:使用Zuul 实现API网关服务

    通过前面几次的分享,我们了解了微服务架构的几个核心设施,通过这些组件我们可以搭建简单的微服务架构系统.比如通过Spring Cloud Eureka搭建高可用的服务注册中心并实现服务的注册和发现: 通 ...

  4. Consul集群加入网关服务(Spring Cloud Gateway)

    Consul集群加入网关服务 架构示意图 外部的应用或网站通过外部网关服务消费各种服务,内部的生产者本身也可能是消费者,内部消费行为通过内部网关服务消费. 一个内部网关和一个外部网关以及一个Consu ...

  5. spring cloud学习笔记五 网关服务zuul

    网关服务是指,客户端发送的请求不用直接访问特定的微服务接口,而且是经过网关服务的接口进行交互,网关服务再去到特定的微服务中进行调用.   网关服务的路由功能和Nginx的反向代理一样,所有的服务都先会 ...

  6. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  7. 性能分析之– JAVA Thread Dump 分析

    最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相关知识整理在一起,输出文章如下. 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Du ...

  8. (转)性能分析之-- JAVA Thread Dump 分析综述

    原文链接:http://blog.csdn.net/rachel_luo/article/details/8920596 最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相 ...

  9. 王院生:Apache APISIX 微服务网关极致性能架构解析

    2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...

随机推荐

  1. MapReduce02 序列化

    目录 MapReduce 序列化 概述 自定义序列化 常用数据序列化类型 int与IntWritable转化 Text与String 序列化读写方法 自定义bean对象实现序列化接口(Writable ...

  2. day10 ajax的基本使用

    day10 ajax的基本使用 今日内容 字段参数之choices(重要) 多对多的三种创建方式 MTV与MVC理论 ajax语法结构(固定的) 请求参数contentType ajax如何传文件及j ...

  3. 大数据学习----day27----hive02------1. 分桶表以及分桶抽样查询 2. 导出数据 3.Hive数据类型 4 逐行运算查询基本语法(group by用法,原理补充) 5.case when(练习题,多表关联)6 排序

    1. 分桶表以及分桶抽样查询 1.1 分桶表 对Hive(Inceptor)表分桶可以将表中记录按分桶键(某个字段对应的的值)的哈希值分散进多个文件中,这些小文件称为桶. 如要按照name属性分为3个 ...

  4. Shell学习(六)——条件判断总结

    Shell学习(六)--条件判断总结 [1]https://www.cnblogs.com/zhw-626/p/8528001.html [2]https://www.cnblogs.com/yizh ...

  5. Element-ui 中对表单进行验证

    Element-ui 中对表单(Form)绑定的对象中的对象属性进行校验 如果是直接绑定属性,是可以的,但是绑定对象中的属性就需要特别处理,需要在rules中添加双引号 " "或者 ...

  6. 【Java 基础】Java Map中的Value值如何做到可以为任意类型的值

    Occasionally the average developer runs into a situation where he has to map values of arbitrary typ ...

  7. java实现数组集合转成json格式

    一.下载fastjson.jar http://repo1.maven.org/maven2/com/alibaba/fastjson 二.项目添加jar包 Java Build Path 三.导入类 ...

  8. 【Word】自动化参考文献-交叉引用

    第一步:设置参考文献标号 开始-定义新编号格式中,定义参考文献式的方框编号: 这里注意不要把他原来的数字去掉 第二步:选择交叉引用 插入-交叉引用: 第三步:更新标号 如果更新标号,使用右键-更新域. ...

  9. Redis篇:持久化、淘汰策略,缓存失效策略

    关注公众号,一起交流,微信搜一搜: 潜行前行 redis 持久化 redis 的数据是保存再系统内存里面的.持久化就是把内存的数据转移到磁盘中,redis 的持久化策略有两种:RDB.AOF RDB ...

  10. UVA10976 分数拆分 Fractions Again?! 题解

    Content 给定正整数 \(k\),找到所有的正整数 \(x \geqslant y\),使得 \(\frac{1}{k}=\frac{1}{x}+\frac{1}{y}\). 数据范围:\(0& ...