首页 新闻 会员 周边 捐助

请教同时向.net WebAPI服务发起几个请求,每一次都有一个请求耗费20秒的原因!

-1
悬赏园豆:50 [已解决问题] 解决于 2017-04-06 15:02

着急啊,项目快上线了才发现了这个问题:每一个webapi接口单独访问执行都是毫秒级的,但是------最近发现同一个用户同时请求多个接口,有95%可能性导致其中一个接口返回时间为20秒,就是用户打开一个网站页面,这个页面同时会请求4个以上接口会导致如上问题,而且每个被延迟返回的接口都会是20秒,或者后面带个几十毫秒,每个延迟的接口都是这个时间,请各位帮忙分析原因,给个排查思路。。。不胜感激

寂寞的博客的主页 寂寞的博客 | 初学一级 | 园豆:57
提问于:2017-03-22 15:25
< >
分享
最佳答案
0

1.确定是不是机器问题,换台服务器试试 看有没有类似问题。以前某个项目我遇到过一次莫名其妙的延时90秒 而且延时区域是无法编写的区域。

2.监控 请求日志 判断 延时区域 是那一段代码

服务器端:分别在beginrequest (开始请求),OnActionExecuting(方法执行前),OnActionExecuted(方法执行后),endrequest(结束请求),如果可以 再查一下iis 的请求接收记录

客户端:通过f12 network监控,查看请求开始时间 等待时间  

对比 服务器端 和 客户端日志 找出 延时的区域属于那一块

收获园豆:20
小眼睛老鼠 | 老鸟四级 |园豆:2731 | 2017-03-22 15:43

嗯!思路很好,我一一测试后再另请教

寂寞的博客 | 园豆:57 (初学一级) | 2017-03-22 15:48
其他回答(2)
0

只能笼统的说是竞争导致的。

代码中的估计要自己巴拉,这块出问题的情况千奇百怪(线程池啊,各种奇葩的单例实现,lock粒度有问题等)。

数据库上的比如连接池就设了1个,db操作中的锁。

收获园豆:15
Daniel Cai | 园豆:10424 (专家六级) | 2017-03-22 15:31

是的,我的几乎每个BLL业务类都是单例模式,因为不想每次调用都new一个实例,因为也没有什么公用属性,都是形如下:

      private static object locker = new object();
        private static C_MemberBLL _instance;
        public static C_MemberBLL Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (locker)
                    {
                       if (_instance == null)
                       {
                            _instance = new C_MemberBLL();
                       }
                    }
                }
                return _instance;
            }
        }

多个请求时候确实有几个请求都用这个单例的实例,请问这样大量的都是这样的会有什么问题呢?赐教

支持(0) 反对(0) 寂寞的博客 | 园豆:57 (初学一级) | 2017-03-22 15:38

@寂寞的博客: 这个单例没问题,除非实例化那个对象的成本很高(从你的描述中应该不是这样)。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2017-03-22 15:40
0

我一般采用对比法

换个或换多个机器,如果情况依旧,可以排除网络问题。

然后进行跟踪调试,每次调用一个,看看是不是每个都那么耗时,如果是一个一个的不耗时,而2个或者更多的时候耗时增加.....就查时不时有数据库连接池的问题等等。

类似这样的问题和内存溢出的感觉一样,要仔细慢慢排除。从前到后,直至数据库

收获园豆:15
Lionel Andrés Messi | 园豆:82 (初学一级) | 2017-03-23 16:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册