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

简介:

首先感激陈硕大大,附链接 陈硕的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。继续看书吧。

目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
112 2
|
22天前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
69 15
|
1月前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
66 2
|
2月前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
72 5
|
3月前
|
存储 安全 数据可视化
提升网络安全防御有效性,服务器DDoS防御软件解读
提升网络安全防御有效性,服务器DDoS防御软件解读
85 1
提升网络安全防御有效性,服务器DDoS防御软件解读
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
1070 2
|
3月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
1236 1
|
3月前
|
安全 区块链 数据库
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
73 17
|
1月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。

热门文章

最新文章