从一个嵌入式网络服务器想到的

简介:

首先感激陈硕大大,附链接 陈硕的CSDN。《UNP》这本书肯定也是必须的,豆瓣的评价

       最近项目需要有一个嵌入式网络服务器,在系统中,该模块需要与每个客户端保持多个socket连接,然后将收到的数据分别转发给对应的上层处理模块。有点像云风的blog中提到的游戏服务端的接入服务器。但为了满足实时性,转发机制不经过socket,直接保存到优先级队列中。这里面的优化的地方颇多,暂时有零拷贝机制优化,相对于linux中用户态和内核态的各种缓冲拷贝,VxWorks直接在内核态操作无疑给这方面的优化工作大大的便利,也不准备使用RTP用户态机制给自己添堵了。这篇博客不准备在这方面写更多,其实重点是网络编程模型的一些东西。

       之前一直对linux网络编程有些感觉,在VxWorks上面,同样的需求让我很是惊喜。该模块大体情况为:使用VxWorks SMP中的CPU亲和机制,给该模块分配一个CPU核单独使用。每个客户端会和服务器保持多个连接,各个连接发送不同功能的信息,这些信息将会分配到不同的消息队列供上层处理。首先想到的是以下三个架构方法:

单任务设计肯定很简单,连任务切换都省了。在任务中使用select()监听多个socket,这是《UNP》一书中详细讲解的方法,但对后续优化肯定不方便,而且select那令人dt的轮询机制和socket连接数限制也会让人无比羡慕epoll这种大杀器。

要与零拷贝机制结合,最初的设想是多个任务分别监听,只要注意好惊群效应和任务均衡就ok。这也是《UNP》的设想,比单一任务accept再分发连接效率高。但这么做对后续数据的分发及其不方便,每一个任务都要去判别分发到哪个消息队列。

那么,单一任务accept。判断是何种消息socket,再分别发送到各个单一功能任务中。无疑是很好的办法了。这么做的好处还有一点就是,每个任务都只操作一个消息队列(只收发一种消息),在零拷贝机制上,可以最大限度地减少拷贝甚至不拷贝。

     第一个方法肯定不用,第二个方法也有改进的地方,多任务accept的时候,可以监听不同的端口,达到分发效果。这么做有另外的消耗,最重要的是,降低了客户端的可复用性。可能后续有一些折中,具体选用还得考虑。这些所有的模型,都使用了事件循环机制,每个事件循环可以处理一定量的accept事件和数据I/O事件。

     前几天参加风河开发者大会,提到物联网与大数据。无疑,大数据处理在现今是一个很时髦的话题。额,暂时我也没那范去搞这方面的内容,只是在看面试集锦中,总结起来,大量数据的处理,bit-map、分治法、哈希大致应该为大杀器,理解了就可以秒杀这方面的面试了。

     网络编程中,处理大量并发连接,何尝不是一种大数据呢。bit-map和哈希就不去想它了。这里主要想说的是分治法:

把一个复杂的问题分成多个的相同或相似的子问题求解,原问题的解即子问题的解的合并。

     服务器要处理的事情,归结起来,有三部分:accept、数据IO、数据处理。

     首先感谢epoll机制的高效性。以前的poll机制,有两个性能瓶颈,一是每次poll都要把需要等待的fd拷贝到内核;二是轮询。epoll则让内核保存fd来避免拷贝,以异步回调来处理事件发生。在使用时,可以把epoll看做一个数据处理工具,这个工具有自己的性能瓶颈,处理的数据量是有限制的。那么,怎么去处理超过其瓶颈的数据呢。无疑是分治法:

     将需要处理的“数据”(也可以成为事件)划分给多个epoll事件循环,这些循环交给多线程/多进程去承载。

     首先,Accept和数据IO具有连续性,你可以简单地使用多个事件循环去accept,每个事件循环处理自己连接上的数据IO。至于数据处理部分,若处理量大,一般使用线程池或者进程池处理。这个方法与UNP一书中多进程/线程Accept有异曲同工之妙,只是将每个进程/线程上的阻塞模型改为事件循环+异步非阻塞模型而已。当然,同时需要处理的还有惊群效应和负载均衡。Nginx是使用该模型的很好的例子。需要注意到的是,每个线程/进程最好只承载一个事件循环。进程/线程数量的安排也与CPU核的个数有关。SMP机制虽然可以让我们很容易使用多核CPU,但进程/线程在CPU间的转移有很大的效率上的损失,不论是VxWorks还是linux,都提供进程与CPU核的亲缘性与绑定机制,对效率上的增加有一定好处。

    其次,当Acccpt事件和IO事件不对等的时候。例如,一些应用场合Accept事件很少,甚至只是简单的接受固定的长连接事件(比如上面讲的那个嵌入式服务器),但数据IO却非常多。那么,可以再一个事件循环中专门处理Accept事件,然后将连接分发到专用IO处理事件循环中。数据处理同上一种情况,以计算量大小决定是否选择pool解决。

   但写起来,总感觉实际应用情况要复杂得多。不同的数据类型,不同的应用场合,可能在模型设计与性能优化之间有很大折中,可能在网络服务器这块选用不是效率最高的那种,但整体考虑,它可能是最适合系统整体优化的。

   项目中要用到SCTP,看来得重回UNP阅读SCTP部分了。这本书乍一看有些老了。各种编程模型在工业场合也基本不会用,但总感觉那些东西像形状不同的积木,不论是什么高级的模型,都可以再这里找到原型。OK。继续看书吧。

目录
相关文章
|
2月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
87 1
|
2月前
|
监控 安全 数据挖掘
网络游戏服务器如何有效防护DDoS与CC攻击
随着网络游戏行业的蓬勃发展,其背后的服务器架构日益复杂,同时也面临着前所未有的网络安全威胁。其中,分布式拒绝服务(DDoS)和CC(Challenge Collapsar,一种针对网页的攻击方式)攻击尤为突出,它们通过大量伪造请求或恶意流量,使服务器资源耗尽,导致服务中断或响应缓慢。因此,保障网络游戏服务器的安全,有效防护DDoS与CC攻击,已成为游戏行业亟待解决的问题。
|
16天前
|
存储 弹性计算 测试技术
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
阿里云服务器ECS实例可以分为多种实例规格族。根据CPU、内存等配置,一种实例规格族又分为多种实例规格。而实例规格又包含vCPU、处理器、内存、vTPM、本地存储、网络带宽、网络收发包PPS、连接数、弹性网卡、云盘带宽、云盘IOPS等指标,本文为大家详细介绍实例规格的这些指标,以供大家了解和选择。
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
|
6天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
45 5
|
9天前
|
数据安全/隐私保护
Haskell网络编程:代理服务器的高级使用技巧
Haskell网络编程:代理服务器的高级使用技巧
|
22天前
|
存储 运维 网络协议
运维的基本概念:服务器和网络基础知识
运维的基本概念:服务器和网络基础知识
41 0
运维的基本概念:服务器和网络基础知识
|
2月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
69 0
|
4天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的信息安全新挑战
【9月更文挑战第29天】在数字化浪潮的推动下,云计算服务如雨后春笋般涌现,为各行各业提供了前所未有的便利和效率。然而,随着数据和服务的云端化,网络安全问题也日益凸显,成为制约云计算发展的关键因素之一。本文将从技术角度出发,探讨云计算环境下网络安全的重要性,分析云服务中存在的安全风险,并提出相应的防护措施。我们将通过实际案例,揭示如何在享受云计算带来的便捷的同时,确保数据的安全性和完整性。
|
4天前
|
SQL 安全 算法
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第29天】随着互联网的普及,网络安全问题日益严重。本文将介绍网络安全漏洞、加密技术以及安全意识等方面的内容,帮助读者了解网络安全的重要性,提高自身的网络安全意识。
|
4天前
|
存储 SQL 安全
网络安全与信息安全:构建安全防线的关键策略
本文深入探讨了网络安全与信息安全领域的核心要素,包括网络安全漏洞、加密技术以及安全意识的重要性。通过对这些关键领域的分析,旨在为读者提供一套综合性的防护策略,帮助企业和个人在日益复杂的网络环境中保障数据安全。
15 4
下一篇
无影云桌面