国色天香在线观看全集免费播放

你的位置:国色天香在线观看全集免费播放 > 国产美女裸体无遮挡免费视频 > 国产美女裸体无遮挡免费视频

记一次 .NET 某药品仓储不休系统 卡死分析

发布日期:2022-06-18 17:03    点击次数:110

记一次 .NET 某药品仓储不休系统 卡死分析

一:布景 1. 讲故事

这个月初,有位至好wx上找到我,说他的api过一段技巧后,就会出现唯有肯求,莫得反应的情况,截图如下:

从至好的形容中看神气门径是被什么东西卡住了,这种卡死的问题贬责起来相对苟简,接下来我就用 windbg 给众人分析一下。

二:Windbg 分析 1. Request 肯求正在干嘛?

既然至好说 api 有 request 无 response,那如何去考证至好的话对分袂呢?咱们都澄莹 .NET 用 HttpContext 来示意一个肯求,话里有话等于不错去抓 HttpContext 下的时长属性,Netext 中有一个 !whttp 号召不错匡助咱们。

0:000> !whttp HttpContext    Thread Time Out Running  Status Verb     Url 000000563bf803b0   42 00:01:50 00:01:24    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=x-HN 000000563bf84660   -- 00:01:50 Finished    200 GET      http://xxx.com:30003/ 000000563c4a0470   51 00:01:50 00:00:12    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx2C 00000056bbf63590   30 00:01:50 00:02:41    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx-B2C 00000056bc82a038   -- 00:01:50 Finished    200 GET      http://localhost:30003/ 00000056bc84a3e8   44 00:01:50 00:00:51    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=x 00000056bc8671c8   46 00:01:50 00:00:45    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx-B2C 000000573bf44698   35 00:01:50 00:02:39    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=x 000000573bf483c0   33 00:01:50 00:02:41    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=x-HN 000000573bf97e80   40 00:01:50 00:02:32    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=ZJB2C 000000573c583b08   -- 00:01:50 Finished    200 GET      http://localhost:30003/ 000000573c589ec8   -- 00:01:50 Finished    200 GET      http://xxx.com:30003/Wms/xxx/xxx/xxx 000000573c760e28   -- 00:01:50 Finished    200 POST     http://xxx.com:30003/Wms/xxx/xxx/xxx 000000573c95f990   48 00:01:50 00:00:31    200 POST     http://xxx.com:30003/Wms/Common/xxx?xxx=xxx&xxx=x-HN 00000057bbf4f8e8   31 00:01:50 00:02:12    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=x 00000057bc080340   50 00:01:50 00:00:19    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=x 000000583c4aee80   43 00:01:50 00:01:11    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx2B 000000583c4d0c50   53 00:01:50 00:00:01    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx2B 00000058bbf8f1a0   34 00:01:50 00:02:22    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx2B 000000593bfe1758   41 00:01:50 00:01:22    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx2C 000000593c892160   -- 00:01:50 Finished    200 GET      http://xxx.com:30003/Wms/xxx/xxx/xxxJob 000000593ca813b0   45 00:01:50 00:00:30    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx-HN 000000593caa45d8   -- 00:01:50 Finished    200 GET      http://xxx.com:30003/ 00000059bc1ad808   32 00:01:50 00:01:45    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=xxx-B2C 00000059bc1c3d70   36 00:01:50 00:01:29    200 POST     http://xxx.com:30003/Wms/xxx/xxx?xxx=xxx&xxx=x  25 HttpContext object(s) found matching criteria 

从 Running 列不错看到大多肯求都一经达到1分钟以上,这也考证了至好所说的卡死问题,按照造就,不错取 Running 列中最大的 httpContext 地点的线程,也等于上头的 30 和 33 号线程, 望望它们都在干什么?

2. 议论 Running 最长线程

接下来切到 30 和 33 号线程,望望它们的线程栈。

0:000> ~30s ntdll!NtWaitForSingleObject+0xa: 00007ffd`b81f024a c3              ret 0:030> !clrstack  OS Thread Id: 0x29d0 (30)         Child SP               IP Call Site 0000005acc3ac590 00007ffdb81f024a [PrestubMethodFrame: 0000005acc3ac590] xxx.xxx.RedisConnectionHelp.get_Instance() 0000005acc3ac850 00007ffd4dd78911 xxx.xxx.RedisCache..ctor(Int32,
欧美在线视频 System.String) 0000005acc3ac8c0 00007ffd4dd78038 xxx.xxx.CacheByRedis.HashGet[[System.__Canon, mscorlib]](System.String, System.String, Int32) 0000005acc3ac968 00007ffdabef1f7c [StubHelperFrame: 0000005acc3ac968]  0000005acc3ac9c0 00007ffd4dd77f18 xxx.xxx.Cache.xxx.GetCacheNotAreaDataEntity[[System.__Canon, mscorlib]](System.String, System.String, System.String)  ...  0:030> ~33s ntdll!NtWaitForMultipleObjects+0xa: 00007ffd`b81f07ba c3              ret 0:033> !clrstack  OS Thread Id: 0x3ad4 (33)         Child SP               IP Call Site 0000005accabae90 00007ffdb81f07ba [GCFrame: 0000005accabae90]  0000005accabafb8 00007ffdb81f07ba [HelperMethodFrame_1OBJ: 0000005accabafb8] System.Threading.Monitor.ObjWait(Boolean, Int32,国产美女裸体无遮挡免费视频 System.Object) 0000005accabb0d0 00007ffdaac60d64 System.Threading.ManualResetEventSlim.Wait(Int32, System.Threading.CancellationToken) 0000005accabb160 00007ffdaac5b4bb System.Threading.Tasks.Task.SpinThenBlockingWait(Int32, System.Threading.CancellationToken) 0000005accabb1d0 00007ffdab5a01d1 System.Threading.Tasks.Task.InternalWait(Int32, System.Threading.CancellationToken) 0000005accabb2a0 00007ffdab59cfa7 System.Threading.Tasks.Task`1[[System.__Canon, mscorlib]].GetResultxxx(Boolean) 0000005accabb2e0 00007ffd4d8d338f xxx.Config.xxx.Config`1[[System.__Canon, mscorlib]].GetConfig(xxx.Config.Model.ConfigListener, System.Func`2<xxx.Config.Request.GetConfigRequest,System.Threading.Tasks.Task`1<System.String>>) 0000005accabb340 00007ffd4d8d2f40 xxx.Config.xxx.Config`1[[System.__Canon, mscorlib]].get_Item(System.String, System.String) 0000005accabb3c0 00007ffd4dd78f7f xxx.Util.BaseConfig.get_GetRedisConn() 0000005accabb440 00007ffd4dd78e9c xxx.xxx.RedisConnectionHelp.GetConnectionString() 0000005accabb4a0 00007ffd4dd789cb xxx.xxx.RedisConnectionHelp..cctor() 0000005accabb940 00007ffdabef6953 [GCFrame: 0000005accabb940]  0000005accabc5b0 00007ffdabef6953 [PrestubMethodFrame: 0000005accabc5b0] xxx.xxx.RedisConnectionHelp.get_Instance() 0000005accabc870 00007ffd4dd78911 xxx.xxx.RedisCache..ctor(Int32, System.String) 0000005accabc8e0 00007ffd4dd78038 xxx.xxx.CacheByRedis.HashGet[[System.__Canon, mscorlib]](System.String, System.String, Int32) 0000005accabc988 00007ffdabef1f7c [StubHelperFrame: 0000005accabc988]  0000005accabc9e0 00007ffd4dd77f18 xxx.Core.Cache.xxx.GetCacheNotAreaDataEntity[[System.__Canon, mscorlib]](System.String, System.String, System.String) ... 

上头的信息不难发现 30 号线程正卡在 RedisConnectionHelp.get_Instance() 处,33 号线一经插足了 RedisConnectionHelp.get_Instance() 法式中,终末在 GetConfig() 处恭候 Result 的效果,按造就来说,30 号线程看神气正在锁恭候, 33 号正在恭候异步效果,接下来的阻挠点等于议论下 RedisConnectionHelp.Instance 处代码。

3. 寻找问题代码

接下来用反编译用具 ILSpy 找到问题代码。

public static class RedisConnectionHelp {  public static ConnectionMultiplexer Instance  {   get   {    if (_instance == null)    {     lock (Locker)     {      if (_instance == null