什么是零拷贝

如题所述

第1个回答  2022-06-23
零拷贝描述的是客户端与服务器之间数据传输过程中,需要拷贝的问题

**客户端**

普通拷贝:用户发起指令给内核,内核拷贝磁盘的文件到内核缓冲区,然后由内核缓冲区拷贝到用户缓冲区,然后再由用户缓冲区拷贝到内核缓冲区,内核缓冲区通过网络发送到服务器,经过三次拷贝

零拷贝:直接通过内核空间不经过用户空间进行发送(实现方式:1、api,2、内核空间的内存地址和用户空间的内存地址映射到同一块)(使用场景: Java NIO、Netty,kafaka,rocketMq)

**服务端**

常见的IO 多路复用方式有【select、poll、epoll】

就是很多个网络I/O复用一个或少量的线程来处理这些连接

select/poll模型是通过轮询遍历(fd_set集合)所有内核缓冲器内的文件描述符(fd),发现就绪的文件描述符(fd),则处理fd数据;select 在单个进程中能打开的 fd 是有限制的,默认是1024

【 什么是 fd:在 linux 中,内核把所有的外部设备都当成是一个文件来操作,对一个文件的读 写会调用内核提供的系统命令,返回一个 fd( 文件描述符)。而对于一个 socket 的读写也会有 相应的文件描述符,成为 socketfd 】

epoll 是基于事件驱动方式来代替顺序扫描,是监听就绪的fd,轮询就绪的fd的方式

【由于 epoll 能够通过事件告知应用进程哪个 fd 是可读的,所以我们也称这种 IO 为异步非 阻塞 IO ,当然它是伪异步的,因为它还需要去把数据从内核同步复制到用户空间中,真正的    异步非阻塞,应该是数据已经完全准备好了,我只需要从用户空间读就行(AIO)】

epoll的两种触发机制(水平触发(默认)和边缘触发)

边缘触发把如何处理数据的控制权完全交给了开发者,比如,读取一个http的请求,开发者可以决定只读取http中的headers数据就停下来,开发者有机会更精细的定制这里的控制逻辑

nio中所有的通信都是面向缓冲区的,操作数据之前先要开辟一个Buffer的缓冲区指定缓冲区大小ByteBuffer.allocate(1024)

一台机器理论能支持的连接数

首先,在确定最大连接数之前,大家先跟我来先了解一下系统如何标识一个tcp 连接。系统用一个四元组来唯一标识一个TCP 连接: (source_ip, source_port, destination_ip,destination_port)。即(源IP,源端口,目的 IP,目的端口)四个元素的组合。只要四个元素的组合中有一个元素不一样,那就可以区别不同的连接,

比如:

你的IP 地址是 11.1.2.3, 在 8080 端口监听

那么当一个来自 22.4.5.6 ,端口为 5555 的连接到达后,那么建立的这条连接的四元组为 :

(11.1.2.3, 8080,

22.4.5.6, 5555)

这时,假设上面的那个客户(22.4.5.6)发来第二条连接请求,端口为 6666,那么,新连接 的四元组为(11.1.2.3, 8080,

22.4.5.6, 5555)

那么,你主机的 8080 端口建立了两条连接;

通常来说,服务端是固定一个监听端口,比如 8080,等待客户端的连接请求。在不考虑地址重用的情况下,及时 server 端有多个ip,但是本地监听的端口是独立的。所以对于tcp 连接的4 元组中,如果destination_ip 和destination_port 不变。那么只有source_ip 和source_port 是可变的,因此最大的 tcp 连接数应该为 客户端的ip 数 乘以 客户端的端口数。在 IPV4 中, 不考虑 ip 分类等因素,最大的 ip 数为 2 的 32 次方 ;客户端最大的端口数为 2 的 16 次方, 也就是 65536.   也就是服务端单机最大的tcp 连接数约为 2 的48 次方。

当然,这只是一个理论值,以linux 服务器为例,实际的连接数还取决于

1、内存大小(因为每个 TCP 连接都要占用一定的内存)、

2、文件句柄限制,每一个 tcp 连接都需要占一个文件描述符,一旦这个文件描述符使用完了,新来的连接会返回一个“Can’t open so many files”的异常。如果大家知道对于操作系统最大可以打开的文件数限制,就知道怎么去调整这个限制

a)可以执行【ulimit -n】得到当前一个进程最大能打开1024 个文件,所以你要采用此默认配置最多也就可以并发上千个 TCP 连接。

b) 可以通过【vim /etc/security/limits.conf】去修改系统最大文件打开数的限制

softnofile 2048

hard nofile 2048

表示修改所有用户限制、soft/hard 表示软限制还是硬限制,2048 表示修改以后的值

c) 可以通过【cat /proc/sys/fs/file-max】查看linux 系统级最大打开文件数限制,表示当前这个服务器最多能同时打开多少个文件

当然,这块还有其他很多的优化的点,这里不是这节课的目标

3.  带宽资源的限制
相似回答