ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

为什么高手都在聊 Netty 零拷贝?这才是高性能网络编程的核心!

为什么高手都在聊 Netty 零拷贝?这才是高性能网络编程的核心! 我是小米,一个喜欢折腾 Java 的程序员,前几天面试一个同学,我问了一个看起来特别简单的问题:“你用过 Netty 吗?”他说:“用过。”我继续问:“那你说说,Netty 为什么性能这么高?”他想了想:“因为 Netty 是异步非阻塞的。”我点点头,这个答案没错,但只能算是入场券。于是我又问:“那 Netty 的零拷贝是什么?”这位同学明显愣了一下:“零拷贝……是不是完全不复制数据?”这个答案,就有点危险了,因为“零拷贝”这三个字特别容易让人产生误解,难道真的可以做到一字节都不复制?当然不是,Netty 的零拷贝,核心不是“完全没有数据复制”,而是尽可能减少不必要的数据复制和内存操作,让数据更高效地在不同组件之间流动。今天我们就来把这个问题彻底讲明白。先讲一个搬砖的故事假设小米开了一家快递公司,每天仓库里有大量货物需要从 A 仓库送到 D 仓库,最笨的方法是什么?货物到了 A 仓库。搬到 B 仓库。再从 B 搬到 C 仓库。最后从 C 搬到 D 仓库。如果每天只有10件货,没什么感觉,但如果每天有1000万件货呢?真正消耗时间的可能不是“运输”,而是搬!计算机里的数据也是一样,假设客户端发送一段数据:如果每经过一个环节,就复制一次数据,那么 CPU、内存带宽都会被大量消耗,所以高性能网络框架都会想办法:少搬一次,就少浪费一次,这就是零拷贝思想的核心。传统 IO 到底拷贝了多少次?我们先看一个比较典型的场景:服务器读取磁盘文件,然后通过网络发送给客户端。例如:传统方式大致会经历这样的过程:数据可能经历多次复制,我们简单画一下:真正的问题来了:我们把文件从磁盘读取到用户空间,到底是为了什么?如果业务没有修改文件内容,而只是把文件原封不动发送给客户端,那么文件为什么一定要先绕到用户空间?这就像快递员说:“我必须先把货物搬到我家,然后再送给客户。”,是不是有点多余?
返回列表