超高性能 Socket 服务器 - 实现细节

     2023-02-21     132

关键词:

【中文标题】超高性能 Socket 服务器 - 实现细节【英文标题】:Super High Performance Socket Server - Implementation Details 【发布时间】:2011-10-14 21:18:39 【问题描述】:

我已经完成了我的研究,我知道实现高性能套接字服务器的最佳方法通常如下:使用异步套接字操作(专门的 SocketAsyncEventArgs/Operations 以获得最佳性能)并在异步回调上,将请求推送到由线程池管理的处理队列。

我对这个处理模型的问题 - 具有最佳性能:

1) 何时应该调用套接字的“结束”操作(例如 EndAccept 或 EndReceive)?这应该在排队请求之前在回调线程(IOCP)上调用吗?还是在请求从队列中取出并被处理(工作线程)时调用?

2) 这个问题取决于#1 的答案。什么时候应该调用下一个“开始”操作?我们应该在调用 EndOperation 之前调用它,还是应该在 EndOperation 之后立即调用它(在排队/处理请求之前)?

3) 处理队列可以简单地成为 .NET 线程池吗?与推出自己的同步处理队列相比,使用 .NET 线程池有哪些优点/缺点?

非常感谢任何帮助。

【问题讨论】:

你没有做好研究:SocketAsyncEventArgs 和 Begin/End 是两种不同的模式。你不打电话给例如调用 ReceiveAsync 时的 EndReceive。 关于#1,EndXXX 操作应该在回调内部和外部调用(如果请求同步完成)。把它做好有点棘手。请参阅此post 以获得解释。如果您想避免这种情况并使用更优雅的解决方案,我建议您使用 TPL 及其FromAsync @dtb 你是对的,模型略有不同,但两种模式都遵循通过回调进行异步处理的总体概念,我的问题仍然与两者相关 【参考方案1】:

1) EndReceive 应该是您在异步回调中做的第一件事。事实上,在您调用EndReceive 之前,您无法在回调中做任何其他事情,因为这就是为您提供接收到的数据的原因。请参阅Socket.EndReceive 的示例。

EndAccept 也是如此,因为它为您提供了您将与之通信的套接字。

2) 您应该在EndAccept 之后尽快致电BeginAccept。否则,如果您的接受回调处理时间过长,您可能会丢失连接请求。当然,如果您的接受回调需要很长时间才能执行任何操作,那么您做错了。同样,BeginReceive 也是如此:在EndRead 之后尽快调用它,以避免丢失数据。或者,如果您的通信协议是请求/响应模型,客户端在发送更多数据之前希望得到响应,您可以等到发送响应之后再致电BeginRead

3) 处理可能是 .NET 线程池,但如果您要使用它,您应该考虑使用任务并行库。使用 TPL 的优势在于它非常“触发后忘记”,或者可能是“触发后它会在完成后回调”。使用 TPL 的缺点是您的应用程序更难知道哪些任务正在等待处理。如果您创建自己的同步处理队列,您始终知道哪些作业正在等待处理,并且您有可能检查队列、取消作业等。如果您想使用 TPL 执行此操作,您最终会创建一组任务你必须管理,因为有no way to get the the list of pending tasks。

但如果您不需要查看待处理的任务,那么 TPL 应该可以正常工作。

这里的相关问题有一些很好的信息。

【讨论】:

关于 #1,我想补充一点,标准 APM 模式比这要复杂一些。因为在幼稚的实现中堆栈可能会溢出。一方面,如果请求同步完成,EndXXX 方法也应该在回调之外调用。这是关于此的blog。如果有人使用 TPL,这会得到照顾。 对于#1:如果你在不调用 Endxxx 的情况下对整个 asyncresult 进行排队,你不能更早地释放 IOCP 线程吗?对于#2,我认为我们可以同意应该尽快调用它,以便您可以处理接受缓冲区中的下一个连接。对于 #3,我将研究 TPL...感谢所有建议。 @IlianPinzon 那么你是说应该在处理工作线程而不是套接字 IOCP 线程中调用 Endxxx 方法吗?感谢您推荐 TPL。 @syneman 我不确定我是否理解正确。如果请求未同步完成,则应在回调中调用 EndXXX 方法。如果请求确实同步完成,您必须调用 EndXXX,而您调用的是 BeginXXX。我提供的链接具有正确的模式。 @IlianPinzon 在请求处理受 CPU 限制时仍将请求放入队列是否值得?这不仅会导致额外的线程上下文切换而没有额外的输出吗?

高性能网络通信框架hp-socket

HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP 通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言接口。HP-Socket对通信层... 查看详情

超高速导向滤波实现过程纪要(欢迎挑战)

  自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了,利用他可以解决的所有的保边滤波器的能解决的问题,比如细节增强、HDR压缩、... 查看详情

超高性能web服务器hetao更新至v0.7.0

超高性能Web服务器hetao更新至v0.7.0了(比Nginx快3倍)。更新内容如下:0.7.0       2016-09-10   calvin*支持启动后切换到其它用户身份*修正了fasterhttp的一个致命问题*修改了makefile以及相关文件以支... 查看详情

hp-socket高性能tcp&udp通信框架

HP-Socket是一套通用的高性能TCP/UDP通信框架,包含服务端组件、客户端组件和Agent组件,腾云科技ty300.com觉得HP-Socket可以广泛适用于各种不同应用场景的TCP/UDP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言接... 查看详情

存在与存在;导致(声称的)性能差异的实现细节

】存在与存在;导致(声称的)性能差异的实现细节【英文标题】:EXISTSvsIN;implementationdetailthatgivesriseto(claimed)performancedifference【发布时间】:2019-06-1106:42:53【问题描述】:在DifferencebetweenEXISTSandINinSQL?中,很明显很多人认为“如... 查看详情

是否有实现 Socket.IO 的服务器部分的文档?

】是否有实现Socket.IO的服务器部分的文档?【英文标题】:IstheredocumentationforimplementingtheserverportionofSocket.IO?【发布时间】:2011-01-0221:00:25【问题描述】:我不想使用NodeJS服务器实现。我的服务器实现需要支持哪些协议?我在哪里... 查看详情

异步非阻塞socket的实现

...是socket套接字的在使用的中存在着阻塞,不利用爬虫的高性能运行,所以我们就需要对框架进行一些高性能设置,使用select模块,检测socket请求的IO操作,实现对socket的高性能运行:以下是代码示例:importsocketimportselectclassReque 查看详情

怎么使用socket.io连接websocket服务

...过一个demo,自己的机器最大支持3w不到的同时在线好像。性能不是特别好,豌豆荚的那个实现,性能非常高。网上有开发者做的分享PPT中有提到 查看详情

从零开始实现一个c++高性能服务器框架----socket模块(代码片段)

...99/server-framework简介项目介绍:实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括socket、http、servlet等,支持快速搭建... 查看详情

超高性能 C/C++ 哈希映射(表、字典)[关闭]

】超高性能C/C++哈希映射(表、字典)[关闭]【英文标题】:SuperhighperformanceC/C++hashmap(table,dictionary)[closed]【发布时间】:2011-03-1901:11:25【问题描述】:我需要将原始键(int,可能是long)映射到高性能哈希映射数据结构中的结构值... 查看详情

爬虫日记(102):twisted:使用deferred重构服务器代码(代码片段)

前面实现了一个诗歌下载的服务器,采用socket底层来实现的,这样比较关注底层的细节,并且还是一个阻塞的服务器,这样服务器的性能肯定不会太好。接着下来,重构这个服务器的代码。原来服务器的代码:#Thisistheblockingversio... 查看详情

c#高性能大容量socket并发:socketasynceventargs封装

...是微软提供的高性能异步Socket实现类,主要为高性能网络服务器应用程序而设计,主要是为了避免在在异步套接字I/O量非常大时发生重复的对象分配和同步。使用此类执行异步套接字操作的模式包含以下步骤: 查看详情

完整构建lnmp,简单优化实现超高并发访问!

650)this.width=650;"src="http://img1.51cto.com/attachment/201109/132201509.gif"border="0"/> LNMP简介1.什么是LNMP?  也许大家对LAMP比较熟悉,LAMP代表Linux下Apache、MySQL、PHP这种网站服务器架构;同上LNMP代表的就是Linux下Nginx、 查看详情

高性能tcp/udp/http通信框架hp-socketv4.1.2

  HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言接口。HP-Socket对通信层... 查看详情

c#httpwebrequest如何实现socket5代理

...实现是类似的,注意的事,这里不是讲用C#实现一个代理服务器,因为实现一个代理服务器需要实现很多协议,头大,而且现在市面上有很多现成的代理服务器用,性能又好,直接用不好吗?而是用C#来实现客户端通过一个代理... 查看详情

socketserver-实现并发处理

...它提供了标准的BSDSocketAPI;另一个是socketServer,它提供了服务器中心类,可以简化网络服务器的开发。1.前言:虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑... 查看详情

高性能tcp/udp/http通信框架hp-socketv4.0.1发布

  HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言接口。HP-Socket对通信层... 查看详情

高性能网络通信框架hp-socket

  HP-Socket 详细介绍HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP 通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编... 查看详情