在平常的交流中经常有人问.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. Python之路【第十五篇】:Web框架

    Python之路[第十五篇]:Web框架   Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...

  2. XidianOJ 1120 Gold of Orz Pandas

    题目描述 Orz Panda is addicted to one RPG game. To make his character stronger, he have to fulfil tasks ...

  3. python类——黑板客老师课程学习

    1.基本语法 class class_name(base_class):  base_class是它继承的父类 class_var def methods(self,args): statements ...

  4. 创建 XMLHttpRequest 对象

    var _createHttpRequest = function () { var obj; if (window.XMLHttpRequest) obj = new XMLHttpRequest( ...

  5. DropDownList的使用,RadioButtonList的使用

    DropDownList的使用之从后台动态获取值 前端aspx代码如下 <asp:DropDownList ID="DDLTypeID" runat="server ...

  6. c语言使用zlib实现文本字符的gzip压缩与gzip解压缩

    网络上找到的好多方法在解压缩字符串的时候会丢失字符,这里是解决方法: http://stackoverflow.com/questions/21186535/compressing-decompres ...

  7. MySQL数据库指定字符集

    mysql 创建数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的编 ...

  8. VB6.0 读取CSV文件

    最近做了一个Upload文件的需求,文件的格式为CSV,读取文件的方法整理了一下,如下: 1.先写了一个读取CSV文件的Function: '读取CSV文件 '假设传入的参数strFile=C:\Do ...

  9. 实战录 | Redis的主从服务器搭建

    <实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全平台工程师田全磊,将带来Red ...

  10. 第一个jsp代码实现简单计算器

    a.新建mycal.Jsp,把简单计算机的框架写出来: <form action="myresult.jsp"> 请输入第一个数:<input type=&quo ...