首页 文章 精选 留言 我的

精选列表

搜索[netty],共2196篇文章
优秀的个人博客,低调大师

java nio,netty,kafka 中经常提到“零拷贝”到底是什么?

零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。 1 I/O 中断原理 在 DMA 技术出现之前,应用程序与磁盘之间的 I/O 操作都是通过 CPU 的中断完成的。 用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。 CPU 在接收到指令以后对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区。 数据准备完成以后,磁盘向 CPU 发起 I/O 中断。 CPU 收到 I/O 中断以后将磁盘缓冲区中的数据拷贝到内核缓冲区,然后再从内核缓冲区拷贝到用户缓冲区。 用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时间钟。 可以看到,整个数据的传输过程,都要需要 CPU 亲自参与搬运数据的过程,而且这个过程,CPU 是不能做其他事情的。 假如通过千兆网卡或者磁盘传输大量数据时,使用 CPU 来拷贝的话,对 CPU 资源是种极大的消耗。 2 DMA 方式 DMA 的全称是直接内存访问(Direct Memory Access),是一种硬件设备绕开 CPU 独立直接访问内存的机制。 目前支持 DMA 的硬件包括:网卡、声卡、显卡、磁盘控制器等。 基于 DMA 访问方式,系统主内存于硬盘或网卡之间的数据传输可以绕开 CPU 的全程调度,数据搬运的工作交给 DMA 控制器,在传输过程中,CPU 可以继续处理其他的工作,提升系统的资源利用率。 用户进程向 CPU 发起 read 系统调用读取数据,用户态切换为内核态,然后一直阻塞等待数据的返回。 CPU 在接收到指令以后对 DMA 磁盘控制器发起调度指令。 DMA 磁盘控制器对磁盘发起 I/O 请求,将磁盘数据先拷贝到磁盘控制器缓冲区,CPU 全程不参与此过程。 数据读取完成后,DMA 磁盘控制器会接受到磁盘的通知,将数据从磁盘控制器缓冲区拷贝到内核缓冲区。 DMA 磁盘控制器向 CPU 发出数据读完的信号,由 CPU 负责将数据从内核缓冲区拷贝到用户缓冲区。 用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时间钟。 3 传统 I/O 方式 为了理解零拷贝技术的思路,首先了解一下传统 I/O 方式存在的问题。 Linux 系统中,传统的访问方式是通过 write() 和 read() 两个系统调用实现的,通过 read() 函数读取文件到到缓存区中,然后通过 write() 方法把缓存中的数据输出到网络端口 。 下图分别对应传统 I/O 操作的数据读写流程,整个过程涉及 4 次上下文切换、 2 次 CPU 拷贝、2 次 DMA 拷贝总共 4 次拷贝。 4 次上下文切换 因为发生了两次系统调用,一次是 read() ,一次是 write(),用户程序向内核发起系统调用时,CPU 将用户进程从用户态切换到内核态;当系统调用返回时,CPU 将用户进程从内核态切换回用户态。 4 次 数据拷贝 第一次 DMA 拷贝,将磁盘上的数据拷贝到操作系统内核的缓冲区 ; 第二次 CPU 拷贝,将内核缓冲区的数据拷贝到用户的缓冲区里; 第三次 CPU 拷贝,将用户缓冲区的数据,拷贝到内核 Socket 缓冲区; 第四次 DMA 拷贝,将内核 Socket 缓冲区的数据拷贝到网卡的缓冲区。 综上,想要提升文件传输的性能,因此我们需要减少「上下文切换 」和「数据拷贝」的次数。 3 零拷贝方式 零拷贝技术实现的方式通常有 2 种:mmap + write 、sendfile、sendfile + DMA scatter-gather 。 3.1 mmap + write mmap 是 Linux 提供的一种内存映射文件的机制,它实现了将内核中读缓冲区地址与用户空间缓冲区地址进行映射,从而实现内核缓冲区与用户缓冲区的共享。 基于 mmap + write 系统调用的零拷贝方式,整个拷贝过程会发生 4 次上下文切换,1 次 CPU 拷贝和 2 次 DMA 拷贝。 用户程序读写数据的流程如下: 用户进程通过 mmap() 函数向内核发起系统调用,上下文从用户态切换为内核态。 将用户进程的内核空间的读缓冲区与用户空间的缓存区进行内存地址映射。 CPU 利用 DMA 控制器将数据从主存或硬盘拷贝到内核空间的读缓冲区。 上下文从内核态切换回用户态,mmap 系统调用执行返回。 用户进程通过 write() 函数向内核发起系统调用,上下文从用户态切换为内核态。 CPU 将读缓冲区中的数据拷贝到的网络缓冲区。 CPU 利用 DMA 控制器将数据从网络缓冲区(socket buffer)拷贝到网卡进行数据传输。 上下文从内核态切换回用户态,write 系统调用执行返回。 mmap 的拷贝虽然减少了 1 次 CPU 拷贝,提升了效率,但也存在一些隐藏的问题。 当 mmap 一个文件时,如果这个文件被另一个进程所截获,那么 write 系统调用会因为访问非法地址被 SIGBUS 信号终止,SIGBUS 默认会杀死进程并产生一个 coredump,服务器可能因此被终止。 3.2 sendfile sendfile 系统调用在 Linux 内核版本 2.1 中被引入,目的是简化通过网络在两个通道之间进行的数据传输过程。 通过 sendfile 系统调用,数据可以直接在内核空间内部进行 I/O 传输,从而省去了数据在用户空间和内核空间之间的来回拷贝。 sendfile 系统调用的引入,不仅减少了 CPU 拷贝的次数,还减少了上下文切换的次数,它的伪代码如下: 基于 sendfile 系统调用的零拷贝方式,整个拷贝过程会发生 2 次上下文切换,1 次 CPU 拷贝和 2 次 DMA 拷贝。 用户程序读写数据的流程如下: 用户进程通过 sendfile() 函数向内核发起系统调用,上下文从用户态切换为内核态。 CPU 利用 DMA 控制器将数据从主存或硬盘拷贝到内核空间的读缓冲区。 CPU 将读缓冲区中的数据拷贝到的网络缓冲区。 CPU 利用 DMA 控制器将数据从网络缓冲区拷贝到网卡进行数据传输。 上下文从内核态切换回用户态,sendfile 系统调用执行返回。 相比较于 mmap 内存映射的方式,sendfile 少了 2 次上下文切换,但是仍然有 1 次 CPU 拷贝操作。 3.3 sendfile + DMA gather copy Linux 2.4 版本的内核对 sendfile 系统调用进行修改,为 DMA 拷贝引入了 gather 操作。 它将内核空间的读缓冲区中对应的数据描述信息(内存地址、地址偏移量)记录到相应的网络缓冲区中,由 DMA 根据内存地址、地址偏移量将数据批量地从读缓冲区拷贝到网卡设备中,这样就省去了内核空间中仅剩的 1 次 CPU 拷贝操作。 在硬件的支持下,sendfile 拷贝方式不再从内核缓冲区的数据拷贝到 socket 缓冲区,取而代之的仅仅是缓冲区文件描述符和数据长度的拷贝,这样 DMA 引擎直接利用 gather 操作将页缓存中数据打包发送到网络中即可,本质就是和虚拟内存映射的思路类似。 基于 sendfile + DMA gather copy 系统调用的零拷贝方式,整个拷贝过程会发生 2 次上下文切换、0 次 CPU 拷贝以及 2 次 DMA 拷贝,用户程序读写数据的流程如下: 用户进程通过 sendfile() 函数向内核发起系统调用,上下文从用户态切换为内核态。 CPU 利用 DMA 控制器将数据从主存或硬盘拷贝到内核空间的读缓冲区。 CPU 把读缓冲区的文件描述符(file descriptor)和数据长度拷贝到网络缓冲区。 基于已拷贝的文件描述符和数据长度,CPU 利用 DMA 控制器的 gather/scatter 操作直接批量地将数据从内核的读缓冲区拷贝到网卡进行数据传输。 上下文从内核态切换回用户态,sendfile 系统调用执行返回。 5 写到最后 无论是传统 I/O 拷贝方式还是引入零拷贝的方式,2 次 DMA 拷贝是都少不了的,因为两次 DMA 都是依赖硬件完成的。 | 拷贝方式 | CPU拷贝 | DMA拷贝 | 系统调用 | 上下文切换 | | -------------------------- | ------- | ------- | ------------ | ---------- | | 传统方式(read + write) | 2 | 2 | read / write | 4 | | 内存映射(mmap + write) | 1 | 2 | mmap / write | 4 | | sendfile | 1 | 2 | sendfile | 2 | | sendfile + DMA gather copy | 0 | 2 | sendfile | 2 | RocketMQ 选择了 mmap + write 这种零拷贝方式,适用于业务级消息这种小块文件的数据持久化和传输; 而 Kafka 采用的是 sendfile 这种零拷贝方式,适用于系统日志消息这种高吞吐量的大块文件的数据持久化和传输。 但是值得注意的一点是,Kafka 的索引文件使用的是 mmap + write 方式,数据文件使用的是 sendfile 方式。 询问AI

优秀的个人博客,低调大师

netty MMO 回合制网络游戏,基于 ioGame 框架,1.0 发布

主要更新 项目搭建 简单登录 模拟登录 项目简介 这是一个基于 ioGame 网络编程框架开发的 MMO 类型的回合制网络游戏项目,这类型的游戏涵盖的点比较多,是 ioGame 的最佳实践。我们会尽可能的在项目中演示框架文档中提及的理论特性。 如果你对网络编程感兴趣,或许这是一个很好的入门机会。 如果你是 web 领域的开发者,但对网络游戏开发感兴趣,或许这是一个很好的入门机会。 该项目教学不会讲解框架源码相关的,更多的是偏应用的,就是教你如何使用。如果你能将项目学完,基本上就具备了独立开发游戏的能力了。 项目产生背景 ioGame 在网络编程方面是先进的、富有想象力的、与时俱进的框架。除了能制作网络游戏外,还能用在物联网等其他领域,总之与网络相关的领域基本上都适用。 项目是基于网络编程框架 ioGame 开发的,也是 ioGame 的最佳实践。ioGame 正式发布至中央仓库已经一周年了,经历了近 50 个版本的高速迭代。期间得到了众多开发者的认可,并且这些数据都是可查的,统计数据来源于语雀后台,这些数据都是真实的、客观存在的、活的。与 git star 数据不同的是,因为成本的原因,某宝某多还没有出现能提供这种服务的商家,所以这样的统计数据也更具真实性。 点击我,到语雀后台查看 ioGame 的数据 ioGame 框架版本更新日志 ioGame 为开发者提供了丰富的文档与示例,对于有过游戏开发经验的小伙伴来说已经足够了,甚至可以用丰富来形容。但这些对于没有游戏开发经验的人来说是远远不够的,即使看完了文档与示例后,不懂得如何灵活的运用在游戏中。这些都是正常的现象,之所以会有这种现象是因为没有项目可练习。 另外一个比较困难的点,就是其他领域的开发者想要进入游戏领域则比较困难,因为大部分的公司都需要具备游戏开发经验,这样就导致了对游戏开发有兴趣的人进不来的困境。 游戏开发与 web 类型的 xxx管理系统不同,游戏研发相对来说更困难,且研发经费也较高(没有谁的钱是大风刮来的),所以很少能看见相关的开源产品;这样就造成了入门困难的局面,想入门的开发者没地方入门;为了打破这个局面和普及 ioGame,这里决定使用 ioGame 来研发 MMO 类型的回合制游戏,让 java 从业者有机会能看到游戏开发的整体过程。 本项目对 web 开发者是友好的,如果你之前做过 web 开发,那么学习本项目是一件轻松且简单的事。 该项目整体内容比较丰富,学习完项目后,基本可以开发出市面上 90% 的游戏了。不夸张的说,当你学习完该系列后,基本上可以超越游戏行业 80% 的从业人员。 如果你想深入学习游戏开发、如果你是其他领域的开发者且对游戏开发有兴趣,请选择我们。我们会用心的制作该系列的文档,并且我们有编写优质文档的能力,这点从 ioGame 提供的文档中就可以看出。 适合人员 对游戏开发感兴趣的。 想从其他领域转入游戏行业,这是一个不错的机会。 如果你想深入学习,这会是一个不错的项目,整体系统丰富,综合了多方面的内容。 故事背景 在一个名为渔民小镇的城镇中,居住着许多喜爱冒险的英雄。这个小镇周围环境优美,是个旅游胜地,吸引了许多游客前来观光和休闲。然而,最近,一股黑暗势力突然出现,威胁着小镇和其居民的安全。 这个黑暗势力由一位邪恶的巫师领导,他使用黑魔法控制了周边的森林和山脉,并派遣手下侵袭小镇。居民们生活在恐惧之中,他们需要拯救者的到来来击败黑暗势力,恢复和平与安宁。 为了解救小镇和居民,我们需要招集这些英雄。这些英雄拥有各自独特的技能和能力,可以擅长物理攻击、魔法攻击、医疗或辅助。他们都住在渔民小镇上,过着平凡的生活,但在危机时刻,他们愿意奋起抵抗黑暗势力。 在这个回合制的 MMO 游戏中,玩家可以选择一个英雄来进行战斗。每个英雄都有自己独特的技能树和装备,玩家可以根据自己的游戏风格和策略选择最适合自己的英雄。有些英雄擅长远程物理攻击,如射手,他们使用弓箭和弩来对抗敌人;有些英雄擅长近战物理攻击,如剑客,他们运用灵活的剑术打击敌人;还有一些英雄擅长魔法攻击,他们可以控制火焰、冰霜、闪电等元素来打击敌人;还有一些英雄擅长医疗和辅助技能,可以为队友提供治疗和增益效果。 除了英雄,玩家还可以携带宠物宝宝一起战斗。这些宝宝拥有各种特色,有些可以提供额外的攻击力,有些可以为队友提供辅助效果,还有些可以变身成强大的怪兽来对抗敌人。玩家需要与自己的宠物宝宝建立深厚的关系,训练它们并发挥它们的潜力。 在游戏中,玩家们可以通过组队过副本、任务和剧情,与其他英雄一起冒险。通过合作与协作,玩家们可以共同击败强大的敌人,解锁新的地图和装备,提升自己的实力。 在副本中,他们将面临各种挑战和敌人,需要通过团队协作和策略才能成功通关。完成任务和剧情将推动故事的发展,揭示出邪恶势力背后更深层的秘密。 玩家不仅可以升级,提升他们的技能和装备,还可以升级和培养宠物宝宝。随着宠物宝宝的成长,它们将获得新的技能和能力,为玩家在战斗中提供更多的支持和战斗力。 渔民小镇的命运掌握在玩家们的手中。让我们招集这些英雄,带领他们一起战胜黑暗势力,保护渔民小镇和其居民,恢复和平与繁荣! 提示:上述故事背景是临时写的,将来游戏发展到一定阶段会重新架构相关内容 大体玩法架构 从上面的故事背景我们知道,游戏有很多英雄,类似 LOL 的那种英雄,每个英雄都有其特色技能。而玩家只要拥有了英雄,在战斗前是可以选择任何英雄、并携带宠物宝宝一起战斗。 玩家们可以组队一起下副本、任务、剧情行。 玩家可以组队、游戏内置多个英雄,玩家可以使用任意英雄战斗。每个英雄擅长有所不同,各玩家在组队时,可以选择搭配不同的组合来达到不同的效果。 与一般回合制游戏不同的是,我们不固定玩家使用某一个英雄,而是可以随意切换英雄。回合制的核心之一是战斗部分,通过不同的搭配和战斗策略,往往可以展现出丰富的战斗亮点。这些搭配可以是各英雄之间的组合、阵型选择、所携带的宠物宝宝、指挥的策略...等。 为了突出一些意外性,我们会在战斗中添加地形、天气等各种因素;某些英雄、或者阵型、或其他...等,则可以根据这些意外因素增减自身的一些属性。 为了保证 PVP(玩家与玩家之间的)战斗之间的公平性,我们会推出一个赛事。无装备加成模式、或者说装备任选的搭配模式。在战斗前玩家可以选择各装备的搭配策略,凭借各玩家的想象力来组装出各种出奇的战术。 通过上面的方式,在比赛中我们做到了公平性。正常情况下,如副本、剧情、任务等,各种加成,如装备、宠物宝宝 ...等各种加成,还是需要依靠平时的积累。 这样使得游戏具有娱乐性、又具备比赛的公平性。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册