茱莉亚•埃文斯

为什么我们使用Linux内核的TCP协议栈??

我今天在波兰的波利康夫,我看了莱昂德罗·佩雷拉的这篇非常有趣的谈话卢旺,8000行代码的web服务器。他谈到了一些他们做的优化(提高CPU缓存性能!锁的时候要特别小心!)。你可以在网站和链接上阅读更多关于性能的信息。

这是一个超级酷的项目,因为它开始作为一个爱好的项目,现在,他说,它正在进入一种状态,在那里,它确实起作用,人们用它来做真实的事情。这个web服务器非常快——它能做的,在一些基准中,每秒200万个请求。

在我开始谈论这个,当然几乎没有人需要每秒200万个请求。我当然不会。但考虑高性能计算是一个非常棒的方式更好的了解电脑的限制!!

我追踪他以便以后问他问题,他提到,大部分时间都花在与Linux内核对话以及来回复制东西上。

编写自己的tcp堆栈方式更快

然后他说了一些非常令人惊讶的话:在盛世达HTTP框架,他们编写自己的TCP堆栈,这让一切都快几倍倍。什么?!!

所以,这让我很好奇。当我们进行高性能联网时——我们为什么要费心使用Linux内核的TCP堆栈,如果是这么贵?为什么不在用户空间中完成所有的联网呢?我不知道从哪里开始,这个问题,所以我在Twitter上问.正如经常发生的那样,你们都通过了10亿个有趣的链接和答案。

嵌入式设备

如果你正在一台没有操作系统的小型计算机上工作,不管怎样,你有时还是需要建立人际关系!在这种情况下,它似乎很常见,使用一个单独的TCP协议栈。很多人都提到他们用过低分子量蛋白或写自己的TCP协议栈来满足他们自己特定的要求。

我问了几个人是否有人在Real Server上使用lwIP,但它似乎对小型设备进行了优化,而不是做大量的网络流量大的服务器上。

高频交易

谁会在乎做快速大量的网络请求?做高频交易的人!路加福音格利在Twitter上(工作非常酷Snabb开关开源以太网堆栈)说:

Solarflare向HFT市场(OpenOnload)出售一个用户空间TCP堆栈,供其NIC使用。代码实际上是GPL。

所以,这很有道理。如果你想做超级高性能网络,你大概可以买得起特殊的网卡和特殊的软件使这些网卡表现超好。酷。但是如果您想要在商品硬件上进行更高性能的联网,有随机网卡吗?这是一件事吗??

谷歌是什么??

还有谁在做一大堆网络工作?谷歌!幸运的是,Google有时会写论文,这样我们就能稍微了解一下他们在那里做什么。

很多人告诉我磁悬浮列车,这是谷歌的负载均衡器,而且他们在用户空间中完成所有的网络连接!我认为它们的操作级别比TCP低,因此它们没有TCP堆栈,但是它是不使用Linux内核而快速联网的一个例子。

我还没有看过磁悬浮列车的报纸,但它似乎是一个很好的起点。

还有这篇博客关于谷歌的软件定义网络。一个有用的关键字在这里似乎是”木星”或“木星织物但我不确定那是什么。不过还有一篇文章.

是真正的理由编写自己的TCP协议栈的性能??

@格雷法夫提出了一个非常有趣的观点——我认为您创建自己的TCP堆栈的原因是使它更快。但也许不总是!!!

Google不能强迫Android厂商重新设置内核,但是需要新的TCP功能,比如TCP快速打开。

TCP标准是不断发展的,如果必须始终使用内核的TCP堆栈,这意味着你永远不能发展。

为什么在内核中TCP慢??

这个文章从LWN“范·雅各布森的网络渠道”说明在内核空间中处理TCP意味着锁和争用。感谢@tef_ebooks对于本文链接和解释给我听:)

更好的网络可伸缩性的关键,范说,就是尽可能地消除锁定和共享数据,并确保在应用程序运行的CPU上完成尽可能多的处理工作。它是什么,他说,简单地说就是端到端原则再次生效。这个原则,也就是说网络中的所有智能都属于连接的末端,不要停在内核。应该继续,将尽可能多的工作推出核心内核,并推向实际的应用程序。

海星是如何工作的呢??

快速网络框架海星之前是用从英特尔所谓的写的DPDK.与朝鲜的交易似乎是一个网卡驱动程序和一些图书馆,但是它不是通过中断(异步)提供数据包,相反,它轮询网卡并说你有包裹吗?现在?现在?现在?“.

这对我来说很有意义,因为一般来说,如果您总是要处理新事件,betway菲律宾然后轮询更快(因为基本上不需要等待)。以下是关于调查模式驱动程序以及[DPDK]应用程序的示例。

我认为DPDK您可以编写网络应用程序的工作完全在用户空间,没有系统调用。科里苯菲尔向我解释了一大堆这样的事情。

开源软件:非常具体

据我所知,没有任何可用的通用开源用户空间TCP/IP栈可用。有一些专门的,但是现在这似乎并不存在。但是人们似乎对这个话题感兴趣!!

这里有一些更多的链接,做网络在用户空间!这主要是转储以便我可以点击链接之后,也许你会喜欢他们。

zmap是一个TCP端口扫描器。

masscan是另一个TCP端口扫描器。它说可以在5分钟内扫描整个互联网。什么?古怪的!我需要读更多关于这方面的书!!

LKL是为了使Linux内核网络代码(以及其他Linux代码)到一个库(!!以便我们能够在用户空间中使用它。这听起来是一个巨大的努力,也非常有趣。@thehakime说关于这个:。这里有一个关于LKL的讨论。

有很多uspace网络栈(mtcp,lwip,海星,(沙尘暴)但是都是如此的专业。我认为它可以通用。

libuinet是FreeBSD的库版本的TCP协议栈。我想这里有一个主题。

MTCP协议是一个用户空间TCP堆栈。我不知道任何关于它。还有上浆低分子量蛋白.

呸。

可以,从评论中得出许多新的事实和想法HTTP服务器的大量开销是与内核进行通信的.

我喜欢如果你问正确的问题推特就把超级有趣的信息在你直到你喜欢好的好的好的我的大脑充满。然后他们总是告诉你一些很棒的事情:)

似乎有很多工作在这里!现在大概有100个有趣的兔子洞,我没有时间去调查!令人惊叹的。

这对我来说是不寻常的,但是,黑客新闻评论在这篇文章中大多是相当丰富,几个人谈论他们的经历,积极的和消极的,实现网络栈。我喜欢读他们。

使用ltrace调试内存泄漏 PolyConf 2016