第六章传输控制
6.1为什么有控制开销? 举例:Web服务器响应一个GET请求的过程: 客户向服务器发送了一个GET请求( GET File1) 。包到达服务器适配器,适配器将包拷贝到内存(DMA),然 后通过中断通知CPU CPU响应中断,进行协议处理,通过 unblock之前的一个系 统调用来通知Web服务器 服务器进程解析GET请求,得到文件名 服务器查找一个目录结构,确定文件在磁盘上的位置 服务器进程启动对文件系统的读操作(一个系统调用) 若文件不在 file cache中,文件子系统启动一个磁盘l/O操作 文件进入应用缓冲区后,服务器通过写相应的套接字(另 个系统调用)发送HTTP响应
举例:Web服务器响应一个GET请求的过程: ◦ 客户向服务器发送了一个GET请求(GET File 1) ◦ 包到达服务器适配器,适配器将包拷贝到内存(DMA),然 后通过中断通知CPU ◦ CPU响应中断,进行协议处理,通过unblock之前的一个系 统调用来通知web服务器 ◦ 服务器进程解析GET请求,得到文件名 ◦ 服务器查找一个目录结构,确定文件在磁盘上的位置 ◦ 服务器进程启动对文件系统的读操作(一个系统调用) ◦ 若文件不在file cache中,文件子系统启动一个磁盘I/O操作 ◦ 文件进入应用缓冲区后,服务器通过写相应的套接字(另一 个系统调用)发送HTTP响应
代码组织与进程切换 网络代码的组织方式: 0每层实现为一个进程:处理一个包产生的进程调度开销(几百 微秒)比一个包的到达时间要大得多 。所有层实现为一个进程:控制开销最小(这种方法最多见) Web服务器的组织方式: 。每个进程服务一个客户:并发度最大,进程切换开销最高 。一个进程服务所有客户:上下文切换开销最小,进程须自己调 度客户以实现最大的并发度(调度开销) 0将客户划分成组,每个进程服务一组客户:并发度和调度/切 换开销适中 代码的组织方式:主要考虑并发度和调度/切换开销的权衡
网络代码的组织方式: ◦ 每层实现为一个进程:处理一个包产生的进程调度开销(几百 微秒)比一个包的到达时间要大得多 ◦ 所有层实现为一个进程:控制开销最小(这种方法最多见) Web服务器的组织方式: ◦ 每个进程服务一个客户:并发度最大,进程切换开销最高 ◦ 一个进程服务所有客户:上下文切换开销最小,进程须自己调 度客户以实现最大的并发度(调度开销) ◦ 将客户划分成组,每个进程服务一组客户:并发度和调度/切 换开销适中 代码的组织方式:主要考虑并发度和调度/切换开销的权衡
Web服务器中的控制开销 Process per group; groups defined by application structure Scheduling overhead vS. loss of currency Web server application System call overhead lwrite0 readY FindActive0↓ Scheduling overhead TCP/IP File system Tracking active files and connections Kernel Interrupt overhead CPU Packet received MEMORY DISK BUS NETWORK ADAPTOR Network FIGURE 6.2 Control overhead involved in handling a get request at a server
本章考虑的控制开销 进程切换:几百微秒 系统调用:几十微秒 中断处理:几微秒 在一个10Gbps的以太网链路上传输最小长度(64 字节)的包,每隔51.2ns会到来一个包。 丶CPU速度的提高并不会显著降低上述控制开销,因 为这些开销与访存有很大关系
进程切换:几百微秒 系统调用:几十微秒 中断处理:几微秒 在一个10Gbps的以太网链路上传输最小长度(64 字节)的包,每隔51.2ns会到来一个包。 CPU速度的提高并不会显著降低上述控制开销,因 为这些开销与访存有很大关系
6.2避免网络代码中的调度开销 UNX将所有协议代码作为内核进程的一部分执行 当一个包到达时, 网络适配器产生一个硬件中断 。中断处理程序将包放入一个内存队列,然后通过软件中 断调度一个内核进程(一次上下文切换) 内核进程执行协议处理,通过检查传输层端口号得到目 的应用,唤醒应用(一次上下文切换) 每个包的处理至少经历两次上下文切换: 中断上下文到内核进程(协议处理) 内核进程到应用进程
UNIX将所有协议代码作为内核进程的一部分执行 当一个包到达时, ◦ 网络适配器产生一个硬件中断 ◦ 中断处理程序将包放入一个内存队列,然后通过软件中 断调度一个内核进程(一次上下文切换) ◦ 内核进程执行协议处理,通过检查传输层端口号得到目 的应用,唤醒应用(一次上下文切换) 每个包的处理至少经历两次上下文切换: ◦ 中断上下文到内核进程(协议处理) ◦ 内核进程到应用进程
在用户空间实现协议 基本思想: 协议处理与应用在同一个进程中,可以通过 upcall 进行通信 用户级实现的好处 可以绕过内核,直接从中断上下文到应用进程,减 次上下文切换 协议代码可以在用户空间编写和调试 问题: 中断例程如何确定将包交给哪个应用进程?
基本思想: ◦ 协议处理与应用在同一个进程中,可以通过upcall 进行通信 用户级实现的好处: ◦ 可以绕过内核,直接从中断上下文到应用进程,减 少一次上下文切换 ◦ 协议代码可以在用户空间编写和调试 问题: ◦ 中断例程如何确定将包交给哪个应用进程?
中断例程如何确定包的应用进程? 方案一:使用一个解复用进程 解复用进程检查所有的包,确定包的目标进程, 将包交给目标进程。 缺点:增加一次进程切换。 Demux- Process 1 Process 2 process KERNEL (driver)
方案一:使用一个解复用进程 ◦ 解复用进程检查所有的包,确定包的目标进程, 将包交给目标进程。 ◦ 缺点:增加一次进程切换
中断例程如何确定包的应用进程? 方案二: 内核定义一个接口(如 Berkeley packet Filter,BPF) 允许应用声明自己要处理的包类型 中断例程根据一组包过滤器进行解复用(提前解复用) ---Process 1 Process 2---, KERNEL Filter for Filter for s Process 1 Process 2 F1 F3 Arriving Packet FIGURE 6.5 The packet filter approach to demultiplexing
方案二: ◦ 内核定义一个接口(如Berkeley Packet Filter,BPF), 允许应用声明自己要处理的包类型 ◦ 中断例程根据一组包过滤器进行解复用(提前解复用)
协议代码实现为一个共享库 用户级协议实现要求每个应用进程应当实 现协议栈 通常将TCP/P代码实现为一个共享库,链 接到应用中,避免在每个应用中复制 TCP/P代码: TCP/P代码必须是可重入的
用户级协议实现要求每个应用进程应当实 现协议栈 通常将TCP/IP代码实现为一个共享库,链 接到应用中,避免在每个应用中复制 TCP/IP代码: ◦ TCP/IP代码必须是可重入的