2021-07-29

记一次 .NET 某云采购平台API 挂死分析

一:背景

1. 讲故事

大概有两个月没写博客了,关注我的朋友应该知道我最近都把精力花在了星球,这两个月时间也陆陆续续的有朋友求助如何分析dump,有些朋友太客气了,给了大大的红包,哈哈😅,手里面也攒了10多个不同问题类型的dump,后续也会逐一将分析思路贡献出来。

这个dump是一位朋友大概一个月前提供给我的,由于wx里面求助的朋友比较多,一时也没找到相关截图,不得已破坏一下老规矩。😭😭😭

既然朋友说api接口无响应,呈现了hangon现象,从一些过往经验看,大概也只有三种情况。

  • 大量锁等待

  • 线程不够用

  • 死锁

有了这种先入为主的思想,那就上windbg说事呗。

二: windbg 分析

1. 有大量锁等待吗?

要想看是否锁等待,老规矩,看一下 同步块表

0:000> !syncblkIndex SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner-----------------------------Total   1673CCW    3RCW    4ComClassFactory 0Free   397

扑了个空,啥也没有,那就暴力看看所有的线程栈吧。

不看还好,一看吓一跳,有339个线程卡在了 System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object) 处,不过转念一想,就算有339个线程卡在这里,真的会导致程序hangon吗? 也不一定,毕竟我看过有1000+的线程也不会卡死,只不过cpu爆高而已,接下来继续研判一下是不是线程不够用导致,可以从 线程池任务队列 上面入手。

2. 探究线程池队列

可以用 !tp 命令查看。

0:000> !tpCPU utilization: 10%Worker Thread: Total: 328 Running: 328 Idle: 0 MaxLimit: 32767 MinLimit: 4Work Request in Queue: 74 Unknown Function: 00007ffe91cc17d0 Context: 000001938b5d8d98 Unknown Function: 00007ffe91cc17d0 Context: 000001938b540238 Unknown Function: 00007ffe91cc17d0 Context: 000001938b5eec08 ... Unknown Function: 00007ffe91cc17d0 Context: 0000019390552948 Unknown Function: 00007ffe91cc17d0 Context: 0000019390562398 Unknown Function: 00007ffe91cc17d0 Context: 0000019390555b30--------------------------------------Number of Timers: 0--------------------------------------Completion Port Thread:Total: 5 Free: 4 MaxFree: 8 CurrentLimit: 4 MaxLimit: 1000 MinLimit: 4

从输出信息看,线程池中328个线程全部打满,工作队列中还有74位客人在等待,综合这两点信息就已经很清楚了,本次hangon是由于大量的客人到来超出了线程池的接待能力所致。

3. 接待能力真的不行吗?

这个标题我觉得很好,真的不行吗? 到底行不行,可以从两点入手:

  • 是不是代码写的烂?

  • qps是不是真的超出了接待能力?

要想找出答案,还得从那 339 个卡死的线程说起,仔细研究了下每一个线程的调用栈,大概卡死在这三个地方。

<1>. GetModel

public static T GetModel<T, K>(string url, K content){	T result = default(T);	HttpClientHandler httpClientHandler = new HttpClientHandler();	httpClientHandler.AutomaticDecompression = DecompressionMethods.GZip;	HttpClientHandler handler = httpClientHandler;	using (HttpClient httpClient = new HttpClient(handler))	{		string content2 = JsonConvert.SerializeObject((object)content);		HttpContent httpContent = new StringContent(content2);		httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");		string mD5ByCrypt = Md5.GetMD5ByCrypt(ConfigurationManager.AppSettings["SsoToken"] + DateTime.Now.ToString("yyyyMMdd"));		httpClient.DefaultRequestHeaders.Add("token", mD5ByCrypt);		httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));		HttpResponseMessage result2 = httpClient.PostAsync(url, httpContent).Result;		if (result2.IsSuccessStatusCode)		{			string result3 = result2.Content.ReadAsStringAsync().Result;			return JsonConvert.DeserializeObject<T>(result3);		}		return result;	}}

<2>. Get

public static T Get<T>(string url, string serviceModuleName){	try	{		T val3 = default(T);		HttpClient httpClient = TryGetClient(serviceModuleName, true);		using (HttpResponseMessage httpResponseMessage = httpClient.GetAsync(GetRelativeRquestUrl(url, serviceModuleName, true)).Result)		{			if (httpResponseMessage.IsSuccessStatusCode)			{				string result = httpResponseMessage.Content.ReadAsStringAsync().Result;				if (!string.IsNullOrEmpty(result))				{					val3 = JsonConvert.DeserializeObject<T>(result);				}			}		}		T val4 = val3;		val5 = val4;		return val5;	}	catch (Exception exception)	{		throw;	}}

<3>. GetStreamByApi

public static Stream GetStreamByApi<T>(string url, T content){	Stream result = null;	HttpClientHandler httpClientHandler = new HttpClientHandler();	httpClientHandler.AutomaticDecompression ......

原文转载:http://www.shaoqun.com/a/892247.html

跨境电商:https://www.ikjzd.com/

西农:https://www.ikjzd.com/w/1368

亚马逊全球开店:https://www.ikjzd.com/w/1299

beien:https://www.ikjzd.com/w/1336


一:背景1.讲故事大概有两个月没写博客了,关注我的朋友应该知道我最近都把精力花在了星球,这两个月时间也陆陆续续的有朋友求助如何分析dump,有些朋友太客气了,给了大大的红包,哈哈😅,手里面也攒了10多个不同问题类型的dump,后续也会逐一将分析思路贡献出来。这个dump是一位朋友大概一个月前提供给我的,由于wx里面求助的朋友比较多,一时也没找到相关截图,不得已破坏一下老规矩。😭😭😭既然朋友
亚马逊 海外购:https://www.ikjzd.com/w/998
yeepay:https://www.ikjzd.com/w/2574
四川省2011年旅游会议今日召开 :http://www.30bags.com/a/409061.html
四川省679家A级旅游景区已限流开放218家:http://www.30bags.com/a/426544.html
四川省阿坝州理县各族群众欢度"若木纽"节 :http://www.30bags.com/a/413886.html
四川省德阳市绵竹市发生4.0级地震_蛙步报告 :http://www.30bags.com/a/409990.html
一女多男两根同时进去小说 娇嫩的被三根粗大的:http://lady.shaoqun.com/a/248205.html
口述:小姨子与姐夫之间那些不要脸的事儿(中)(5/5):http://lady.shaoqun.com/a/82893.html
招生在高校旁边开酒店的推广方式有争议:http://lady.shaoqun.com/a/428527.html
为什么大学附近有那么多小旅馆?大学生不都住校园吗?:http://lady.shaoqun.com/a/428528.html
大学周边的酒店往往供不应求。他们在里面做什么?你有过难忘的经历吗?:http://lady.shaoqun.com/a/428529.html
女人给你这四个暗示是因为想和你发生关系!:http://lady.shaoqun.com/a/428530.html

No comments:

Post a Comment