实验并没得到预期的并发行为,不知道什么原因。
原来没有并发是因为客户端网络连接并发设置,需要把maxconnection改为大一些的数。
WCF 跟并发 性能相关的几个配置:
1、系统控制的客户端网络连接并发(如果服务端也需要并发请求的话这个参数也是需要的):
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="1000"/>
</connectionManagement>
</system.net>
<configuration>
这个参数指定一个进程内(或domain) 并发通信连接个数限制,默认2个(就是系统控制了)
2、WCF 网络TCP/IP 监听(bingding)控制的传输协议
这个参数是针对某一(些)端点的绑定的控制
<bindings>
<netTcpBinding>
<binding name="netcpbindingconfig"
listenBacklog="100" maxConnections="100" />
这2个参数: 第一个就是我们常用的listen的参数,这个意义我们应该很清楚了。
第二个参数 msdn解释是: 客户端上可存入池中以备后续重复使用的最大连接数;服务器上可挂起调度的最大连接数。 On the client, the maximum number of connections to be pooled for subsequent reuse; on the server, the maximum number of connections allowed to be pending dispatch. (看来中文翻译的不太好)。
第一个是tcp协议的控制,第二个是紧跟着协议之后的调度配置(服务端)。
3、针对服务宿主(servicehost)进行的控制
<serviceBehaviors><behavior name="MathServiceBehaviours" >
<serviceThrottling
maxConcurrentCalls="100"
maxConcurrentSessions="100"
maxConcurrentInstances="100"/>
</behavior>
</serviceBehaviors>
maxConcurrentCalls :该值指定整个 ServiceHost 中正在处理的最多消息数。
specifies the maximum number of messages actively processing across a ServiceHost.
总结,在服务端控制流量的机制即listenBackLog -> maxConnections -> maxConcurrentCalls(..)
基本上分三个阶段。也是针对不同的可控制对象。
listenBackLog 针对tcp连接的缓冲设置
maxConnections 针对接到连接后,要分配给service消费是 排队(缓冲)的设置;
maxConcurrentCalls(sessions, instances) 是针对service处理压力的控制。
第一组测试结果 (服务行为默认)
<span style="font-size:12px">累计时长:7850ms,client:17,客户端耗时:7859.375ms,start:23:27:51.078125_23:27:58.937500,__Server:17,服务端耗时:6750ms,start:23:27:52.156250_23:27:58.906250累计时长:8827ms,client:2,客户端耗时:9000ms,start:23:27:50.921875_23:27:59.921875,__Server:2,服务端耗时:6890.625ms,start:23:27:53.031250_23:27:59.921875累计时长:14243ms,client:4,客户端耗时:14562.5ms,start:23:27:50.937500_23:28:05.500000,__Server:4,服务端耗时:6562.5ms,start:23:27:58.921875_23:28:05.484375累计时长:15241ms,client:1,客户端耗时:15656.25ms,start:23:27:50.906250_23:28:06.562500,__Server:1,服务端耗时:6640.625ms,start:23:27:59.921875_23:28:06.562500线程 '<无名称>' (0x11fc) 已退出,返回值为 0 (0x0)。累计时长:20828ms,client:19,客户端耗时:21437.5ms,start:23:27:51.093750_23:28:12.531250,__Server:19,服务端耗时:7015.625ms,start:23:28:05.515625_23:28:12.531250累计时长:21850ms,client:14,客户端耗时:22531.25ms,start:23:27:51.046875_23:28:13.578125,__Server:14,服务端耗时:7015.625ms,start:23:28:06.562500_23:28:13.578125累计时长:27229ms,client:18,客户端耗时:27984.375ms,start:23:27:51.078125_23:28:19.062500,__Server:18,服务端耗时:6500ms,start:23:28:12.531250_23:28:19.031250线程 '<无名称>' (0x12f0) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x11ac) 已退出,返回值为 0 (0x0)。累计时长:28452ms,client:9,客户端耗时:29359.375ms,start:23:27:51.015625_23:28:20.375000,__Server:9,服务端耗时:6593.75ms,start:23:28:13.593750_23:28:20.187500累计时长:33776ms,client:3,客户端耗时:34937.5ms,start:23:27:50.937500_23:28:25.875000,__Server:3,服务端耗时:6796.875ms,start:23:28:19.062500_23:28:25.859375累计时长:35042ms,client:13,客户端耗时:36125ms,start:23:27:51.046875_23:28:27.171875,__Server:13,服务端耗时:6671.875ms,start:23:28:20.187500_23:28:26.859375线程 '<无名称>' (0x15b4) 已退出,返回值为 0 (0x0)。累计时长:40316ms,client:7,客户端耗时:41515.625ms,start:23:27:50.968750_23:28:32.484375,__Server:7,服务端耗时:6609.375ms,start:23:28:25.875000_23:28:32.484375线程 '<无名称>' (0x12c8) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x12cc) 已退出,返回值为 0 (0x0)。累计时长:41711ms,client:16,客户端耗时:42875ms,start:23:27:51.062500_23:28:33.937500,__Server:16,服务端耗时:6656.25ms,start:23:28:27.171875_23:28:33.828125线程 '<无名称>' (0x9d8) 已退出,返回值为 0 (0x0)。累计时长:47038ms,client:12,客户端耗时:48593.75ms,start:23:27:51.031250_23:28:39.625000,__Server:12,服务端耗时:7140.625ms,start:23:28:32.484375_23:28:39.625000线程 '<无名称>' (0xf48) 已退出,返回值为 0 (0x0)。累计时长:48339ms,client:0,客户端耗时:50359.375ms,start:23:27:50.687500_23:28:41.046875,__Server:0,服务端耗时:7218.75ms,start:23:28:33.828125_23:28:41.046875累计时长:53526ms,client:10,客户端耗时:55312.5ms,start:23:27:51.015625_23:28:46.328125,__Server:10,服务端耗时:6671.875ms,start:23:28:39.640625_23:28:46.312500线程 '<无名称>' (0x110c) 已退出,返回值为 0 (0x0)。累计时长:54796ms,client:6,客户端耗时:56625ms,start:23:27:50.968750_23:28:47.593750,__Server:6,服务端耗时:6546.875ms,start:23:28:41.046875_23:28:47.593750线程 '<无名称>' (0x132c) 已退出,返回值为 0 (0x0)。累计时长:60036ms,client:11,客户端耗时:62140.625ms,start:23:27:51.031250_23:28:53.171875,__Server:11,服务端耗时:6843.75ms,start:23:28:46.328125_23:28:53.171875线程 '<无名称>' (0x1190) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x9dc) 已退出,返回值为 0 (0x0)。累计时长:61322ms,client:15,客户端耗时:63515.625ms,start:23:27:51.062500_23:28:54.578125,__Server:15,服务端耗时:6968.75ms,start:23:28:47.593750_23:28:54.562500线程 '<无名称>' (0x1520) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x1270) 已退出,返回值为 0 (0x0)。累计时长:66619ms,client:5,客户端耗时:69140.625ms,start:23:27:50.968750_23:29:00.109375,__Server:5,服务端耗时:6921.875ms,start:23:28:53.171875_23:29:00.093750累计时长:67821ms,client:8,客户端耗时:70328.125ms,start:23:27:51.015625_23:29:01.343750,__Server:8,服务端耗时:6765.625ms,start:23:28:54.578125_23:29:01.343750线程 '<无名称>' (0xee0) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0xb48) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x1030) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x1564) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x1018) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x948) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x1320) 已退出,返回值为 0 (0x0)。线程 '<无名称>' (0x157c) 已退出,返回值为 0 (0x0)。</span><span style="font-size:24px"></span>
第二组
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,ConcurrencyMode=ConcurrencyMode.Multiple)]public class Service : IService
累计时长:9850ms,client:5,客户端耗时:9781.25ms,start:23:33:22.734375_23:33:32.515625,__Server:5,服务端耗时:6890.625ms,start:23:33:25.609375_23:33:32.500000
累计时长:13523ms,client:16,客户端耗时:13468.75ms,start:23:33:22.921875_23:33:36.390625,__Server:16,服务端耗时:11531.25ms,start:23:33:24.859375_23:33:36.390625
累计时长:15583ms,client:1,客户端耗时:16078.125ms,start:23:33:22.500000_23:33:38.578125,__Server:1,服务端耗时:13468.75ms,start:23:33:25.109375_23:33:38.578125
累计时长:19225ms,client:9,客户端耗时:19671.875ms,start:23:33:22.812500_23:33:42.484375,__Server:9,服务端耗时:13562.5ms,start:23:33:28.921875_23:33:42.484375
线程 '<无名称>' (0x9dc) 已退出,返回值为 0 (0x0)。
累计时长:20228ms,client:3,客户端耗时:20781.25ms,start:23:33:22.718750_23:33:43.500000,__Server:3,服务端耗时:7046.875ms,start:23:33:36.406250_23:33:43.453125
累计时长:26601ms,client:8,客户端耗时:27218.75ms,start:23:33:22.765625_23:33:49.984375,__Server:8,服务端耗时:6484.375ms,start:23:33:43.484375_23:33:49.968750
累计时长:28622ms,client:14,客户端耗时:29203.125ms,start:23:33:22.906250_23:33:52.109375,__Server:14,服务端耗时:14312.5ms,start:23:33:36.468750_23:33:50.781250
线程 '<无名称>' (0x1018) 已退出,返回值为 0 (0x0)。
累计时长:32485ms,client:17,客户端耗时:33046.875ms,start:23:33:22.937500_23:33:55.984375,__Server:17,服务端耗时:13421.875ms,start:23:33:42.562500_23:33:55.984375
累计时长:33684ms,client:11,客户端耗时:34312.5ms,start:23:33:22.875000_23:33:57.187500,__Server:11,服务端耗时:7156.25ms,start:23:33:49.984375_23:33:57.140625
线程 '<无名称>' (0x157c) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1564) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1030) 已退出,返回值为 0 (0x0)。
累计时长:40639ms,client:15,客户端耗时:41515.625ms,start:23:33:22.906250_23:34:04.421875,__Server:15,服务端耗时:7234.375ms,start:23:33:57.187500_23:34:04.421875
线程 '<无名称>' (0x1518) 已退出,返回值为 0 (0x0)。
累计时长:46620ms,client:18,客户端耗时:47828.125ms,start:23:33:22.937500_23:34:10.765625,__Server:18,服务端耗时:18484.375ms,start:23:33:52.156250_23:34:10.640625
线程 '<无名称>' (0x1270) 已退出,返回值为 0 (0x0)。
累计时长:46995ms,client:12,客户端耗时:48296.875ms,start:23:33:22.843750_23:34:11.140625,__Server:12,服务端耗时:18578.125ms,start:23:33:52.093750_23:34:10.671875
累计时长:48275ms,client:7,客户端耗时:49765.625ms,start:23:33:22.750000_23:34:12.515625,__Server:7,服务端耗时:7578.125ms,start:23:34:04.421875_23:34:12.000000
累计时长:50212ms,client:0,客户端耗时:51968.75ms,start:23:33:22.484375_23:34:14.453125,__Server:0,服务端耗时:18203.125ms,start:23:33:56.062500_23:34:14.265625
线程 '<无名称>' (0x1190) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1520) 已退出,返回值为 0 (0x0)。
累计时长:55474ms,client:13,客户端耗时:56890.625ms,start:23:33:22.875000_23:34:19.765625,__Server:13,服务端耗时:7625ms,start:23:34:12.000000_23:34:19.625000
线程 '<无名称>' (0x15b4) 已退出,返回值为 0 (0x0)。
累计时长:62401ms,client:19,客户端耗时:64218.75ms,start:23:33:22.937500_23:34:27.156250,__Server:19,服务端耗时:7375ms,start:23:34:19.765625_23:34:27.140625
累计时长:63965ms,client:4,客户端耗时:66093.75ms,start:23:33:22.718750_23:34:28.812500,__Server:4,服务端耗时:18015.625ms,start:23:34:10.765625_23:34:28.781250
累计时长:64526ms,client:10,客户端耗时:66578.125ms,start:23:33:22.843750_23:34:29.421875,__Server:10,服务端耗时:18484.375ms,start:23:34:10.765625_23:34:29.250000
线程 '<无名称>' (0xb48) 已退出,返回值为 0 (0x0)。
累计时长:65572ms,client:2,客户端耗时:68046.875ms,start:23:33:22.515625_23:34:30.562500,__Server:2,服务端耗时:16218.75ms,start:23:34:14.312500_23:34:30.531250
累计时长:69010ms,client:6,客户端耗时:71281.25ms,start:23:33:22.750000_23:34:34.031250,__Server:6,服务端耗时:6843.75ms,start:23:34:27.171875_23:34:34.015625
线程 '<无名称>' (0x110c) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x948) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x12cc) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1674) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1320) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x9d8) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x14bc) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x10c4) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1084) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1164) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0xee0) 已退出,返回值为 0 (0x0)。
第三组
[服务端
ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,ConcurrencyMode=ConcurrencyMode.Multiple)]
public class Service : IService
客户端改为
static Stopwatch sw = new Stopwatch();
static GTService.Service client = new GTService.Service();
累计时长:8105ms,client:2,客户端耗时:8234.375ms,start:23:36:46.187500_23:36:54.421875,__Server:2,服务端耗时:7625ms,start:23:36:46.703125_23:36:54.328125
累计时长:8613ms,client:1,客户端耗时:8781.25ms,start:23:36:46.171875_23:36:54.953125,__Server:1,服务端耗时:7625ms,start:23:36:47.328125_23:36:54.953125
累计时长:15373ms,client:7,客户端耗时:15562.5ms,start:23:36:46.265625_23:37:01.828125,__Server:7,服务端耗时:7421.875ms,start:23:36:54.390625_23:37:01.812500
累计时长:15952ms,client:10,客户端耗时:16031.25ms,start:23:36:46.375000_23:37:02.406250,__Server:10,服务端耗时:7203.125ms,start:23:36:54.953125_23:37:02.156250
线程 '<无名称>' (0x1064) 已退出,返回值为 0 (0x0)。
累计时长:22384ms,client:5,客户端耗时:22640.625ms,start:23:36:46.234375_23:37:08.875000,__Server:5,服务端耗时:7046.875ms,start:23:37:01.828125_23:37:08.875000
累计时长:23748ms,client:4,客户端耗时:24015.625ms,start:23:36:46.234375_23:37:10.250000,__Server:4,服务端耗时:7171.875ms,start:23:37:02.171875_23:37:09.343750
线程 '<无名称>' (0x170c) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x404) 已退出,返回值为 0 (0x0)。
累计时长:29579ms,client:9,客户端耗时:29812.5ms,start:23:36:46.296875_23:37:16.109375,__Server:9,服务端耗时:7109.375ms,start:23:37:08.875000_23:37:15.984375
累计时长:29918ms,client:6,客户端耗时:30203.125ms,start:23:36:46.234375_23:37:16.437500,__Server:6,服务端耗时:7093.75ms,start:23:37:09.343750_23:37:16.437500
线程 '<无名称>' (0xa7c) 已退出,返回值为 0 (0x0)。
累计时长:36300ms,client:14,客户端耗时:36359.375ms,start:23:36:46.468750_23:37:22.828125,__Server:14,服务端耗时:6843.75ms,start:23:37:15.984375_23:37:22.828125
线程 '<无名称>' (0x15c0) 已退出,返回值为 0 (0x0)。
累计时长:37073ms,client:18,客户端耗时:37109.375ms,start:23:36:46.531250_23:37:23.640625,__Server:18,服务端耗时:6796.875ms,start:23:37:16.437500_23:37:23.234375
累计时长:43140ms,client:12,客户端耗时:43406.25ms,start:23:36:46.375000_23:37:29.781250,__Server:12,服务端耗时:6953.125ms,start:23:37:22.828125_23:37:29.781250
累计时长:43584ms,client:19,客户端耗时:43687.5ms,start:23:36:46.546875_23:37:30.234375,__Server:19,服务端耗时:6984.375ms,start:23:37:23.234375_23:37:30.218750
线程 '<无名称>' (0x113c) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x908) 已退出,返回值为 0 (0x0)。
累计时长:49815ms,client:17,客户端耗时:49937.5ms,start:23:36:46.531250_23:37:36.468750,__Server:17,服务端耗时:6500ms,start:23:37:29.781250_23:37:36.281250
累计时长:50182ms,client:8,客户端耗时:50546.875ms,start:23:36:46.296875_23:37:36.843750,__Server:8,服务端耗时:6531.25ms,start:23:37:30.234375_23:37:36.765625
线程 '<无名称>' (0x1360) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x11f8) 已退出,返回值为 0 (0x0)。
累计时长:56274ms,client:16,客户端耗时:56437.5ms,start:23:36:46.515625_23:37:42.953125,__Server:16,服务端耗时:6484.375ms,start:23:37:36.468750_23:37:42.953125
累计时长:56635ms,client:0,客户端耗时:57140.625ms,start:23:36:46.171875_23:37:43.312500,__Server:0,服务端耗时:6546.875ms,start:23:37:36.765625_23:37:43.312500
线程 '<无名称>' (0x16d8) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x17a4) 已退出,返回值为 0 (0x0)。
累计时长:62871ms,client:3,客户端耗时:63421.875ms,start:23:36:46.187500_23:37:49.609375,__Server:3,服务端耗时:6656.25ms,start:23:37:42.953125_23:37:49.609375
线程 '<无名称>' (0x1450) 已退出,返回值为 0 (0x0)。
累计时长:63268ms,client:13,客户端耗时:63562.5ms,start:23:36:46.453125_23:37:50.015625,__Server:13,服务端耗时:6671.875ms,start:23:37:43.312500_23:37:49.984375
线程 '<无名称>' (0x115c) 已退出,返回值为 0 (0x0)。
累计时长:69328ms,client:15,客户端耗时:69578.125ms,start:23:36:46.500000_23:37:56.078125,__Server:15,服务端耗时:6453.125ms,start:23:37:49.609375_23:37:56.062500
累计时长:69749ms,client:11,客户端耗时:70171.875ms,start:23:36:46.375000_23:37:56.546875,__Server:11,服务端耗时:6562.5ms,start:23:37:49.984375_23:37:56.546875
线程 '<无名称>' (0x177c) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x172c) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1654) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x1500) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0xce0) 已退出,返回值为 0 (0x0)。
线程 '<无名称>' (0x15a8) 已退出,返回值为 0 (0x0)。
服务端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService”。
[ServiceContract]
public interface IService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: 在此添加您的服务操作
}
// 使用下面示例中说明的数据约定将复合类型添加到服务操作。
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.IO;
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、服务和配置文件中的类名“Service”。
public class Service : IService
{
public string GetData(int value)
{
DateTime startTime = DateTime.Now;
Int64 n = 30000000;
while (n > 0)
{
Math.Pow(33333333333333333.33333, 23333333);
n--;
}
DateTime endTime = DateTime.Now;
string msg = string.Format("服务端耗时:{2}ms,start:{0}_{1}", startTime.ToString("HH:mm:ss.ffffff"), endTime.ToString("HH:mm:ss.ffffff"),
(endTime - startTime).TotalMilliseconds);
Console.WriteLine(msg);
return string.Format("Server:{0},{1}", value,msg);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
客户端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static Stopwatch sw = new Stopwatch();
static GTService.Service client = new GTService.Service();
class AAA
{
public int Value = -1;
public AAA(int value)
{
Value = value;
}
}
static void Main(string[] args)
{
sw.Start();
ThreadPool.SetMinThreads(25, 25);
for (int i = 0; i < 20; i++)
{
AAA a = new AAA(i);
System.Threading.ThreadPool.QueueUserWorkItem(DoWork,a);
}
Console.ReadKey();
}
static void DoWork(Object valuei)
{
AAA a = valuei as AAA;
int value = a.Value;
DateTime startTime = DateTime.Now;
string serverMsg=client.GetData(value, true);
DateTime endTime = DateTime.Now;
string clientMsg = string.Format("客户端耗时:{2}ms,start:{0}_{1},",
startTime.ToString("HH:mm:ss.ffffff"), endTime.ToString("HH:mm:ss.ffffff"),
(endTime - startTime).TotalMilliseconds);
string msg = string.Format("累计时长:{3}ms,client:{0},{1}__{2}",
value, clientMsg, serverMsg,sw.ElapsedMilliseconds);
Console.WriteLine(msg);
Debug.WriteLine(msg);
}
}
}