C1000k 新思路:用户态 TCP/IP 协议栈

C1000k 新思路:用户态 TCP/IP 协议栈

如今的server支撑上百万个并发 TCP 连接已经不是新闻(余锋2010年的演讲ideawu 的 iComet 开源项目WhatsApp 做到了 2.5M)。实现 C1000k 的常规做法是调整内核參数,提高文件数,降低每一个连接的内存消耗(參考 ideawu 的博客)。

在今年的 BSDCan2014 会议上, Patrick Kelsey 介绍了把 FreeBSD 9.x 的 TCP/IP 协议栈移植到了用户态(slidesgithub.com/pkelsey/libuinet),并用于 WANProxy 项目。在用户态执行 TCP/IP 协议栈意味着并发 TCP 连接不再占用系统文件数,仅仅占内存,攻克了 C1000k 的一大瓶颈,内核仅仅要提供一个收发网络 packet 的接口即可(比如netmap)。

内核的网络协议栈强调通用性,主要是为吞吐量优化(性能指标一般是 MB/s 或 packets per second),顺带兼顾大量并发连接。为了支持 C1000k,要调整内核參数让每一个连接少占资源,这与内核代码的设计初衷是违背的。

用户态协议栈捅破了这层窗户纸,能够依据应用的特点来剪裁协议栈功能。优化也更直接,不再是调黑盒參数组合,而是直接上 profiling,依据结果修改应用程序和协议栈的代码。

用户态协议栈的吞吐量比不上内核,只是对 C1000k 的应用场合(比如 comet)应该不成问题。

muduo 的 C1000k 实验

我用 muduo 做了一次 C1000k 的实验,用的是传统方案,没实用 libuinet。在一台 16GB 内存的 Dell WS490 旧工作站上创建了 50万个 TCP 连接,提供 echo 服务。系统可用内存降低了 5286MiB,即每一个连接 10.8KiB(当中服务进程占用了 1421MiB 内存,即每一个连接 2.9KiB,其余 8KiB 左右是内核协议栈的开销)。client是一台 8GB 内存的 i5-2500,内存消耗也是 5GB 多,因此这次实验仅仅试到了 C500k。客户机绑定了 10 个 IP,每一个 IP 上发出 5 万 TCP 连接,执行 pingpong 协议,每一个连接轮流收发 64 字节的消息。測得 QPS 大约是 11k,server的 CPU 占用率约为 60%(单线程)。profile 显示 CPU 的主要开销在内核中,我对这个结果基本惬意。

复活 4.4BSD-Lite2 的网络协议栈

受 libuinet 启示,我把 4.4BSD-Lite2 的网络协议栈也移植到了 Linux 用户态(github.com/chenshuo/4.4BSD-Lite2),方便《TCP/IP 具体解释 第2卷》的读者跟踪调试其代码。下面是 Eclipse CDT 单步跟踪的截图。

也能够用各种现成的工具来分析函数的调用关系:

我在《谈一谈网络编程学习经验》中说这本书的“代码仅仅能看,不能上机执行,也不能修改试验”如今不再成立了。

我在《关于 TCP 并发连接的几个思考题与试验》中用 TAP/TUN 作为自己写的协议栈的对外接口,对 4.4BSD-Lite2 也可如法炮制,让 20 年前的 TCP/IP 协议栈与如今的机器通信。除了与本机通信,还能够通过 NAT 转发,让 4.4BSD-Lite2 连上如今的 Internet。(sudo iptables -t nat -A PREROUTING -p tcp --dport 2009 -i eth0 -j DNAT --to192.168.0.2:2009

C1000k 新思路:用户态 TCP/IP 协议栈,布布扣,bubuko.com

时间: 2024-10-13 01:38:23

C1000k 新思路:用户态 TCP/IP 协议栈的相关文章

[转帖]C1000k 新思路:用户态 TCP/IP 协议栈

C1000k 新思路:用户态 TCP/IP 协议栈 https://blog.csdn.net/Solstice/article/details/26363901 C1000k 新思路:用户态 TCP/IP 协议栈现在的服务器支撑上百万个并发 TCP 连接已经不是新闻(余锋2010年的演讲,ideawu 的 iComet 开源项目,WhatsApp 做到了 2.5M).实现 C1000k 的常规做法是调整内核参数,提高文件数,降低每个连接的内存消耗(参考 ideawu 的博客). 在今年的 BS

Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处理过程,结合Linux内核参数说明和TCP/IP协议栈相关的理论,介绍一些常见的丢包故障定位方法和解决思路. 问题现象 本次故障的反馈现象是:从办公网访问公网服务器不稳定,服务器某些端口访问经常超时,但Ping测试显示客户端与服务器的链路始终是稳定低延迟的. 通过在服务器端抓包,发现还有几个特点:

OSI模型和TCP/IP协议栈

OSI(Open System Interconnect )开放系统互连参考模型是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架.这里所说的开放系统,实质上指的是遵循OSI参考模型和相关协议能够实现互连的具有各种应用目的的计算机系统.它从低到高分别是:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.而TCP/IP协议栈和OSI模型有着对应关系,那么先看一下OSI参考模型.OSI参考模型如下图所

TCP/IP协议栈

TCP/IP协议栈全称是传输控制协议/因特网互联协议,其实是OSI模型的进化版,所以就先解释一下什么是OSI模型,OSI的全称是开放系统互连参考模型,就是为了实现开放系统互连所建立的通信功能分层模型,其目的就是为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考.这里的开放系统指的是遵循OSI模型和相关协议能够实现互连的具有各种应用目的的计算机系统.OSI模型一共有七层,TCP模型一共只有四层,分别为应用层,传输层,Internet层,网络访问层.它定义了

windows下重新安装TCP/IP协议栈

一.windows重装TCP/IP协议     前两天在windows下安装开发环境的时候,把系统的TCP/IP协议栈给搞跪了,导致系统无法ping localhost.无法在程序中创建socket等....于是对windows 7(64bit)下的TCP/IP协议栈进行了重装.尝试了很多方法,发现一个可以使用的: (1)删除注册表键值     开始——运行——regedit,找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Wins

【转】TCP/IP协议栈及OSI参考模型详解

OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设备间的兼容性和标准接口: 促进标准化工作: 结构上可以分隔: 易于实现和维护. 20世纪60年代以来,计算机网络得到了飞速增长.各大厂商为了在数据通信网络领域占据主导地    位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA,Novell IPX/SPX协议,Apple公司的AppleT

几种开源的TCP/IP协议栈分析

1:BSD TCP/IP协议栈,BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的.这是因为 BSD栈在BSD许可协议下提供了这些专业栈的雏形,BSD许用证允许BSD栈以修改或未修改的形式结合这些专业栈的代码而无须向创建者付版税.同时, BSD也是许多TCP/IP协议中的创新(如广域网中饿拥塞控制和避免)的开始点.ftp://ftp.FreeBSD.org/pub/FreeBSD-stable/src/sys.netinet 2:uC

TCP/IP协议栈及OSI参考模型详解

OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设备间的兼容性和标准接口: 促进标准化工作: 结构上可以分隔: 易于实现和维护. 20世纪60年代以来,计算机网络得到了飞速增长.各大厂商为了在数据通信网络领域占据主导地    位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA,Novell IPX/SPX协议,Apple公司的AppleT

linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘

学习Linux,就算是像小编我这样的小萌新,也知道OSI模型.什么?!你不知道!!! 好吧,这篇秘籍拿走,不谢~~~ 一.两个协议 (1)OSI 协议模型(7层)国际协议    PDU:协议数据单元对等层次之间传递的数据单位 OSI协议(7层) 国际协议 PDU 单位 功能 实例 7   应用层 application message 为应用程序进程(例:mail.终端防伪)提供网络服务:提供用户访问界面 提供用户身份验证 HTTP Telnet 6   表示层 presention messa