非阻塞IO服务器模型

简介: 我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss。每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线。如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先分析游戏服务器有哪些特点:①  网络游戏并非像网页一样,打开一旦下载完就可以关闭连接结束。

我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss。每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线。如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先分析游戏服务器有哪些特点:

①  网络游戏并非像网页一样,打开一旦下载完就可以关闭连接结束。网游必须是有一个持久有状态的连接,每一个客户端都需要跟服务器存在一个持久的连接,以便快速及时发送消息。而随着并发用户数量的增加,多线程阻塞服务器不可能为每一个客户端分配一个线程。

②  跟一般的应用服务器不同,CS结构的网络游戏一般把复杂的逻辑处理放到了客户端,而在游戏服务器端只处理比较简单的逻辑,甚至只是传递消息。像这样简单的逻辑我们竟然给每一个请求分配一条线程,这是不是严重脱离实际了?

③  网游讲求的是响应快,消息交换及时,并且能进行双向通信,那必然需要频繁请求跟响应,假如我们已经采用了长久连接,但服务器并不是每次都有新数据,并不需要发送给客户端,那我们还占了一条线程,是不是太浪费了?

从以上几点分析,像网游这样的场合,我们传统的多线程服务器显然已经力不从心。线程池能在一定程度上缓解频繁的IO调用带来的资源占用,但池有一定的大小限制,在面对成千上万的客户端请求大并发情况下,却始终不是最佳方案。有没有可能用一个或少量的线程就可以维护很多持久连接呢?下面介绍一种新的服务器模型——非阻塞服务器模型。

非阻塞服务器模型最重要的一个特点是,在调用某个接口后立即返回,而不会阻塞等待。如图2-6-2-1中所展示,当多个客户端向服务器请求时,服务器端会保存一个socket连接列表,然后有一个专门的线程对这个列表进行轮询。如果发现某个socket有数据可读,就调用该socket的相应的读操作;反之,发现socket有数据可写的话,就调用该socket的相应的写操作;如果发现某个socket已经中断,就调用socket关闭操作。为了有更好地性能,还可以结合线程池,一旦检测到有需要处理(读数据、写数据、关闭)的socket就启动另外一条线程负责处理。

图2-6-2-1 非阻塞服务器模型

 

这样看来,不管多少个socket连接都可以被一条线程管理起来,一条线程负责遍历这些socket列表,处理再交给线程池,很好地利用了阻塞的时间,处理能力得到提升。但这种模型涉及到遍历所有的socket列表,同时需要处理数据的拼接,空闲时也占用较多CPU资源,仍然不适于大并发场景。再稍做改进——事件驱动模型。它的核心是事件驱动,线程遍历的并非socket列表,取而代之的是检测事件,对检测出来的事件进行逐一响应。极大提高了检测效率,自然处理能力也更强。



==========广告时间==========

鄙人的新书《Tomcat内核设计剖析》已经在京东预售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

=========================

目录
相关文章
|
4天前
|
Java Unix Linux
什么是阻塞IO和非阻塞IO
什么是阻塞IO和非阻塞IO
|
27天前
|
存储 弹性计算 安全
ECS的安全责任共担模型
云服务器ECS的云上安全性是阿里云和客户的共同责任。本文介绍云服务器ECS(Elastic Compute Service)与客户在安全性方面各自应该承担的责任。
|
1天前
使用高性能服务器训练StableDiffusion——人物模型.safetensors
使用高性能服务器训练StableDiffusion——人物模型.safetensors
6 0
|
4天前
|
机器学习/深度学习 人工智能 网络安全
人工智能平台PAI产品使用合集之在本地可以成功进入模型流,但在服务器上无法进入,是什么原因
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
13天前
|
异构计算 弹性计算 并行计算
|
16天前
|
存储 监控 Java
Java nio非阻塞io
Java nio非阻塞io
|
22天前
|
测试技术 PyTorch 算法框架/工具
魔搭开源推理引擎 DashInfer,助力CPU服务器解锁大模型超强推理
ModelScope推出了预训练大语言模型(LLM)推理引擎DashInfer,采用C++ Runtime编写,提供C++和Python语言接口,具有生产级别的高性能表现,适用于多种CPU架构,包括x86和ARMv9。DashInfer支持连续批处理(Continuous Batching)和多NUMA推理(NUMA-Aware),能够充分利用服务器级CPU的算力,为推理14B及以下的LLM模型提供更多的硬件选择。该项工作已开源。
|
30天前
|
存储 机器学习/深度学习 人工智能
社区供稿 | Yuan2.0千亿大模型在通用服务器上的高效推理实现:以NF8260G7服务器为例
浪潮信息联合Intel在IPF大会上发布了可运行千亿参数大模型的AI通用服务器,首次实现了单机通用服务器,即可运行千亿参数大模型。并在发布现场演示了基于NF8260G7服务器进行yuan2.0-102B模型在代码编写、逻辑推理等高难度问题上的实时推理效果,引起了业界广泛的关注。本文将详细解读yuan2.0-102B模型在NF8260G7服务器上进行高效实时推理的原理和技术路径。
|
1月前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
20 2
|
1月前
|
运维 监控 Serverless
【专栏】无服务器架构,一种云计算模型,让开发者专注编写代码而不必管理服务器(Serverless)
【4月更文挑战第28天】无服务器架构,一种云计算模型,让开发者专注编写代码而不必管理服务器。它基于事件驱动,自动扩展资源并按需计费。优势包括缩短开发周期、优化资源利用、降低成本、提高可用性及简化维护。然而,冷启动延迟、调试困难、性能监控、安全性和学习曲线等挑战仍需解决。随着技术进步,无服务器架构将在科技发展中发挥更大作用。