云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

云解析_阿里的消息队列_免费申请

小七 141 0

为什么我们使用Linux内核的TCP堆栈

最近的一篇博客文章提出了一个问题:为什么我们要使用Linux内核的TCP堆栈?。它引发了一场关于黑客新闻的非常有趣的讨论。我在CloudFlare工作时也考虑过这个问题。我的经验主要来自于在这里使用数千台生产机器,我可以试着从这个角度来回答这个问题。CC BY 2.0图片作者:John Vetterli让我们从一个更广泛的问题开始——运行操作系统有什么意义?如果您计划运行单个应用程序,那么必须使用由数百万行代码组成的内核听起来可能是一种负担。但事实上,我们大多数人决定运行某种操作系统,我们这样做有两个原因。首先,操作系统层增加了硬件独立性和易于使用的api。有了这些,我们可以专注于为任何机器编写代码,而不仅仅是我们目前拥有的专用硬件。其次,操作系统增加了分时层。这允许我们一次运行多个应用程序。无论是第二个HTTP服务器还是bash会话,在多个进程之间共享资源的能力是至关重要的。内核公开的所有资源都可以在多个进程之间共享!用户空间网络对于网络堆栈来说,这没有什么不同。通过使用通用操作系统网络堆栈,我们获得了运行多个网络应用程序的能力。如果我们将网卡硬件专用于单个应用程序以运行用户空间网络堆栈,那么这将丢失。通过从一个进程中获取网卡,您将失去与服务器同时运行(例如SSH会话)的能力。听起来很疯狂,这正是大多数现成的用户空间网络堆栈技术所提出的。通用术语是"完全内核旁路"。其思想是绕过内核,直接从用户空间进程使用网络硬件。CC BY 2.0图像由Audiotecna Música提供在Linux生态系统中,有一些可用的技术。并非所有的都是开源的:PF环斯纳布开关DPDK公司网络地图我在之前的一篇文章中已经写过这些。所有这些技术都需要将完整的网卡移交给单个进程。换句话说:你完全可以编写自己的网络栈,使之辉煌,专注于超级特性,并优化性能。但是这会产生很大的成本-您将被限制为每个网卡最多运行一个进程。虚拟网卡(VFs)有一个小问题,但让我们在这里停止它-它不工作。我在"虚拟化方法"一节中谈到了这一点。但是即使有这些障碍,我也不能忽视内核绕过的好处。许多人确实运行自定义网络堆栈,他们这样做有两个原因之一:延迟性能(更低的CPU成本,更好的吞吐量)对于高频交易(HFT)的人来说,延迟是非常重要的。交易者可以买得起定制硬件和奇特的专有网络栈。如果运行一个封闭源代码的TCP堆栈,我会感到非常不舒服。CloudFlare的内核旁路尽管如此,在CloudFlare,我们确实使用了内核旁路。我们在第二组-我们关心表现。更具体地说,我们遭受IRQ风暴。Linux网络堆栈对每秒可以处理的数据包数量有限制。当达到限制时,所有的CPU都会忙着接收数据包。在这种情况下,要么包被丢弃,要么应用程序的CPU不足。虽然我们在正常操作期间不必处理IRQ风暴,但当我们成为L3(第3层OSI)DDoS攻击的目标时,确实会发生这种情况。这是一种攻击,目标被不属于有效连接的任意数据包淹没-通常是欺骗的数据包。CC BY-SA 2.0图片由Howard Lake提供在一些攻击中,我们每台服务器每秒收到高达3百万个数据包(pps)。一般的规则是,Linux iptables可以在一个像样的服务器上处理大约1Mpps,同时仍有足够的CPU用于应用程序。这个数字可以通过适当的调整来增加。有了如此大规模的攻击,Linux内核对我们来说是不够的。我们必须努力解决它。我们不使用前面提到的"完全内核旁路",而是运行我们所称的"部分内核旁路"。这样,内核就保留了网卡的所有权,并允许我们只对单个"RX队列"执行旁路操作。我们在Solarflare网卡上使用了Solarflare的EFVI API。为了支持intellinics,我们在Netmap中添加了部分内核旁路功能:这在本文中有描述。使用此技术,我们可以将防DDoS iptables卸载到非常快速的用户空间进程中。这使Linux免于处理攻击包,因此避免了IRQ风暴的情况。完整的用户空间TCP栈呢?我的同事经常问我:为什么我们不直接用Solarflare OpenOnload框架运行NGINX,使用一个超快速的用户空间TCP?是的,它会更快,但没有证据表明它会产生很大的实际影响。我们服务器上使用的大部分CPU都用于用户空间NGINX进程,而不是操作系统。CPU主要用于通常的NGINX簿记和Lua应用程序逻辑,而不是网络处理。我估计通过旁路我们可以节省大约5-10%的CPU,这是(目前)不值得的努力。2.0图像抄送Charlie接下来,使用NGINX的内核旁路会干扰我们常用的调试工具。我们的systemtap脚本将变得毫无用处。Linux netstat统计将停止记录关键事件,tcpdump将不再工作。还有一个问题就是我们的DDoS缓解方案。正如我在本次BlackHat演示中所述,我们是iptables的大量用户。定制的TCP栈没有hashlimits和ipsets之类的东西。但不仅仅是防火墙功能。LinuxTCP堆栈对RFC4821和sys.net.ipv4系统.tcp_mtu_探测sysctl。当用户在ICMP黑洞后面时,对它的支持是至关重要的。阅读更多关于PMTU的博文。最后,每个TCP栈都有自己的一组错误和怪癖。我们在Linux TCP堆栈中记录了三个不明显的异常:垃圾收集器在读缓冲区上踢;监听插座过多的问题;套接字可写意味着什么。想象一下在一个封闭源代码或一个年轻的TCP堆栈(或两者都有)中调试类似的问题。结论主要有两个主题:第一,还没有稳定的开源部分内核绕过技术。我们希望Netmap能够占领这个市场,我们正在积极地通过我们的补丁来支持它。其次,Linux-TCP协议栈有许多关键特性和非常好的调试功能。与这一丰富的生态系统竞争需要数年时间。基于这些原因,用户空间网络不太可能成为主流。在实践中,我只能想到一些内核旁路技术的合理应用:软件交换机或路由器。在这里,您需要将网卡移交给应用程序,处理原始数据包并完全跳过内核。专用负载平衡器。类似地,如果机器只进行包洗牌,跳过内核是有意义的。部分旁路用于选定的高吞吐量/低延迟应用程序。这是我们用于DDoS抵御的设置。不幸的是,我不知道有一个稳定的开源TCP协议栈适合这个类别。对于一般用户来说,Linux网络栈是正确的选择。虽然它没有重写TCP栈那么令人兴奋,但是我们应该关注Linux栈的性能并解决它的问题。有一些重要的计划正在进行中,以提高好的旧Linux-TCP堆栈的性能。