转自:http://blog.csdn.net/solstice/article/details/26363901

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

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

在今年的 BSDCan2014 会议上, Patrick Kelsey 介绍了把 FreeBSD 9.x 的 TCP/IP 协议栈移植到了用户态(slides, github.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 单步跟踪的截图。

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

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

我在《关于 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 协议栈相关推荐

  1. dpdk-ans 低时延用户态TCP/IP协议栈

    新定制了低时延ans,TX 平均时延1024cycle,0.6us,RX平均时延1803 cycle,1.06us. TX计算的时延间隔是:app调用send 开始 到 调用网卡TX结束. RX计算的 ...

  2. TCP/IP协议栈到底是内核态好还是用户态好?

    "TCP/IP协议栈到底是内核态的好还是用户态的好?" 问题的根源在于,干嘛非要这么刻意地去区分什么内核态和用户态. 引子 为了不让本文成为干巴巴的说教,在文章开头,我以一个实例分 ...

  3. TCP/IP协议栈到底是内核态的好还是用户态的好?

    "TCP/IP协议栈到底是内核态的好还是用户态的好?"这根本就是一个错误的问题,问题的根源在于,干嘛非要这么刻意地去区分什么内核态和用户态. 引子 为了不让本文成为干巴巴的说教,在 ...

  4. linux下IPROTO_TCP,TCP/IP协议栈在Linux内核中的运行时序分析

    可选题目三:TCP/IP协议栈在Linux内核中的运行时序分析 在深入理解Linux内核任务调度(中断处理.softirg.tasklet.wq.内核线程等)机制的基础上,分析梳理send和recv过 ...

  5. TCP/IP协议栈在Linux内核中的运行时序分析【万字长文】

    1 Linux概述 1.1 Linux操作系统架构简介 Linux操作系统总体上由Linux内核和GNU系统构成,具体来讲由4个主要部分构成,即Linux内核.Shell.文件系统和应用程序.内核.S ...

  6. TCP/IP协议栈在Linux内核中的运行时序分析

    本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看. 1 Linux概述 1.1 Linux操作系统架构简介 Linux操作系统总体上由Linu ...

  7. Linux TCP/IP协议栈之Socket的实现分析

    数据包的接收 作者:kendo http://www.skynet.org.cn/viewthread.php?tid=14&extra=page%3D1 Kernel:2.6.12 一.从网 ...

  8. linux 协议栈之socket,Linux TCP/IP 协议栈之 Socket 的实现分析(一)

    内核版本:2.6.37 参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是 ...

  9. TCP/IP协议栈及网络基础,协议栈原理及实现

    1. TCP/IP协议栈及网络基础 推荐这个在B站几千观看的视频讲解: 底层原理到徒手实现 TCP/IP网络协议栈:tcp协议栈,如何实现? C/C++ Linux服务器开发高级架构学习视频点击:C/ ...

最新文章

  1. jquery .parents(), .parent() 和 closest()方法
  2. mysql_install_db卸载_MySQL数据库的卸载与安装
  3. mybatis工作总结001_mybatis中_parameter使用和常用sql
  4. 如何优雅的使用全球最大同性社交网站
  5. VS中为非控制台程序提供控制台输出窗口
  6. java div和table_详细为你讲解,DIV+CSS布局和TABLE布局的优缺点(经典)
  7. Arm云游戏及虚拟化技术沙龙,Arm中国,NVIDIA,腾讯及百度等为你分享超强技术干货
  8. VirtualBox虚拟机中安装XP系统
  9. BlackBerry 9850 应用:BBM, Windows Live Messenger (msn)
  10. 如何在计算机上设置禁止游戏,如何禁止玩电脑游戏 屏蔽网络游戏的方法
  11. 软硬链接、引号符号、逻辑符号、系统通配符
  12. FLASH连连看算法分析及源代码
  13. VMware虚拟机关闭U盘USB自动识别
  14. python通过Ctypes 模块 调用C++动态链接库,遇到的access violation reading 0x0000000000000000解决方案
  15. 产品管理和项目管理有什么区别
  16. php技术创新:利用动态404页面实现全站自动静态化
  17. 图形图像处理 —— 图像缩放算法
  18. HCSC 2022cvpr 训练报错
  19. 平台化转型与轻资产化运营,如涵如何重讲网红故事?
  20. erLang中的标点符号

热门文章

  1. c++ 基本数据类型字节数
  2. ASP.NET在IE10中Form表单身份验证失效问题解决方法
  3. windows mobile 5.0 PocketPC模拟器上网的设置 【正确】
  4. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...
  5. python绘制3d图-Python绘制3D图形
  6. 汇编和python-现在是Java和Python的时代,有谁还需要C以及汇编呢?
  7. 学习python用哪个app-Python和R:学哪个好?
  8. 编程语言python培训-0基础转行IT,编程语言应该学习Java还是Python呢?
  9. arcgis下的python编程-面向ArcGIS的Python脚本编程
  10. python表白源代码-python七夕浪漫表白源码