论文部分内容阅读
在多核处理器、多队列网卡环境下,操作系统网络协议栈和多进程程序的可扩展性与性能优化成为研究的热点。当前,使用多进程模式编写的网络程序存在以下三个主要问题:1)多进程使用加锁的共享数据结构造成的低可扩展性:2)操作系统网络协议栈与多进程之间缺少密切配合而导致的系统Cache低效和网络协议栈的低可扩展性:3)会话保持困难。由于以上问题,多进程网络程序不能发挥多核多队列网卡平台应有的优势,在会话保持不能正确进行的情况下,程序只能在单进程模式下运行。本文从非阻塞编程、操作系统负载均衡、网络协议栈和网卡驱动等方面出发,展开对以上问题的研究,主要工作和创新点如下:针对进程间共享数据结构的加锁带来低可扩展性的问题,本文提出了MWrite无障碍编程模型和无锁数组哈希表。MWrite编程框架模型简洁,可扩展性好,适用于高读写比的场景,使用MWrite实现的无障碍双链表的性能,比基于MCAS实现的无锁双链表的性能高72.65%,MWrite解决了为多进程程序编写高可扩展性的非阻塞数据结构困难的问题。无锁数组哈希表在多进程并发访问的情况下,扩展性接近100%,其访问速度比红黑树和读写锁保护传统哈希表均快10倍,虽然在数据规模较大时(>=1W),可能会因冲突导致数据不能存入其中,但是理论和实验表明产生冲突的概率极低;无锁数组哈希表易于实现、实用性高,从理论上解决了多进程网页缓存的加锁问题。针对进程数大大超出核数的网络程序,本文提出了Linux操作系统负载均衡优化方法。Linux使用调度域负载均衡算法,它优先分配新进程到最空闲的处理器核中的最空闲的CPU上;核上第一个空闲CPU能够周期性地从该核最繁忙的CPU上迁移任务到自身。然而在某些情况下,该策略会导致系统更加不平衡。在本文的优化算法中,新创建的进程被安排到整个系统的最空闲的CPU上运行,核内最空闲的CPU可迁移核内的任务。实验表明,该方法在最好的情况下可使系统性能提升8%。针对操作系统网络协议栈与进程间缺少配合和会话保持困难这两个问题,本文提出了多进程服务器模型优化方法和多进程代理服务器模型优化方法,提高了系统的Cache效率、提升了网络协议栈的可扩展性,并使得各进程可独完成会话保持。这两种优化方法使得同一连接(或代理服务器中的两个相关连接)的网络硬中断、软中断、收包和发包都处在同一个网卡队列中,并使用同一个处理器、同一个进程来处理,并且同一源IP的数据包交由同一个进程处理。在三项不同的测试中,该优化方法使系统性能分别提升了25%、53%和46%。最后,本文应用以上的优化思想,提出了基于用户态包处理的高效高可扩展性网络负载均衡框架UVS。该框架使用零拷贝技术,在用户态收发数据包,并实现了TCP/UDP反向代理。该框架使用基于数组的无锁队列在进程间传递数据包,使用多进程服务器模型优化方法提高系统Cache效率和可扩展性。实验表明其性能优于LVS。