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

原创 2014年05月20日 14:13:43

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

现在的服务器支撑上百万个并发 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 左右是内核协议栈的开销)。客户端是一台 8GB 内存的 i5-2500,内存消耗也是 5GB 多,因此这次实验只试到了 C500k。客户机绑定了 10 个 IP,每个 IP 上发出 5 万 TCP 连接,运行 pingpong 协议,每个连接轮流收发 64 字节的消息。测得 QPS 大约是 11k,服务器的 CPU 占用率约为 60%(单线程)。profile 显示 CPU 的主要开销在内核中,我对这个结果基本满意。

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

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

eclipse

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

bsd44

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

我在《关于 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服务器

一.修改最大打开文件数 1.修改系统总共最大打开文件数 在 /etc/sysctl.conf 文件末尾添加: fs.file-max = 1020000 或者 永久修改,*表示所有用户,可以改成某个用...

C1000K,构建百万并发级服务器

著名的 C10K 问题提出的时候, 正是 2001 年, 到如今 12 年后的 2013 年, C10K 已经不是问题了, 任何一个普通的程序员, 都能利用手边的语言和库, 轻松地写出 C10K 的服...

用户态TCP协议栈的调研

一、各种用户态socket的对比 1、MTCP 简单介绍: 韩国高校的一个科研项目,在DPDK的2016年的技术开发者大会上有讲,所以intel将这个也放到了官方上,所以一般搜索DPDK的用户态的协...

关于用户态协议栈的思考

一直以来我一直以为操作系统内核是高大上的东西,但是实际上用户态的应用才是!上周的一次技术交流中,一家网络加速卡厂商声称他们的协议栈是用户态的协议栈,用来提高性能,我对其产品直接就泄了气,然而会后,我查...
  • dog250
  • dog250
  • 2014年03月16日 02:09
  • 7263

10分钟理解TCP/IP各个协议以及协议之间的关系

理解TCP/IP各个协议以及协议之间的关系

STL中各种容器的删除操作

在应用中,我们通常不可避免地要对容器中的某些特定元素进行删除操作。这看起来并不是什么困难的问题。我们先写一个循环来迭代容器中的元素,如果迭代元素是要删除的元素,则删除之。代码如下所示:       ...
  • lalor
  • lalor
  • 2012年06月07日 17:49
  • 5664

用muduo实现memcached协议的例子

用muduo实现memcached协议的例子最近花了两天时间用 muduo 部分实现了 memcached 服务器协议,代码位于 examples/memcached/server,能通过 memca...
  • Solstice
  • Solstice
  • 2013年08月18日 13:00
  • 26038

用户态 TCP/IP 协议栈

转自:http://blog.csdn.net/solstice/article/details/26363901 C1000k 新思路:用户态 TCP/IP 协议栈 现在的服务器支撑...

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

原文链接:http://www.sdnlab.com/17530.html 【感谢】 我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些...

Linux从用户层到内核层系列 - TCP/IP协议栈部分系列9: 基础知识之 - 操作系统中常用存储介质详解

操作系统中常用存储介质详解 说明:本文介绍了包括ROM、RAM和FLASH的各种变体 ROM和RAM指的都是半导体存储器,ROM是ReadOnly Memory的缩写,RAM是Random Acces...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C1000k 新思路:用户态 TCP/IP 协议栈
举报原因:
原因补充:

(最多只允许输入30个字)