关于socket通讯,如何才能高效?

网络通讯,一个不朽的话题,今天和一个做游戏的朋友(以前的同事聊天),他向我诉说了他的痛苦

他之前是做客户端的,无奈人力资源紧张,也开始搞服务器,他说自己的服务器总是不稳定,于是就

聊到了这个话题,在他现有的项目中,大概有1000个链接,每个连接每秒发最大发送四个数据包。而且

数据包的大小很小。服务器在做压力测试的时候,几乎啥都没有做,就是接到包,然后回复,其他的

任务业务逻辑也没有,连续测试4天,服务器就挂了。

  经过了解,他在开发过程中,用来很线程,他觉得服务器一定要多线程来接受数据才快。服务器为

那么多人提供服务,一定要多线程才可以,否则cpu会忙不过来,他的想法也是大多数人的想法,其实

这就错了。

  我们可以想像一下,网卡能处理多少数据,很多程度上受限制与网络速度,一但网络的速度确定了,

基本上就没有什么悬念了,例如一个100M带宽的网络,换算成大B,也就12M的样子,如果一个包大小

为1K,那么一秒中,我们处理的包数量为 12 * 1024 一万多个包,如果是一个包围100个字节,我们

需要处理的包12W(1024 × 1024 × 12  /100)的样子,成熟一点的网络底层通讯库都可以做到这一点,大可不必担心处理不过来。

  可以试想一下,使用一个单独的线程来接收这些数据包,和使用两个,或者多个线程处理接收这些

数据包,哪一个时间会更加快呢 ?答案肯定是一个线程接收的快。下面我们来分析下原因,为什么一个

线程会更快,先看单线程的情况:

  每次接收不需要做任何的互斥处理,接收就是了,相当于该线程只接受数据,其他的事情都没有做

但是如果是多线程接收:那么就要考虑互斥等问题,如果一个线程正在就诶收一个数据包,那么另外一个线程就不能

工作,等待第一个完成以后,才可以继续工作,cpu会花费更多的时间在线程的互斥上,实际上相当于一个线程在工作

而不是同时有两个或者多个线程同时工作,而且除了接收数据,还要兼顾线程切换工作。

  那有些人可能会说了,这个很不对,windows中的IOCP(完成端口)就是多线程工作的,而且建议使用

多线程,IOCP确实是多线程工作的,但不是接收数据,当我们调用IOCP的”GetQueuedCompletionStatus"函数的时候,其实数据已经

完成接收了,而我们在线程做到是做已经接收到的数据做什么处理,已经是业务的事情。

  而实际上,接收网络数据包的时间远比处理业务的时间要短,所以在我们接收到网络数据包以后,做到事情可以并行化

如果可以并行化,那么就大大的提高了应用成的性能,举一个简单的例子,当客户端要求计算一个数据的时候,这个计算

需要花费1秒钟,那么如果我们在接收线程中处理这个事情,其他的请求将被阻塞,如下图所示:

但如果是把计算任务放到另外的线程中,效果完全不一样(这个另外的线程,我们给他起个名称)叫业务线程,

当然可以用线程池的方式,这个就和IOCP(完成端口),是一回事情了。今天就说到这里,限于本人能力有限,

表述不正确的请见谅指正。

 
 
分类: 网络编程
标签: 网络通讯socket

关于socket通讯,如何才能高效?的更多相关文章

  1. 客户端技术的一点思考(数据存储用SQLite, XMPP通讯用Gloox, Web交互用LibCurl, 数据打包用Protocol Buffer, socket通讯用boost asio)

    今天看到CSDN上这么一篇< 彻底放弃没落的MFC,对新人的忠告!>, 作为一个一直在Windows上搞客户端开发的C++程序员,几年前也有过类似的隐忧(参见 落伍的感觉), 现在却有一些 ...

  2. .net 平台下, Socket通讯协议中间件设计思路(附源码)

    .net 平台下,实现通讯处理有很多方法(见下表),各有利弊: 序号 实现方式 特点 1 WCF 优点:封装好,方便.缺点:难学,不跨平台 2 RocketMQ,SuperSocket等中间件 优点: ...

  3. 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)

    前言 本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程.常言道:人在压力下,才可能出非凡的成果.我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力.处理socket ...

  4. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  5. 试解析Tomcat运行原理(一)--- socket通讯

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  6. c# TCP Socket通讯基础

    在做网络通讯方面的程序时,必不可少的是Socket通讯. 那么我们需要有一套既定的,简易的通讯流程. 如下: <pre name="code" class="csh ...

  7. 思考探索,如何才能高效访问我的这个DataTable?

    需求 一切都是空的,除了Money,只有需求才是最真的,你懂的. 最近接到个略显棘手的需求,思索再三,想出两种方法,可觉得都不太好,这里与大家讨论一下. 需求如下: 用户需要在现有的某个grid中添加 ...

  8. Android笔记:Socket通讯常见问题

    经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2  如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...

  9. java socket通讯(二)处理多个客户端连接

    通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...

随机推荐

  1. 微信公众平台消息接口PHP版开发教程

    原文:微信公众平台消息接口PHP版开发教程  一.写好接口程序 在你的服务器上上传好一个接口程序文件,如http://www.yourdomain.com/weixin.php  内容如下: &l ...

  2. Linq技术四:动态Linq技术 -- Linq.Expressions

    前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景. 命名空间: System.Linq; ...

  3. Cocos2d-x Lua 阅读Csv文件,使用数据更方便

    在我的书或出售之前,我的源代码,有Csvshadow文件. 也许这是偏见.我与工作将是最长的轮廓Csv,所以,我会帮助不大喜欢它的游戏. Csv文件,非常格式easy,也就是说,一个数据线,字段之间用 ...

  4. C语言 链表

    原文:C语言 链表 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能. ...

  5. Asp.Net MVC5入门学习系列④

    原文:Asp.Net MVC5入门学习系列④ 添加Model且简单的使用EF 对于EF(EntityFramework)不了解的朋友可以去百度文科或者在园子里搜一些简资源看下,假如和我一样知道EF的概 ...

  6. 2014Esri国际用户大会ArcGIS Online

    1.基于什么是新的ArcGISOnline? ArcGISOnline不断更新.大约每四个月就会把新的增强的功能公布到各部分中.有新的空间分析的应用程序,如 Explorer forArcGIS,ap ...

  7. 2. SQL Server数据库状态监控 - 错误日志

    原文:2. SQL Server数据库状态监控 - 错误日志 无论是操作系统 (Unix 或者Windows),还是应用程序 (Web 服务,数据库系统等等) ,通常都有自身的日志机制,以便故障时追溯 ...

  8. sql点滴41—mysql常见sql语法

    原文:sql点滴41-mysql常见sql语法 ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename ...

  9. three.js 源代码凝视(七)Math/Euler.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  10. 记录一下Fedora21下安装Foundation5遇到的问题[尚有遗留问题]

    写在前面:之前安装过了gem,所以下面的步骤没有这一过程,再有就是忘记哪一步需要ruby中的一个.h文件.可以使用如下命令解决 sudo yum install ruby-devel ------ S ...