在日常的交流中常常有人问.net socket能支持多少在线?和C++或linux下比起来应该差很远吧?其实产生这样问题的主要缘由是.net不多人去作这方面的测试,而在linux下则常常听到什么100w或500w在线链接的测试.这样一个数字看起来多么地让人兴奋...其实在这几年编写通信服务的过程当中已经意识到链接数的多少对总体影响并不大,主要归功于现有成熟悉的网络模型和硬件资源.为了更进一步证明这个问题,因此打算在.NET下测试一下100w链接交互状况,不过因为硬件内存不足不能进行100W链接量,所以只能跑个50W在线的效果.linux
测试硬件数量有限和IP端口的限制,为了知足这一次的测试须要只好一台机上添加多个IP...windows
给测试的Client电脑添加了10个IP,每一个IP分别绑定10000-60000端口,而测试程序针对每一个IP构建一个线程来建立链接,链接建立完成后就定量轮循链接向服务器发送消息.服务器
static void Connect(object state)网络
{ string ipaddress = (string)state; System.Net.IPAddress ip = System.Net.IPAddress.Parse(ipaddress); for(int i=10000;i<60000;i++) { try { Socket mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); mSocket.Bind(new System.Net.IPEndPoint(ip, i)); mSocket.Connect(mHost, mPort); SocketAsyncEventArgs sae = new SocketAsyncEventArgs(); sae.SetBuffer(new byte[1024], 0, 1024); sae.UserToken = mSocket; sae.Completed += OnReceive; BeginReceive(mSocket, sae); lock (mSockets) { mSockets.Add(mSocket); } } catch (Exception e_) { Console.WriteLine("create socket client error {0} with {1}@{2}", e_.Message, ipaddress, i); } System.Threading.Thread.Sleep(1); } while (true) { for (int i = 0; i < 20; i++) { long index = System.Threading.Interlocked.Increment(ref mIndex); mSockets[(int)(index % mSockets.Count)].Send(Encoding.UTF8.GetBytes("{\"name\":\"henryfan\"}")); } System.Threading.Thread.Sleep(1); } }
代码程序比较简单,每次获取20个链接进行数据发送,每次发送完后sleep一次,这样主要是为了防止资源被用光致使测试没法进行;毕竟这一次的测试是以链接数量为基准.socket
整个测试结果和我想的没有多大的出入,构建50W链接后因为数据交互量不大,因此除了占用比较多的内存之外基本没有对服务器CPU构成压力.性能
50W链接整个交互大概是每秒1.2w的请求应答量.因为链接太多在超过十几W链接的状况下netstat已经没法正常显示该端口对应的链接数量了....;虽然链接数量比较多但程序所占用的CPU资源并不高测试
CPU的平均占用率大概在7%左右.操作系统
服务端的内存占用率大概在2.6G左右,实际操做系统的内存已经满了..net
因为内存的限制在这些测试中不能跑到100w个链接有点惋惜(不过之后闲着的时候把内存加上去后还会无聊地再刷一次)...;从结果已经能够进一步说明了一个很是重要的问题,只从链接数上来衡量一个服务的能力是没有多大意义.只有请求应答量才能体现出服务端的性能优点.因此当你看到100W链接的测试文章不感到惊叹,毕竟请求应答量才是体现性以指数.若是有兴趣的同窗其电脑内存资源充足的状况能够作出更高的链接数出来,为了方便测试便顺提供测试程序.线程
/files/file/20140907/20140907145550_4695.rar
从windows的配置表信息来看,最大链接数是1K多W的链接数,若是你的内存资源足够看能冲到多少,别忘了把结果分享出来.