C1000k 新思路:用户态 TCP/IP 协议栈
转自: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 协议栈相关推荐
- dpdk-ans 低时延用户态TCP/IP协议栈
新定制了低时延ans,TX 平均时延1024cycle,0.6us,RX平均时延1803 cycle,1.06us. TX计算的时延间隔是:app调用send 开始 到 调用网卡TX结束. RX计算的 ...
- TCP/IP协议栈到底是内核态好还是用户态好?
"TCP/IP协议栈到底是内核态的好还是用户态的好?" 问题的根源在于,干嘛非要这么刻意地去区分什么内核态和用户态. 引子 为了不让本文成为干巴巴的说教,在文章开头,我以一个实例分 ...
- TCP/IP协议栈到底是内核态的好还是用户态的好?
"TCP/IP协议栈到底是内核态的好还是用户态的好?"这根本就是一个错误的问题,问题的根源在于,干嘛非要这么刻意地去区分什么内核态和用户态. 引子 为了不让本文成为干巴巴的说教,在 ...
- linux下IPROTO_TCP,TCP/IP协议栈在Linux内核中的运行时序分析
可选题目三:TCP/IP协议栈在Linux内核中的运行时序分析 在深入理解Linux内核任务调度(中断处理.softirg.tasklet.wq.内核线程等)机制的基础上,分析梳理send和recv过 ...
- TCP/IP协议栈在Linux内核中的运行时序分析【万字长文】
1 Linux概述 1.1 Linux操作系统架构简介 Linux操作系统总体上由Linux内核和GNU系统构成,具体来讲由4个主要部分构成,即Linux内核.Shell.文件系统和应用程序.内核.S ...
- TCP/IP协议栈在Linux内核中的运行时序分析
本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看. 1 Linux概述 1.1 Linux操作系统架构简介 Linux操作系统总体上由Linu ...
- Linux TCP/IP协议栈之Socket的实现分析
数据包的接收 作者:kendo http://www.skynet.org.cn/viewthread.php?tid=14&extra=page%3D1 Kernel:2.6.12 一.从网 ...
- linux 协议栈之socket,Linux TCP/IP 协议栈之 Socket 的实现分析(一)
内核版本:2.6.37 参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是 ...
- TCP/IP协议栈及网络基础,协议栈原理及实现
1. TCP/IP协议栈及网络基础 推荐这个在B站几千观看的视频讲解: 底层原理到徒手实现 TCP/IP网络协议栈:tcp协议栈,如何实现? C/C++ Linux服务器开发高级架构学习视频点击:C/ ...
最新文章
- jquery .parents(), .parent() 和 closest()方法
- mysql_install_db卸载_MySQL数据库的卸载与安装
- mybatis工作总结001_mybatis中_parameter使用和常用sql
- 如何优雅的使用全球最大同性社交网站
- VS中为非控制台程序提供控制台输出窗口
- java div和table_详细为你讲解,DIV+CSS布局和TABLE布局的优缺点(经典)
- Arm云游戏及虚拟化技术沙龙,Arm中国,NVIDIA,腾讯及百度等为你分享超强技术干货
- VirtualBox虚拟机中安装XP系统
- BlackBerry 9850 应用:BBM, Windows Live Messenger (msn)
- 如何在计算机上设置禁止游戏,如何禁止玩电脑游戏 屏蔽网络游戏的方法
- 软硬链接、引号符号、逻辑符号、系统通配符
- FLASH连连看算法分析及源代码
- VMware虚拟机关闭U盘USB自动识别
- python通过Ctypes 模块 调用C++动态链接库,遇到的access violation reading 0x0000000000000000解决方案
- 产品管理和项目管理有什么区别
- php技术创新:利用动态404页面实现全站自动静态化
- 图形图像处理 —— 图像缩放算法
- HCSC 2022cvpr 训练报错
- 平台化转型与轻资产化运营,如涵如何重讲网红故事?
- erLang中的标点符号
热门文章
- c++ 基本数据类型字节数
- ASP.NET在IE10中Form表单身份验证失效问题解决方法
- windows mobile 5.0 PocketPC模拟器上网的设置 【正确】
- github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...
- python绘制3d图-Python绘制3D图形
- 汇编和python-现在是Java和Python的时代,有谁还需要C以及汇编呢?
- 学习python用哪个app-Python和R:学哪个好?
- 编程语言python培训-0基础转行IT,编程语言应该学习Java还是Python呢?
- arcgis下的python编程-面向ArcGIS的Python脚本编程
- python表白源代码-python七夕浪漫表白源码