最近有个项目用loadrunner做了压力测试,发现并发量还不到200服务器就支撑不住了。boss那边紧急开会,说此项目最近3个月内将有100家中大型公司用于校园招聘工作,如果这个问题不解决公司有可能玩完。于是紧急动员,当晚重启压力测试,力争把问题解决。

由于之前测试部门做压力测试的时候我不在场,所以今天测试的时候先让他们演示的一遍,当loadrunner跑到100的时候,问题出来了,网站访问开始变慢,计数器webservice/current connections急剧上升,直到1000左右,这是访问网站报503错误。这一次我只是为了看下现象,我和小伙伴们都没有做任何处理。

在再次开启loadrunner之前,我和小伙伴们就早早各自做好了准备,有些添加计数器,观察计数器,期望可以看出端倪,而我比较喜欢windbg这个东西,因为她从来没欺骗过我,我相信这次也不例外。终于在并发达到100,网站抛出503的时候,我敲下了adplus,终于抓住了第一手资料。

下面一起来分析这个dump吧,首先我的思路是这样的,并发了只有100,但是已经拒绝服务,而且current connections竟然达到1000,说明iis处理不过来导致队列越来越长 ,超出了队列 允许的最大长度,所以抛出503,那为什么iis处理不过来呢,因为程序有问题,有某个地方成为了瓶颈,如果用windbg来看的话,应该大部分的线程都卡在了同一个地方。

首先打开windbg,选择抓到的dump文件

先加载sos.dll

0:000> .load  sos

再看看所有线程的clr堆栈,看看所有的线程运行到哪里了

0:000> ~* e !clrstack

-------------大部分的线程最后运行的程序出现了下面这段-----------------------

OS Thread Id: 0x32bc (65)
Child SP IP Call Site
07ffe6b0 7c95845c [InlinedCallFrame: 07ffe6b0]
07ffe6ac 7a9f07ad DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, Byte*, Int32, System.Net.Sockets.SocketFlags)
07ffe6b0 7a9994a2 [InlinedCallFrame: 07ffe6b0] System.Net.UnsafeNclNativeMethods+OSSOCK.recv(IntPtr, Byte*, Int32, System.Net.Sockets.SocketFlags)
07ffe6f8 7a9994a2 System.Net.Sockets.Socket.Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.Net.Sockets.SocketError ByRef)
07ffe730 09c8a654 Enyim.Caching.Memcached.PooledSocket+BasicNetworkStream.Read(Byte[], Int32, Int32)
07ffe754 7a1b9b31 System.IO.BufferedStream.Read(Byte[], Int32, Int32)
07ffe770 0556dcfe Enyim.Caching.Memcached.PooledSocket.Read(Byte[], Int32, Int32)
07ffe7b0 09c8a237 Enyim.Caching.Memcached.GetHelper.ReadItem(Enyim.Caching.Memcached.PooledSocket)
07ffe800 09c8969e Enyim.Caching.Memcached.GetOperation.ExecuteAction()
07ffe814 09c895ba Enyim.Caching.Memcached.Operation.Execute()
07ffe83c 09c894fc Enyim.Caching.MemcachedClient.Get(System.String)
07ffe86c 09c8948e MemcachedProviders.Cache.MemcachedCacheProvider.Get(System.String)
07ffe87c 09c83efc XXX.Caching.MemcachedCacheProvider.XXX.Caching.ICacheProvider.Get(System.String)
07ffe888 09c83d0a XXX.Caching.CacheManager.Get(System.String)
07ffe8b8 09c83c70 XXX.Caching.CacheManager.Get[[System.__Canon, mscorlib]](System.String)

..................这里省略若干行.................

这以为着什么,意味着MemCached成为了最后的执行点,成为了瓶颈,于是找来同事商量下,同事也认为极有可能,最后我们修改配置,改为启用。net自带的缓存 。

再次运行loadrunner,并发200毫无压力,增加到并发500,依然杠杠的。最后我们再看代码研究问题,一致认为是我们过分依赖MemCached,把所有能缓存的数据都放入了MemCached,大部分需要取数据的地方都经过了MemCached,MemCached成为了瓶颈,可笑吗,使用MemCached本来是希望提高性能的,结果倒成了瓶颈。

本文重点不在讨论问题,而在解决问题的方式。有一段时间没有用windbg了,有点生了,也许是该整理一下各种关于windbg的案例。这东西和正则一样,不用就忘。

记一个由MemCached引发的性能问题的更多相关文章

  1. Mysql中where条件一个单引号引发的性能损耗

    日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...

  2. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”.   ...

  3. 【深入浅出.Net IL】1.一个For循环引发的IL

    .Net底层剖析目录章节 1.[深入浅出.Net IL]1.一个For循环引发的IL 2.[.Net底层剖析]2.stfld指令-给对象的字段赋值 3.[.Net底层剖析]3.用IL来理解属性 1.准 ...

  4. FluentData,它是一个轻量级框架,关注性能和易用性。

    http://www.cnblogs.com/zengxiangzhan/p/3250105.html FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.M ...

  5. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  6. 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)

    从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...

  7. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

    从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...

  8. 记一个社交APP的开发过程——基础架构选型(转自一位大哥)

    记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...

  9. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

随机推荐

  1. php数组遍历

    <?php $arr = array('a','b','c','d','e','f'); //for语句只能遍历索引数组 for($i = 0; $i < 6; $i++){ echo $ ...

  2. 读取、写入excel数据

    在实际项目中,不可避免的会操作excel表格.一直以来都是读取excel表格,可今天为了写入excel表格,可是煞费苦心,终于完成,记录下来以便后续使用. 1.读取excel表格的数据 读取excel ...

  3. pmp培训.rar

    pmp培训.rar http://pan.baidu.com/s/1sleUQol

  4. java三大框架学习总结(1)

    企业里并不一定就会用这三种框架,关键是要你能懂得面向对象的原理,以及对服务器客户端请求响应方式的理解,再加上你对缓存的利用,这才能成为真正的高手,框架就好比是一把武器,它最多是能帮你更好的杀敌,而如果 ...

  5. [PCL]2 点云法向量计算NormalEstimation

    从GitHub的代码版本库下载源代码https://github.com/PointCloudLibrary/pcl,用CMake生成VS项目,查看PCL的源码位于pcl_features项目下 1. ...

  6. json不支持中文写入的问题解决

    写两个函数,使其支持中文: function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { foreach ...

  7. C# web api 返回类型设置为json的两种方法

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  8. 为Virtual Studio Code配置Python调试插件(Ubuntu14.04)

    详情见以下python for virtual studio code插件的链接: python 安装依赖 1.Python is installed on the current system Pa ...

  9. Java基础之创建窗口——使用卡片布局管理器(TryCardLayout)

    控制台程序. 卡片布局管理器会生成一叠组件——一个组件放在另一个组件的上面.添加到容器中的第一个组件在堆栈的顶部,因此是可见的,添加的最后一个组件在堆栈的底部.使用默认的构造函数CardLayout( ...

  10. J2EE maven pom.xml常用的jar包

    新建一个maven webapp工程,默认的pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" x ...