记一次webservice性能调优经历(c#)

项目背景

和一个app做对接,提供一套业务接口给对方调用,每一个功能码对应一个方法,一个业务操作,并且需要记录请求体和响应体的日志,便于问题的排查,于是一个webservice诞生了,这个webservice 通过每个功能码对应一个类,然后通过反射方法,传入功能码实例化对应的类,去对请求做出响应;

先介绍下两个测试webservice的方法
1、接口测试工具:soapui,这个是经常拿来测试webservice 的工具,很好用,可以模拟调用,并且有响应时间,但是这个工具不是免费的,需要破解
2、由于我是在iis上部署的,可以用iis自带的日志工具,但是不能模拟web调用,他只是记录响应的一些信息,web服务部署好后,启用日志功能就可以在C:\inetpub\logs\LogFiles 目录下看到日志了,日志内容是这种格式的:

#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2018-12-27 05:00:00
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2018-12-27 05:00:00 10.81.26.110 POST /NeuAppService.asmx - 8000 - 10.81.26.22 Apache-HttpClient/4.5+(Java/1.7.0_21) 200 0 0 592
2018-12-27 05:09:59 10.81.26.110 POST /NeuAppService.asmx - 8000 - 10.81.26.21 Apache-HttpClient/4.5+(Java/1.7.0_21) 200 0 0 322
2018-12-27 05:10:19 10.81.26.110 POST /NeuAppService.asmx - 8000 - 10.81.26.20 Apache-HttpClient/4.5+(Java/1.7.0_21) 200 0 0 1216
#Software: Microsoft Internet Information Services 7.5

最后一个数值就是响应的时间 592 、322、1216, 200是web响应码,表示成功;

优化过程
接下来是具体的优化实践了,尝试了多种方式,最终是解决了自己的问题;
项目实际部署后,对方一直反应慢,通过上面的两个工具我也发现的确是慢,于是做了些尝试,当然作为一名程序员,我的第一反应,肯定不会认为自己的程序有问题(哈哈)
iis配置优化和硬件优化
iis 的配置主要是对iis的应用程序池做些处理,
记一次webservice性能调优经历(c#)_第1张图片
将回收时间调整为固定时间回收,而不是间隔多长时间回收,我这是改成了晚上24点,这个点基本上没人用
记一次webservice性能调优经历(c#)_第2张图片

把闲置时间增大,并且增加一个工作进程
硬件优化:
让硬件增加网络带宽,升级适配器,增加服务器内存,cpu核心翻倍
程序优化
这里说句题外话,直到这个时候,我仍然没想过是我程序的问题,因为我看我自己的日志,我打印入参的时间和出参时间的间隔就没有超个1秒钟的,所以我对我的程序坚信不疑。(呵呵)但是实际情况问题就出在这儿,于是分析了代码、sql等,做了如下优化:
1、优化sql :发现了一个比较慢的sql,发现关联的某些表,关联字段没有索引,于是对表加上索引,sql的效率的确有了提升
2、webservice 配置上的优化

		这里我原来是默认的false
		
			
				
				
				
				
			
		

这里会影响性能,只在开发过程中将此值 设置为 true。因为设为true后,他会把一些调试符号,插入编译页面;
3、因为慢,所以最后舍弃了反射的方式,改用switch的方式,发射会影响性能这是公认的(用反射可以少写很多代码,实际上反射上这点性能的损失还是能接受的,而且看起来能高大上点)
这次的最大收获
最后这一个是我webservice 慢的罪魁祸首,前面介绍到我是写了日志的,通过日志可以看出我的业务代码是没有问题的,响应速度还是比较快的,但是实际的响应却是很慢,由于各种尝试无果;只能把各种可能耗时的东西去掉,众所周知:IO操作是最费时的,于是我就把日志也给去了,这一去发现速度提升了不是一个量级的,来张对比图吧,
记一次webservice性能调优经历(c#)_第3张图片
红色的是 去掉日志前的,可以看到速度提升了非常多,这里大部分人都会认为就是io把我们的速度吃了,当然也包括我,但是日志不能不写啊,于是那就开个线程写日志,但是速度并没有任何的提升??
后来通过和大佬反馈了下这个问题,原来并不是io慢的原因,io虽然慢,但是没慢到这个地步啊,原来我的日志是写在bin目录了,而iis在bin目录的内容改变了的时候会重启web服务,而我一直往bin目录写日志,这就导致每次写日志我的web服务就重启一次,而web服务的第一次访问是非常慢的,应用程序需要动态编译生成序列化程序集,所以这就导致了我们每次调拥webservice 只能享受到第一次的响应速度了

总结
时刻保持和大佬的交流,因为可能你距离事情的真相只差临门一脚,却怎么也没法突破的时候,大佬的一句话,你就能破解真相了,呵呵

你可能感兴趣的:(c#)