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,构建百万并发级服务器

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

构建C1000k服务器

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

C1000k测试服务器支持的tcp连接数

首先需要检查一下服务器进程可以打开的文件数目: ulimit -n 如果数目过小则在测试中会报文件数目不够的错误,此处可以先临时修改一下: ulimit -n 200000 此...
  • u010472499
  • u010472499
  • 2016-12-16 18:18:57
  • 1209

淘宝C1000K高性能服务器构建技术.ppt

  • 2011年10月17日 23:07
  • 2.51MB
  • 下载

构建C1000K的服务器

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

C10K、C100K, C1000K=C1M,C10M( concurrent 10M connections)....千万级并发实现的秘密:内核不是解决方案,而是问题所在!

参考资料:     The C10K problem:  http://www.kegel.com/c10k.html     C1M http://www.blogjava.net/yongboy/...
  • ajian005
  • ajian005
  • 2016-05-18 16:28:22
  • 2582

用户态TCP协议栈的调研

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

用户态 TCP/IP 协议栈

转自:http://blog.csdn.net/solstice/article/details/26363901 C1000k 新思路:用户态 TCP/IP 协议栈 现在的服务器支撑...
  • hanyingzhong
  • hanyingzhong
  • 2016-11-01 16:45:02
  • 1358

关于用户态协议栈的思考

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

Linux协议栈-netfilter(5)-iptables

iptables是用户态的配置工具,用于实现网络层的防火墙,用户可以通过iptables命令设置一系列的过滤规则,来截获特定的数据包并进行过滤或其他处理。 iptables命令通过与内核中的netfi...
  • jasonchen_gbd
  • jasonchen_gbd
  • 2015-04-04 22:36:15
  • 2438
收藏助手
不良信息举报
您举报文章:C1000k 新思路:用户态 TCP/IP 协议栈
举报原因:
原因补充:

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