文档章节

.NET Socket TCP 50W在线连接交互测试

泥水佬
 泥水佬
发布于 2014/09/10 22:42
字数 893
阅读 365
收藏 3

        在平常的交流中经常有人问.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左右,由于没有控制socket层面的buffer实际操作系统的内存已经满了.

总结

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

/files/file/20140907/20140907145550_4695.rar

个人站:www.ikende.com
个人开源项目github.com/IKende

elastic communication component for .net

© 著作权归作者所有

泥水佬

泥水佬

粉丝 72
博文 91
码字总数 60737
作品 7
广州
架构师
私信 提问
加载中

评论(2)

泥水佬
泥水佬

引用来自“egmkang”的评论

一秒1.2w个请求还算多吗
这个网络交互量的确是很少的,现有服务器的CPU,想CPU曲线有变化比交困难
egmkang
egmkang
一秒1.2w个请求还算多吗
100万并发连接服务器笔记之1M并发连接目标达成

第四个遇到的问题:tcp_mem 在服务端,连接达到一定数量,诸如50W时,有些隐藏很深的问题,就不断的抛出来。 通过查看dmesg命令查看,发现大量TCP: too many of orphaned sockets错误,也很正...

开心303
2013/08/08
0
1
TCP: too many of orphaned sockets报错解决

tcp_mem 在服务端,连接达到一定数量,诸如50W时,有些隐藏很深的问题,就不断的抛出来。 通过查看dmesg命令查看,发现大量TCP: too many of orphaned sockets错误,也很正常,下面到了需要调...

憬薇
2017/10/23
0
0
关于 Out of Socket memory 的解释

关于 Out of Socket memory 的解释 1. 原因分析 一台 Nginx server,到晚上高峰 messages 出现大量的如下信息: Apr 23 22:43:21 rs1 kernel: [...] Out of socket memory 两种情况会出发 "O......

miffa
2014/11/19
0
0
Http和Socket连接区别

Http和Socket连接区别 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助。 1、TCP连接 要想明白Socket连接,先要明白TCP...

zhangfei_kr
2018/06/26
0
0
使用Nginx代理thrift NIO实现SSL链路加密

1 目标说明 1.1 调研目的 本次调研主要为了解决两个问题: thrift提供的SSL API只支持BIO(阻塞式IO),而我们使用的是NIO API,希望能在不改变IO模型的前提下对链路进行加密; 未来系统可能...

囚兔
2016/06/22
2.9K
11

没有更多内容

加载失败,请刷新页面

加载更多

Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
3
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
3
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
8
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
4
0
centos7修改命令行或图形界面启动模式

1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改启动模式(修改为图形界面,要是修改为命令行就multi-user.target) 2.systemctl set-default multi-...

大圣39
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部