精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

記一次.NET某旅行社Web站CPU爆高分析

商務辦公 后端
我看了下這個 Session_Start 方法中,大概有 105 個 Application[xxx],也就意味著有 105 個 lock 等著當前線程去闖關。。。而此時有近800個線程已進入到此方法中,合計一下不少于 8W個鎖等著這些線程去闖,在配上被迫的海量cpu時間片切換,喚醒再休眠,休眠再喚醒,大家相互交錯一起把 cpu 給抬起來了。

 [[399697]]

本文轉載自微信公眾號「一線碼農聊技術」,作者一線碼農聊技術。轉載本文請聯系一線碼農聊技術公眾號。

一:背景

1. 講故事

前幾天有位朋友wx求助,它的程序內存經常飆升,cpu 偶爾飆升,沒找到原因,希望幫忙看一下。

可惜發過來的 dump 只有區區2G,能在這里面找到內存溢出那真有兩把刷子。。。??????,所以我還是希望他的程序內存漲到 5G+ 的時候再給我看看,既然內存看不了,那就看看這個偶爾飆升的CPU是個啥情況?老辦法,上windbg說話。

二:windbg 分析

1. CPU 到底是多少

要想查看這個快照生成時機器的cpu使用率,可以使用 !tp 命令。

  1. 0:033> !tp 
  2. CPU utilization: 93% 
  3. Worker Thread: Total: 800 Running: 800 Idle: 0 MaxLimit: 800 MinLimit: 320 
  4. Work Request in Queue: 3203 
  5.     Unknown Function: 000007fefb551500  Context: 000000002a198480 
  6.     Unknown Function: 000007fefb551500  Context: 0000000028a70780 
  7.     Unknown Function: 000007fefb551500  Context: 000000002a182610 
  8.     Unknown Function: 000007fefb551500  Context: 00000000262a2700 

本以為一個簡單的命令,結果屏幕上呼啦啦的一堆。。。有點意外,從上面的卦象看:當前CPU利用率是 93%,沒毛病,確實是CPU飆升,比較驚訝的是,線程池上限800個線程全部被打滿,太悲壯了。。。可更悲壯的是線程池隊列中還有 3203 個待處理的任務,可以猜測程序不僅高CPU,還有掛死現象。。。

接下來的問題是:這800個壯士到底怎么啦,程序現在正是用人之際,要想找出答案,還是按照我的慣性思維,查看同步塊表。

2. 線程同步塊表

要想查看同步塊表,可以使用 !synblk 命令。

  1. 0:033> !syncblk 
  2. Index SyncBlock MonitorHeld Recursion Owning Thread Info  SyncBlock Owner 
  3.   188 0000000010defc28            1         1 000000001e8fb400 9f4 715   00000003ff1e3d80 System.Web.HttpApplicationStateLock 
  4. 126159 000000001e424e28            1         1 0000000023425e00 1f14 695   0000000301210038 ASP.global_asax 
  5. 126173 00000000281acaf8            1         1 0000000024b8ea70 24ec 785   00000000ff8c5e10 ASP.global_asax 
  6. 126289 00000000247a4068            1         1 0000000027ee93c0 808 413   0000000306aca288 ASP.global_asax 
  7. 126368 0000000027180dd8            1         1 0000000028005cb0 1e7c 650   00000002008d6280 ASP.global_asax 
  8. 126489 0000000027211dd8            1         1 0000000026862420 ec4 220   000000030611a290 ASP.global_asax 
  9. 126788 00000000247924b8            1         1 0000000021871ff0 2784 529   00000004039901a8 ASP.global_asax 
  10. 126843 00000000285b8d28            1         1 000000001cbd6710 2170 456   00000004007ec748 ASP.global_asax 
  11. 126934 0000000021b212b8            1         1 0000000026ca7590 16cc 472   000000030090e810 ASP.global_asax 
  12. 127251 0000000024769188            1         1 000000002831eaf0 2b68 648   0000000207051038 ASP.global_asax 
  13. ... 
  14.  
  15. ----------------------------- 
  16. Total           141781 
  17. CCW             2 
  18. RCW             4 
  19. ComClassFactory 0 
  20. Free            140270 

我去,又是呼啦啦的一堆,從上面的卦象可以看出兩點信息:

  • MonitorHeld: 1

表示當前有一個線程正在持有鎖。

  • ASP.global_asax , System.Web.HttpApplicationStateLock

表示當前線程持有的對象。

不過綜合來看有點奇怪,除了第一個線程持有 HttpApplicationStateLock,后面所有的線程持有的 ASP.global_asax 對象都有不同的內存地址:0000000301210038,00000000ff8c5e10,感覺lock的對象不是線程共享式的 static,更像是一個 instance,蠻有意思的,接下來抽兩個線程看看它的線程棧,比如這里的:715,695。

3. 查看線程棧

要想查看線程棧,可以用 !clrstack 命令。

從這兩個線程棧上看,分別是卡在 xxx.MvcApplication.Session_Start 方法中的 System.Threading.Monitor.Enter(System.Object) 和 System.Threading.Monitor.ObjWait ,總的來說這里的 Session_Start 方法肯定是有問題的,所以得想辦法把源碼導出來看一看。

4. 查看問題代碼

要想導出 Session_Start 方法,使用組合命令 !ip2md + !savemodule 即可。

  1. ||2:2:1781> !ip2md 000007fe99c6f0c5 
  2. MethodDesc:   000007fe990fe080 
  3. Method Name:  xxx.xxx.xxx.MvcApplication.Session_Start(System.Object, System.EventArgs) 
  4. Class:        000007fe991ae0c0 
  5. MethodTable:  000007fe990fe238 
  6. mdToken:      0000000006000119 
  7. Module:       000007fe990fd750 
  8. IsJitted:     yes 
  9. CodeAddr:     000007fe99c6e1f0 
  10. Transparency: Critical 
  11. ||2:2:1781> !savemodule 000007fe990fd750 E:\dumps\Session_Start.dll 
  12. 3 sections in file 
  13. section 0 - VA=2000, VASize=17538, FileAddr=200, FileSize=17600 
  14. section 1 - VA=1a000, VASize=3ac, FileAddr=17800, FileSize=400 
  15. section 2 - VA=1c000, VASize=c, FileAddr=17c00, FileSize=200 

然后借助 ILSpy 反編譯工具查看,由于比較敏感,我就多模糊一點,請大家見諒!

看完上面的代碼,我其實有一點不解,既然是往 Application 中賦值,為啥不提取到 Application_Start 中呢?我猜測開發人員也是無所謂,怎么方便怎么來,接下來看一下 Application 的源碼。

  1. public sealed class HttpApplicationState : NameObjectCollectionBase 
  2.     private HttpApplicationStateLock _lock = new HttpApplicationStateLock(); 
  3.  
  4.     public void Set(string name, object value) 
  5.     { 
  6.         _lock.AcquireWrite(); 
  7.         try 
  8.         { 
  9.             BaseSet(name, value); 
  10.         } 
  11.         finally 
  12.         { 
  13.             _lock.ReleaseWrite(); 
  14.         } 
  15.     } 
  16.  
  17. internal class HttpApplicationStateLock : ReadWriteObjectLock 
  18.     internal override void AcquireWrite() 
  19.     { 
  20.         int currentThreadId = SafeNativeMethods.GetCurrentThreadId(); 
  21.         if (_threadId == currentThreadId) 
  22.         { 
  23.             _recursionCount++; 
  24.             return
  25.         } 
  26.         base.AcquireWrite(); 
  27.         _threadId = currentThreadId; 
  28.         _recursionCount = 1; 
  29.     } 
  30.  
  31.     internal override void ReleaseWrite() 
  32.     { 
  33.         int currentThreadId = SafeNativeMethods.GetCurrentThreadId(); 
  34.         if (_threadId == currentThreadId && --_recursionCount == 0) 
  35.         { 
  36.             _threadId = 0; 
  37.             base.ReleaseWrite(); 
  38.         } 
  39.     } 
  40.  
  41. internal class ReadWriteObjectLock 
  42.     internal virtual void AcquireWrite() 
  43.     { 
  44.         lock (this) 
  45.         { 
  46.             while (_lock != 0) 
  47.             { 
  48.                 try 
  49.                 { 
  50.                     Monitor.Wait(this); 
  51.                 } 
  52.                 catch (ThreadInterruptedException) 
  53.                 { 
  54.                 } 
  55.             } 
  56.             _lock = -1; 
  57.         } 
  58.     } 
  59.     internal virtual void ReleaseWrite() 
  60.     { 
  61.         lock (this) 
  62.         { 
  63.             _lock = 0; 
  64.             Monitor.PulseAll(this); 
  65.         } 
  66.     } 

代碼有點長,但總的來說這里的代碼不簡單,Application 通過 lock 自己封裝了一個 讀寫鎖,不簡單歸不簡單,但這里有什么問題呢 ? 就算寫錯了地方貌似也不會造成 cpu 爆高吧?

其實這里涉及到了一個概念:那就是 lock convoys (鎖護送)

5. lock convoys (鎖護送)

關于什么是 lock convoys ,這里我截一張圖,大家仔細品品。

這也是 無鎖編程 一直在抨擊的現象。

三:總結

我看了下這個 Session_Start 方法中,大概有 105 個 Application[xxx],也就意味著有 105 個 lock 等著當前線程去闖關。。。而此時有近800個線程已進入到此方法中,合計一下不少于 8W個鎖等著這些線程去闖,在配上被迫的海量cpu時間片切換,喚醒再休眠,休眠再喚醒,大家相互交錯一起把 cpu 給抬起來了。

解決方法很簡單,盡最大努力降低這些 串行lock 的個數,能降到一個甚至沒有就更好了 ??????。

  • 對 Application 的賦值全部提取到 Application_Start 中,畢竟程序啟用時無人競爭。
  • 盡量將 單行賦值 改成 批量賦值。 

 

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2021-10-27 07:30:32

.NETCPU論壇

2024-08-08 11:21:01

2021-04-21 07:38:41

CPU游戲站程序

2022-10-24 07:48:37

.NETCPUGC

2024-12-31 09:36:06

2023-05-12 17:42:22

CPUMES系統

2024-03-15 15:15:53

.NETCPU系統

2023-07-31 22:29:20

CPU.NETAPI

2022-02-23 10:12:58

CPUWeb.NET

2023-11-01 10:46:12

.NET線程同步

2023-06-26 00:12:46

2024-12-27 13:31:18

.NETdump調試

2024-03-28 12:56:36

2023-04-06 10:52:18

2011-09-19 18:32:50

GtrotFacebook

2024-05-20 09:39:02

.NETurl線程池

2023-07-06 10:11:38

.NET模式dump

2023-09-27 07:23:10

.NET監控軟件

2023-03-26 20:24:50

ERP網站系統

2024-03-26 00:44:53

.NETCIM系統
點贊
收藏

51CTO技術棧公眾號

日本在线天堂| 免费观看一级视频| 国产亚洲人成a在线v网站| 欧美大胆一级视频| 亚洲自拍偷拍区| 国产亚洲精品久久久久久无几年桃| 国产精品丝袜在线播放| 色视频一区二区| 天天想你在线观看完整版电影免费| 国产自产一区二区| 日韩电影在线观看电影| 欧美日韩国产91| 我不卡一区二区| 超碰地址久久| 在线播放国产精品二区一二区四区 | 欧美日韩综合在线观看| 久久视频在线| 精品无人区太爽高潮在线播放 | 中文字幕一区二区人妻痴汉电车 | 国产欧美一区二区三区鸳鸯浴| 91久久精品国产| 国产午夜麻豆影院在线观看| 欧美国产激情| 伊人久久影院| 亚洲激情自拍视频| 亚洲国产欧美不卡在线观看| 欧美在线精品一区二区三区| 国产精品影视在线观看| 国产精品久久久久91| 日韩三级一区二区三区| 午夜精品久久| 久久成人人人人精品欧| 国产午夜精品福利视频| 外国成人在线视频| 精品成人佐山爱一区二区| www.国产福利| 免费视频观看成人| 在线亚洲一区二区| 精品国产成人av在线免| 日韩电影毛片| 岛国av一区二区| 国产精品一区二区免费在线观看| 婷婷av在线| 亚洲免费观看高清| 国产精品久久成人免费观看| 日本暖暖在线视频| 国产精品久久久久久福利一牛影视 | 中文字幕欧美三区| 日韩欧美精品久久| 国产人成在线视频| 亚洲国产高清在线| 亚洲第一综合| 欧美videos极品另类| 国产精品黄色在线观看| 一区二区三区久久网| 日本电影全部在线观看网站视频| 国产欧美日韩麻豆91| 日韩欧美视频一区二区三区四区| 免费在线一级视频| 国产欧美精品在线观看| 亚洲精品高清国产一线久久| 91大神在线网站| 中文字幕中文乱码欧美一区二区| 在线观看日韩羞羞视频| 国产av熟女一区二区三区| 亚洲aaaaaaa| 91免费看`日韩一区二区| 欧美大香线蕉线伊人久久| 欧美女优在线| 国产精品欧美久久久久一区二区| 亚洲欧洲精品一区二区| 九义人在线观看完整免费版电视剧| 中文字幕一区二区三中文字幕| 国产成人免费高清视频| 欧美1—12sexvideos| 午夜久久电影网| 精品久久久久久久无码| 亚洲a成人v| 精品久久人人做人人爰| 99久久久无码国产精品性 | 一区二区三区在线观看www| 欧美日韩在线看片| 亚洲电影一区二区三区| 欧美三级一级片| 国产精品黄色片| 日韩一区二区三区av| 亚洲色偷偷色噜噜狠狠99网| 精品国产91| 九色精品美女在线| 午夜婷婷在线观看| 国内精品久久久久影院色| 国产精品一 二 三| a黄色在线观看| 一区二区三区欧美日| 国产亚洲综合视频| 国产精品久久久久久久久久辛辛 | 久久久视频6r| 欧美日本精品| 国产成人一区二区三区| 国内毛片毛片毛片毛片| 久久午夜老司机| 中文字幕乱码一区二区三区| 日本不卡免费高清视频在线| 在线播放/欧美激情| 亚洲综合网在线观看| 午夜日韩激情| av一本久道久久综合久久鬼色| 91亚洲精品久久久久久久久久久久| 全部免费毛片在线播放一个| 国产精品久久久久桃色tv| 波多野结衣之无限发射| 麻豆精品久久| 中文字幕久久亚洲| 日本在线播放视频| 国产a区久久久| 一本久道久久综合| 色婷婷综合久久久中字幕精品久久| 日韩一区二区在线观看视频播放| 亚洲最大成人网站| 亚洲日产国产精品| 99国产高清| 黄色片网站在线| 欧美四级电影网| 亚洲午夜福利在线观看| 极品尤物久久久av免费看| 91免费欧美精品| 电影av在线| 色婷婷综合在线| a视频免费观看| 激情欧美一区| 国产传媒一区二区| 亚洲wwwww| 日韩午夜中文字幕| 国产97免费视频| 极品少妇xxxx精品少妇| 亚洲欧洲日韩综合二区| 日韩一区二区三区在线免费观看| 国产午夜精品久久久| 国产三级av片| 91一区一区三区| 国产日韩一区二区在线| 国产乱人伦精品一区| 久久久久国产视频| 老熟妇高潮一区二区高清视频| 亚洲久本草在线中文字幕| 激情久久综合网| 欧美在线看片| 国产激情一区二区三区在线观看 | 国内自拍欧美激情| 蜜臀久久精品久久久久| 亚洲不卡av一区二区三区| 老司机午夜免费福利| 国产精品老熟女视频一区二区| 国产成人鲁色资源国产91色综| 97超碰人人爱| 爱高潮www亚洲精品| 欧美激情中文网| 色婷婷中文字幕| 黑人极品videos精品欧美裸| 黄色aaa视频| 日韩精品久久理论片| 亚洲激情一区二区三区| 91精品国产色综合久久不卡粉嫩| 久久国产精品偷| 理论片中文字幕| 粉嫩老牛aⅴ一区二区三区| xxxxx在线观看| 看片的网站亚洲| 成年人视频网站免费| 风间由美中文字幕在线看视频国产欧美 | 欧美日韩1区2区| 我要看黄色一级片| 不卡一区在线观看| 爱情岛论坛成人| 一区二区三区四区在线观看国产日韩 | 超碰在线一区| 国产精品电影一区| 黄色网页在线免费观看| 亚洲韩国青草视频| 久久久久久av无码免费看大片| 一区二区中文视频| 国产精品无码一区二区三| 日韩成人午夜电影| 4444亚洲人成无码网在线观看| 狼人精品一区二区三区在线| 国产精品久久久久77777| 性欧美猛交videos| 亚洲人精品午夜在线观看| 一二三区中文字幕| 亚洲成人一二三| 夫妇露脸对白88av| 高清成人免费视频| 免费看黄色一级大片| 国产精品迅雷| 中文久久乱码一区二区| 午夜精品久久久久久久99热影院| 亚洲国产免费| 亚洲伊人婷婷| 日韩精品社区| 91亚洲永久免费精品| xxxxxx欧美| 欧美国产日韩一区二区| 久久久pmvav| 精品久久久久久久久久久院品网| 成人免费一级片| 亚洲成人动漫一区| 欧美日韩黄色网| 久久久综合网站| 亚洲少妇一区二区三区| 精品亚洲成a人在线观看| 99精品视频在线看| 欧美三级网页| 中文字幕在线亚洲三区| 九九热爱视频精品视频| 国产精品制服诱惑| 深夜激情久久| 成人国产精品日本在线| 日韩制服诱惑| 26uuu日韩精品一区二区| 欧美一卡二卡| 不卡av在线网站| av电影在线观看网址| 精品无码久久久久久国产| 十八禁一区二区三区| 欧美一级爆毛片| 国产乱人乱偷精品视频a人人澡| 色综合天天综合网国产成人综合天 | 免费看男男www网站入口在线| 精品国产髙清在线看国产毛片| 国产精品乱码久久久| 欧美日韩高清一区二区不卡| 久久精品99北条麻妃| 日韩欧美精品在线观看| 国产又爽又黄的视频| 天天操天天干天天综合网| 久久综合亚洲色hezyo国产| 亚洲激情六月丁香| 九九免费精品视频| 亚洲精品国产一区二区三区四区在线| 精品女人久久久| 黄色一级大片在线免费看产| 日韩一区二区高清| 99热这里只有精品9| 91精品国产综合久久久久久漫画 | 日韩美女一区二区三区| 亚洲AV无码精品色毛片浪潮| 欧美一区二区三区日韩视频| 国产精品高潮呻吟av| 911精品国产一区二区在线| 国产精品午夜福利| 91麻豆精品国产91久久久使用方法| 曰批又黄又爽免费视频| 欧美精品粉嫩高潮一区二区| 国产精品久久久久久久免费看| 欧美男男青年gay1069videost| 一区二区三区播放| 91精品久久久久久蜜臀| 亚洲AV无码精品自拍| 亚洲成人久久久| 香港三日本三级少妇66| 国产视频在线观看一区二区| 免费人成黄页在线观看忧物| 色偷偷亚洲男人天堂| 麻豆av在线导航| 欧美大片在线看免费观看| 国产三级伦理在线| 欧美一级淫片丝袜脚交| se69色成人网wwwsex| 91色精品视频在线| 97色成人综合网站| 欧美日韩精品一区| 婷婷综合亚洲| 很污的网站在线观看| 久久激情网站| 亚洲天堂伊人网| 不卡高清视频专区| 阿v天堂2014| 亚洲一区在线观看免费观看电影高清 | aaaaaaaa毛片| 成人涩涩免费视频| x88av在线| 亚洲激情图片小说视频| 91video| 欧美一区二区三区免费视频 | 一区二区三区日本视频| 国产高清不卡av| 成人激情免费视频| 91免费国产精品| 欧美孕妇性xxxⅹ精品hd| 在线不卡国产精品| 黄视频在线免费看| 国产精品久久久久久久久男| а√中文在线天堂精品| 日韩中文字幕一区| 136国产福利精品导航网址| 国产三级三级三级看三级| 国产99精品国产| 中国美女黄色一级片| 午夜欧美在线一二页| 国产精品毛片久久久久久久av| 亚洲国产精品女人久久久| 动漫一区在线| 国产精品久久激情| 奇米影视777在线欧美电影观看| 中文字幕欧美日韩一区二区三区 | 91大神在线播放精品| 精品91福利视频| 视频一区视频二区视频| 日韩天天综合| 一本之道在线视频| 国产精品天天看| 国产91精品一区| 亚洲精品在线网站| 中文字幕在线观看播放| 国产精品电影一区| 亚洲尤物av| 少妇高潮毛片色欲ava片| 国产一区二区美女| 强制高潮抽搐sm调教高h| 色诱视频网站一区| 天天av综合网| 国产69精品久久久久99| 日韩一二三区| xxxxxx在线观看| 精品一区二区三区的国产在线播放| 91中文字幕永久在线| 午夜成人免费电影| 欧美一级免费片| 欧美激情一二区| 视频免费一区二区| 日韩不卡一二区| 狠狠色狠狠色综合系列| 毛片视频免费播放| 欧美日韩综合不卡| 最新国产在线观看| 国产精品入口日韩视频大尺度 | 懂色av粉嫩av蜜臀av| 蜜乳av一区二区三区| 粉嫩精品久久99综合一区| 欧洲国内综合视频| 成人亚洲性情网站www在线观看| 国产成人精品电影久久久| 亚洲美女久久| 少妇人妻互换不带套| 国产日韩精品视频一区| 原创真实夫妻啪啪av| 狠狠综合久久av一区二区蜜桃| 日本人妻伦在线中文字幕| 国产乱国产乱300精品| 国产高潮国产高潮久久久91| 69久久99精品久久久久婷婷| 国产剧情在线| 99国产超薄肉色丝袜交足的后果| 国模吧视频一区| 内射中出日韩无国产剧情| 日韩欧美福利视频| 9191在线| 亚洲www在线观看| 伊人久久成人| av直播在线观看| 欧美视频在线一区| 99热国产在线中文| 国产精品一 二 三| 三级成人在线视频| 多男操一女视频| 日韩美女主播在线视频一区二区三区| cao在线视频| 日韩国产美国| 国产一区美女在线| 国产精品第一页在线观看| 国产丝袜高跟一区| 亚洲欧洲一二区| 久青草视频在线播放| 久久丝袜美腿综合| 国产又粗又猛又黄又爽无遮挡| 欧美国产日本在线| 九九热爱视频精品视频| 91亚洲一区二区| 第一福利永久视频精品| 一区二区三区视频网站| 成人自拍视频网站| 天堂精品中文字幕在线| 2025国产精品自拍| 亚洲免费视频网站| 99精品视频在线免费播放| 成人性免费视频| 国产精品伦一区二区三级视频| 亚洲av无码片一区二区三区| 青青草国产精品一区二区| 一区二区日韩欧美| 久久精品国产亚洲AV熟女| 91精品国产色综合久久不卡蜜臀| 末成年女av片一区二区下载| 正在播放国产精品| 91蝌蚪porny九色| 国产毛片在线视频| 国产成人综合精品在线| 国产一区二区三区自拍| 国产午夜精品福利视频| 亚洲精品v欧美精品v日韩精品|