范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

记一次。NET某医保平台CPU爆高分析

  一:背景1. 讲故事
  一直在追这个系列的朋友应该能感受到,我给这个行业中无数的陌生人分析过各种dump,终于在上周有位老同学找到我,还是个大妹子,必须有求必应 。
  妹子公司的系统最近在某次升级之后,在高峰期会遇到 CPU 爆高的现象,有些单位你懂的,很强势,所以就苦逼了程序媛,不管怎么说,既然找上我,得想各种办法给解决掉,用远程的方式告诉了老同学怎么用 procdump 去抓 dump,在一个小时之后 dump 成功拿到,接下来就来分析了。 二:WinDbg 分析1. CPU 真的爆高吗
  是不是爆高一定要拿数据说话,可以用 !tp 命令验证。  0:234> !tp CPU utilization: 44% Worker Thread: Total: 68 Running: 38 Idle: 10 MaxLimit: 4800 MinLimit: 48 Work Request in Queue: 0 -------------------------------------- Number of Timers: 2 -------------------------------------- Completion Port Thread:Total: 1 Free: 1 MaxFree: 96 CurrentLimit: 1 MaxLimit: 4800 MinLimit: 48
  从输出看 CPU=44% 就拿到了 dump ,真的有点奇怪,我设置的阈值是 70% ,可能是老同学后来改了阈值,虽然不是我的预期但还是可以探究一下的。
  接下来怎么排查呢?我们都知道 CPU 高本质都是由 线程 造成的,所以到每个线程栈上去兜兜,看看有没有什么收获,使用命令 ~*e !clrstack 即可。 0:234> ~*e !clrstack OS Thread Id: 0x6de8 (234)         Child SP               IP Call Site 000000959273dfd8 00007ff89d287174 [HelperMethodFrame_2OBJ: 000000959273dfd8] System.Security.Cryptography.Utils._AcquireCSP(System.Security.Cryptography.CspParameters, System.Security.Cryptography.SafeProvHandle ByRef) 000000959273e0d0 00007ff88af3074e System.Security.Cryptography.Utils.AcquireProvHandle(System.Security.Cryptography.CspParameters) 000000959273e110 00007ff88b85e585 System.Security.Cryptography.CryptoAPITransform..ctor(Int32, Int32, Int32[], System.Object[], Byte[], System.Security.Cryptography.PaddingMode, System.Security.Cryptography.CipherMode, Int32, Int32, Boolean, System.Security.Cryptography.CryptoAPITransformMode) 000000959273e230 00007ff88b86057d System.Security.Cryptography.DESCryptoServiceProvider._NewEncryptor(Byte[], System.Security.Cryptography.CipherMode, Byte[], Int32, System.Security.Cryptography.CryptoAPITransformMode) 000000959273e2e0 00007ff88b8602f3 System.Security.Cryptography.DESCryptoServiceProvider.CreateDecryptor(Byte[], Byte[]) 0000009588e7e300 00007ff82f7bd49a xxx.DesDecrypt(System.String) 0000009588e7e370 00007ff82f9848e2 xxx.b__17(xxx_UserInfo) 0000009588e7e3a0 00007ff887d7778e System.Linq.Enumerable+WhereListIterator`1[[System.__Canon, mscorlib]].MoveNext() 0000009588e7e3e0 00007ff887d7767e System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1) ...
  从输出以及截图来看,有 38 个线程正在执行 xxx.DesDecrypt 方法,看起来是一个 DES 解密操作,一般来说 加解密 比较费CPU资源,看样子找到问题根了,根据线程栈找一下代码到底是怎么写的,为了保密起见,这里就多用几个 XXX 来替代吧,参考代码如下:          protected void xxx(string xxx)         {             xxx userInfo = xxxUserInfoList.Where((xxx p) => p.xxx.Name == xxx.DesDecrypt(base.User.Name)).FirstOrDefault();         }
  说实话第一眼看到在 Where 中使用 DesDecrypt(base.User.Name) 方法,虽然有点别扭,内心还是感觉扩展方法应该会帮我优化把它单独给提出来的,比如下面这样。          protected void xxx(string xxx)         {             var nameWhere=  xxx.DesDecrypt(base.User.Name);              xxx userInfo = xxxUserInfoList.Where((xxx p) => p.xxx.Name == nameWhere).FirstOrDefault();         }
  但看了线程栈上的 WhereListIterator 和 FirstOrDefault 方法,貌似没有做优化,为了验证我的想法,我还特意写了段代码。      internal class Program     {         static void Main(string[] args)         {             var query = new List() { "1", "2","3","4" };              var text = "hello world";              query.Where(i => i == Run(text)).FirstOrDefault();         }           public static  string Run(string str)         {             Console.WriteLine(str);              return str;         }     }
  从输出结果看 hello world 输出了 4 次,也就表明当前并没有做任何优化。
  再说点题外话,最近在研究 SQLSERVER,我觉得它的 SQL优化器应该能够处理这种情况,截图如下:  SELECT OrderID FROM dbo.Orders WHERE OrderDate > SUBSTRING("1996-07-10 00:00:10.000", 0, 11) AND        OrderDate < SUBSTRING("1996-07-20 00:00:20.000", 0, 11);
  虽然 SQLSERVER 非常智能的做了优化,但后来想一想C#不优化是对的,因为框架代码没法保证向 xxx.DesDecrypt 方法中传入相同参数,返回的结果一定是相同的,所以采用保守的方法能够理解。 2. 解密操作真的会爆高吗
  就算WHERE中逐项处理解密操作就一定会爆高吗?这是一个需要求证的问题,可以切到某个线程上用 !dso 找出那个 list,然后 !do 即可,参考代码如下:  0:234> !DumpObj /d 000001f631799240 Name:        System.Collections.Generic.List`1[[xxxx_UserInfo,xxxx]] MethodTable: 00007ff82f5f3b20 EEClass:     00007ff88ab59f90 Size:        40(0x28) bytes File:        C:WindowsMicrosoft.NetassemblyGAC_64mscorlibv4.0_4.0.0.0__b77a5c561934e089mscorlib.dll Fields:               MT    Field   Offset                 Type VT     Attr            Value Name 00007ff88b12d6c8  4001843        8     System.__Canon[]  0 instance 000001f6b14ae380 _items 00007ff88b123e98  4001844       18         System.Int32  1 instance             3506 _size 00007ff88b123e98  4001845       1c         System.Int32  1 instance             3506 _version 00007ff88b121c98  4001846       10        System.Object  0 instance 0000000000000000 _syncRoot 00007ff88b12d6c8  4001847        8     System.__Canon[]  0   static  
  从输出可以清晰的看到,当前的 list.count=3506 个,在加上有 38 个线程在并发处理,所以最坏情况下是 3506 * 38 = 13w 的解密操作,难怪说高峰期的时候 CPU 爆高。
  解决办法也很简单,把 xxx.DesDecrypt 给提出来,将解密操作由原来的 13w 优化到 38 次,下午大妹子反馈问题已经解决。
  看到大妹子开心的笑了,我的饭有着落了 三:总结
  这个问题是一个不良习惯的写法造成的,说实话,我不是看到线程栈上的 WhereListIterator 方法我也不相信会执行多次,可能最近中了 SQLSERVER 的毒,不管怎么说,这些都是小事,有大餐吃才是最重要的!

两大创新功能秒杀苹果?华为Mate50系列定价全曝光华为Mate50系列手机,将会在9月6日下午230正式发布,而关于整个系列的定价近日也已经被曝光。华为Mate50系列手机分别有Mate50Mate50Pro与Mate50RS三个结合折叠特性带来商务与影像新体验,vivoXFold惊喜颇多欢迎来到awesome科技的频道,聊聊结合折叠特性带来商务与影像新体验,vivoXFold惊喜颇多。今天为大家点一首比较好听的歌孤勇者!自vivoXFold正式亮相以来,各大权威媒日本人普遍不爱运动,为何却是全球最长寿?有这4个原因关于长寿的秘密要去了解清楚,通过健康生活方式让免疫能力提高,器官正常运转,没有疾病困扰且有效对抗衰老,自然延年益寿。而许多人经过研究发现有这样一个规律,日本人不爱运动,却平均寿命很想要远离疾病健康长寿?营养师做好这4方面的饮食调理是关键俗话说的好国以民为主,民以食为天!人类在无数年进化和繁衍的过程中,已经站在了食物链的顶端,我们饲养家禽家畜开垦土地并种植稻谷,各地区形成了不同的饮食文化,汇聚在一起就变成了独特且复众神归位!广州队晒夏窗成果,12人为情怀而战,组建守护者联盟9月1日消息,昨天下午,广州足球俱乐部正式更新了球队大名单,值得一提的是,除了官宣了几名新援加入之外,教练组三人也化身兼职球员,准备一起为保级大战殊死一搏。在今天早上,广州队官微也反转!科克马兹谈斗殴细节,FIBA正式开启调查,驳回土耳其一诉求9月6日消息,在之前欧锦赛土耳其对阵格鲁吉亚的比赛中,双方球员出现了冲突事件,在科克马兹被逐出球场之后,在通往球馆的更衣室走廊上,格鲁吉亚三名球员围殴了科克马兹。另外,因为这次冲突360揭秘美国网络攻击西工大细节攻克看见高级攻击世界性难题9月5日,外交部发言人毛宁主持例行记者会。有记者提问,日前国家计算机病毒应急处理中心和360公司分别发布了关于西北工业大学遭受美国国家安全局(NSA)网络攻击的调查报告,显示美国国美国出现首例猴痘死亡病例!巴西科学家被感染的细胞长这样美国得克萨斯州的卫生官员当地时间8月29日宣布,他们正在调查一名确诊猴痘同时严重免疫力低下的死亡病患的死因。这是迄今为止在美国公开宣布的第一起猴痘死亡病例。目前尸检正在进行中,预计从富国变成穷国!即使不停印钞也没钱,美国的钱都花到哪去了?除非国会采取行动提高联邦借款上限,否则美国政府会在10月某个时候无钱可用。全球惟一的超级大国世界第一大经济体美国居然没钱了?看到这句话很多人肯定会觉得很荒诞,认为这是诋毁美国的玩笑美国用实际行动,给中国狠狠上了一课大力推进人民币国际化,打败美元体系,把世界各国从美国货币霸权的剥削中解放出来,是具有天下情怀的中国人最想做的事情之一。不过,虽然中国一直在努力,但对于人民币在真正意义上取代美元,成宋忠平美国不要制造冷战登月竞赛近日,美国发射SLS登月火箭因为燃料泄漏而以失败告终。美国本想3日再度发射登月火箭,在发射过程中曾两度暂停,并重新为火箭发动机注入液态氢,但却仍然无法解决问题,不得不再度取消发射探
当红数播北京师旷AP20到底是哪些地方更优秀北京师旷的AP10一直以来以工作稳定性不错的声音表现以及操作方便和超高的性价比等等优势受到许多音乐爱好者的喜欢。而品牌方最新官宣的升级换代型号AP20相对比于AP10有哪些升级的地冬日幸存者开发日志UI重制与新增视觉效果大幅提升我们深知视觉设计对于游戏的重要性。因此,在这篇开发日志中,我们想要聊一聊最近一段时间里,我们对冬日幸存者UI的一些改动。我们的新UI可以分成两个部分重制与新增。关于重制部分,我们将这些千奇百怪的场馆太适合遛娃了!开飞机学木工做动画片逛公园看大展游泳嬉水,日常遛娃玩来玩去也就这么几个主题,小爱已经给大家推荐过无数遍了,有时也会自己问自己,这么大个北京城,难道就没有其他玩法了吗?能让老母亲心甘情愿带娃去,孩子也能宝妈说带娃抑郁了,监控下却是另一副面孔,宝爸有些懵世界卫生组织研究发现,约6080的女性,会在产后出现不同程度的抑郁情绪。不就是带个孩子吗,有什么好抑郁的,这或许是宝妈最不想听到的一句话了。产后抑郁不是简单地不开心,而且许多女性自暑期出游莫忘做好风险防范近日,在天津湖北两地同时发生景区游客坠落事故,造成一死一伤,其中一名游客为10岁儿童。当下正值暑假旅游旺季,也是汛期灾害易发时期,景区游乐场安全事故时有发生,这给计划出游的家长和孩骑次自行车,才更懂荷兰来源环球时报环球时报特约记者葛莉娜自行车王国荷兰多年来不断建设完善自行车道网络和配套设施打造优美宜人的骑行环境,使人们乐于骑行享受骑行。到了荷兰,游客们喜欢租一辆自行车,在城市乡村奥利教户外徒步篇36户外的不同天气穿衣法则我们要到达的地点和时间在很大程度上决定了我们的户外衣橱的构成在炎热的一天之后,沙漠之夜会变得异常寒冷。我们可能在高山雪原上,在令人惊叹的正午炎热中汗流浃背,然后第二天早上起来发现瓶图文并茂带你一起探秘长江之源沱沱河美景从唐古拉兵站到达唐古拉山镇大概下午四点左右,著名的沱沱河发源于唐古拉山脉格拉丹东雪山之中,是一些冰川融水逐步汇集而成的小溪流,也就是长江发源地的源头沱沱河,河水从唐古拉山镇贯穿而过唐锐公使访问马六甲州8月7日至8日,唐锐公使访问马六甲州,其间会见马六甲州旅游文化及遗产事务行政议员贾拉尼,并赴马六甲科技大学(UTeM)出席一带一路大讲堂活动。唐公使在一带一路大讲堂开幕式上致辞表示哈佛医学院分享的大脑健康饮食方法(全文译自美国CNBC)作为一名营养精神科医生,我一直强调维持均衡的饮食。这在很大程度上与确保我获得所有正确的维生素,特别是因为它对于防止认知能力下降至关重要。鉴于随着年龄的增长,幼儿园将有大调整,有望明年全部落实,家长听后感到安心现在的社会特别重视学历,没有学历寸步难行,将来的发展也很受限,所以为了让自己的孩子将来可以更好地发展,很多的家长都特别重视孩子的教育问题。甚至在孩子上幼儿园时期就要为孩子挑选好的幼