Linux系统网络性能实例分析( 二 )


Linux 中对 SendFile API 的支持以及在 Linux TCP/IP 栈和网络驱动程序中对Zerocopy的支持实现了在 TCP/IP 数据处理过程中的单次复制机制 。 SendFile对于应用程序是不透明的 , 因为应用程序需要实现这个 API以便利用该特性 。 2、 TCP分段卸载
对于网络报文的每次 TCP/IP传输或接收过程 , 当数据被传输到 NIC或者从 NIC接收时会发生多次 PCI总线访问操作 。 通过使用 NIC和 Linux TCP/IP栈中的 TCP分段卸载(TCPSegmentation Offloading ,TSO)特性 , 对于以太网而言 , 发送端的 PCI总线访问次数减至对于每个 64KB大小缓冲区访问一次而不是对每个网络报文(1518B)都访问一次 。如果应用程序提供的缓冲区长度大于帧长度 ,则 TCP/IP栈将其划分成多个帧 , 为 每个帧都添加一个 TCP/IP头部 , 并将其通过DMA映射到 NIC 。如果使能了 TSO特性 ,则为 64KB数据封装一个伪报文头 ,并通过 DMA将其发送至 NIC 。网络适配器的控制器将这个 64KB数据块解析成标准的以太网报文 , 从而减少了主机的 CPU利用率和对 PCI总线的访问 。TSO通过降低 CPU利用率和提高网络吞吐率来改善效率 。 针对该任务专门设计了网络芯片(network silicon) 。 在 Linux以及针对 TSO而设计的Gigabit Ethernet芯片中激活 TSO特性能够增强系统性能 。
Linux系统网络性能实例分析文章插图
Linux系统网络性能实例分析文章插图
3、 网络负荷中的进程与IRQ亲合性亲合性或绑定的含义是指强制只在选定的一个或多个 CPU上执行进程中断的过程 。 在多处理器系统中 , 基于操作系统调度器使用的策略 , 在特定条件下可以将一个处理器上的进程迁移到其他处理器 。 通过将进程保持在同一个处理器——这强制调度器将某个特定任务调度到指定 CPU上——可以极大提高所需数据存在于 cache中的概率 , 从而可以减少内存延迟 。 有些情况下 , 即使进程被限定在同一个 CPU上调度 ,诸如大型工作集以及多进程共享同一个 CPU等因素也常常导致清空 cache , 因此进程亲合性可能无法在所有情况下都起作用 。 本章给出的实例分析非常适于利用进程亲合特性 。Linux内核实现了下列两个系统调用 , 以便执行进程与处理器的绑定操作:
asmlinkage int sys_sched_set_affinity(pid_t pid, unsigned int mask_len,unsigned long *new_mask_ptr);asmlinkage int sys_sched_get_affinity(pid_t pid, unsigned int*user_mask_len_ptr, unsigned long *user_mask_ptr); sched_set_affinity()系统调用还确保在恰当的一个或多个 CPU 上运行目标进程 。 sched_get_affinity(pid,&mask_len,NULL)可用于查询内核所支持的 CPU位屏蔽码长度 。进程亲合性意味着将进程或线程绑定到某个 CPU上 。 IRQ亲合性意味着强制在某个特定 CPU上执行具体 IRQ的中断处理 。 在 Linux中可以使用/proc接口设置 IRQ亲合性 。 通过确定 I/O接口所用的 IRQ , 然后修改该特定 IRQ的屏蔽码 , 可以设置 IRQ亲合性 。 例如 , 以下命令将 IRQ 63设置到 CPU 0 , 并将 IRQ 63所生成的中断发送到 CPU 1上
echo "1" > /proc/irq/63/smp_affinity 进程亲合性与IRQ亲合性是改进应用程序和系统的吞吐率及扩展性的通用性能优化实践 。 这些方法都要求识别出一个应用程序的所有进程并对其加以隔离 , 还需要识别出中断以便将其映射至应用程序的进程和运行这些进程的处理器 。 因此 , 这种“ n对 n”的映射关系在复杂环境下并不总可行 。Netperf3示例分析清晰表明 , IRQ与进程亲合性的应用改善了Linux网络的 SMP扩展性和网络吞吐率性能 。 在该例子中 , 使用了 Netperf3的多适配器支持能力来测量网络扩展性 。 它对每个 NIC都创建一个进程 ,该进程绑定到 4个 CPU中的某个 CPU以及某个 NIC上 。 该 NIC将由该进程使用并与之绑定到同一个CPU 。 一个 Netperf3进程的处理操作是被隔离的 , 并且对某个 NIC所生成的中断的执行操作被隔离到单个处理器上 。 在 Netperf3服务器上使用 TCP_STREAM测试来完成这个过程 。在服务器上 , 该工作负荷进行繁重的数据接收处理操作 , 会产生多次数据拷贝操作(将数据从 NIC复制到内核内存中 , 再从内核内存中复制到应用内存中) 。 绑定机制提高了性能 , 因为这些复制操作在单个处理器上完成 , 从而无需将数据加载到两个不同的处理器 cache中 。 如果同时应用这两个亲合性的话 , 那么绑定机制可以减少内存延迟 。 尽管可以单独使用IRQ亲合性或进程亲合性 , 但组合使用时能够进一步提高性能 。


推荐阅读