在平常的交流中经常有人问.net socket能支持多少在线?和C++或linux下比起来应该差很远吧?其实产生这样问题的主要原因是.net很少人去做这方面的测试,而在linux下则经常听到什么100w或500w在线连接的测试.这样一个数字看起来多么地让人兴奋...其实在这几年编写通讯服务的过程中已经意识到连接数的多少对整体影响并不大,主要归功于现有成熟悉的网络模型和硬件资源.为了更进一步证实这个问题,所以打算在.NET下测试一下100w连接交互情况,不过由于硬件内存不足不能进行100W连接量,因此只能跑个50W在线的效果.

测试硬件数量有限和IP端口的限制,为了满足这一次的测试需要只好一台机上添加多个IP...

给测试的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一次,这样主要是为了防止资源被用光导致测试无法进行;毕竟这一次的测试是以连接数量为基准.

测试结果

整个测试结果和我想的没有多大的出入,构建50W连接后由于数据交互量不大,所以除了占用比较多的内存以外基本没有对服务器CPU构成压力.

50W连接整个交互大概是每秒1.2w的请求应答量.由于连接太多在超过十几W连接的情况下netstat已经无法正常显示该端口对应的连接数量了....;虽然连接数量比较多但程序所占用的CPU资源并不高

CPU的平均占用率大概在7%左右.

服务端的内存占用率大概在2.6G左右,实际操作系统的内存已经满了.

总结

由于内存的限制在这些测试中不能跑到100w个连接有点可惜(不过以后闲着的时候把内存加上去后还会无聊地再刷一次)...;从结果已经可以进一步说明了一个非常重要的问题,只从连接数上来衡量一个服务的能力是没有多大意义.只有请求应答量才能体现出服务端的性能优势.所以当你看到100W连接的测试文章不感到惊叹,毕竟请求应答量才是体现性以指数.如果有兴趣的同学其电脑内存资源充足的情况可以做出更高的连接数出来,为了方便测试便顺提供测试程序.

/files/file/20140907/20140907145550_4695.rar

从windows的配置表信息来看,最大连接数是1K多W的连接数,如果你的内存资源足够看能冲到多少,别忘了把结果分享出来.

.NET Socket TCP 50W在线连接交互测试的更多相关文章

  1. 关于socket tcp 断线重连

    这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关 ...

  2. 初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为

    初步探究java中程序退出.GC垃圾回收时,socket tcp连接的行为 今天在项目开发中需要用到socket tcp连接相关(作为tcp客户端),在思考中发觉需要理清socket主动.被动关闭时发 ...

  3. 探讨.net Socket支持在线连接数量

    发现不少同学在用.NET做通讯的时候都关心一个问题,.NET能支持多少个在线连接.其实.net的通讯由winsocket所支持,既然由低层的winsocket所支持那.NET其端的接入连接数的受限完全 ...

  4. (转)JAVA socket 进行十六进制报文交互测试

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io. ...

  5. Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结

    Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16.Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B. ...

  6. 运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接 最近在项目中可能要用到socket相关的东西来发送消息,所以初步研究了下socket的TC ...

  7. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

  8. Socket/TCP粘包、多包和少包, 断包

    转发: https://blog.csdn.net/pi9nc/article/details/17165171 为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个 ...

  9. TODO:Golang UDP连接简单测试慎用Deadline

    TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interco ...

随机推荐

  1. leetcode刷题: 002 Add Two Numbers

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  2. Python 之Django

    1.安装Django(下载慢的时候用MaxVPN) pip3 install django 2.Django处理流程 新建project(mysite),执行dj(mysite),然后在console ...

  3. jQuery Mobile 脚本加载问题

    刚开始使用jQuery Mobile,发现很多问题需要重新考虑,比如脚本加载问题. 在普通html中,如果a.html中有链接到b.html,b.html中有类似代码: $(document).rea ...

  4. 移动端WEB开发,click,touch,tap事件浅析

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ...

  5. Android 下拉刷新框架实现

    原文地址:http://blog.csdn.net/leehong2005/article/details/12567757 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些 ...

  6. JavaIDL开发CORBA实例演示

    转载 http://www.micmiu.com/opensource/corba/corba-javaidl-dev-demo/

  7. VS2008中调试dll

    1.运行dll实例时,会直接弹出一个小框: 选择可拉起这个dll的exe运行就可以调试了 2.以后每次都会直接运行了,要重新选择程序,弹出上面的框,需要在project-->debugging- ...

  8. SAP无损耗,FP前台和回写均有2%损耗

    SAP前台显示无损耗 FP前台显示有损耗 回写也有损耗 检查:从SAP取数到FP表是没有损耗 1132物料编码的主数据也是没有损耗 检查:FP_MO2SAP存储过程

  9. Towers of Hanoi

    Your mission is to move the stack from the left peg to the right peg. The rules are well known: Only ...

  10. ASP.NET MVC应用程序执行过程分析

    ASP.NET MVC应用程序执行过程分析 2009-08-14 17:57 朱先忠 朱先忠的博客 字号:T | T   ASP.NET MVC框架提供了支持Visual Studio的工程模板.本文 ...