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)
相关推荐
此外,源码中可能会包含对网络协议栈的优化,例如使用高效的TCP/IP连接管理策略,如Keep-Alive机制,来减少建立和断开连接的开销。同时,可能还会有针对数据包的压缩和解压缩算法,以减少网络传输的数据量,提高网络...
"c1000k_test"是一个专为此目的设计的工具,其名称暗示了它能够同时处理大约100,000(100k)个并发操作。这个测试对理解系统在高负载下的性能表现、资源管理和调度策略至关重要。 在深入探讨之前,我们需要了解一些...
淘宝C1000K高性能服务器构建技术.ppt 顺应硬件和操作系统的变化方向,高度并发化应用!让独立的CPU核心,独立的cache, 独立的本地内存,独立的(soft)IRQ,独立的网卡,独立的磁盘,独立的Erlang调度器,独立的...
c1000k 这是TCP服务器-客户端套件,可帮助您测试操作系统是否支持c1000k(100万个连接)。用法下载并编译wget --no-check-certificate ...
解决C1000K问题需要更深入的优化,包括但不限于使用高效的网络协议(如HTTP/2或QUIC)、优化TCP/IP堆栈、减少不必要的系统调用,以及利用硬件加速等手段。 在Linux系统中,可以通过内核参数调整、内存管理优化、TCP...
C1000K高性能服务器构建技术.pptx
【标题】:“C1000k: 从HTTPS复制” 涉及的主要知识点是C++编程语言以及网络数据传输中的HTTPS协议。这个标题暗示我们可能会探讨如何使用C++来实现一个程序,该程序能够从HTTPS源下载或复制文件。在C++编程中,这...
根据提供的文档信息,我们可以归纳出一系列关于C1000实验指导手册的关键知识点,主要涉及EPON技术的应用、配置及管理。以下是对该手册主要内容的深入解析: ### 1. EPON技术概述 - **EPON (Ethernet Passive ...
11. 题目:TCP/IP协议栈,如I/O操作的时间复杂度 这可能考察网络协议栈中的I/O操作模型,比如阻塞I/O、非阻塞I/O、I/O复用等。 以上只是部分题目及其对应知识点的解析,完整的真题集涵盖了更广泛的计算机科学概念...
根据给定的文件信息,以下是对“C1000手册2_设备手册”中涉及的关键知识点的详细解析: ### C1000设备简介 OpticalLinkC1000是一款符合IEEE802.3ah标准的电信级通信设备,设计用于提供高速数据和IP综合业务,适用...
标题中的“长虹LED49C1000n(LJ4E,机芯xa6a-ip)集中升级软件MS880-USB-PC703.bin”揭示了这款软件是专为长虹品牌的一款LED电视设计的升级程序。LED49C1000n是电视的具体型号,LJ4E可能是该系列的一个内部标识或...
欧姆龙C1000H PLC操作手册中强调了安全预防措施的重要性,提醒用户在使用欧姆龙C1000H PLC时必须遵守相关的安全规范和操作规定,以避免人身伤害和财产损失。手册中还提供了详细的安全预防措施,包括警示、警告和注意...
hg系列松下激光测距说明书提供了详细的技术规格、安装方法和安全使用指南,为用户提供了一个安全、高效和可靠的激光测距解决方案。 技术规格: * hg-C1000系列执行标准号:Q/320500 SUNX 21 MC-HGC1000C No.0051-...
总的来说,"zaurus_SL_C1000.zip"是一个重要的系统恢复资源,对于SHARP zaurus_SL_C1000用户来说,它提供了对设备原始配置的访问,使得用户可以在系统出问题时快速恢复,或者在尝试个性化定制之前保护原始系统。...
Modbus协议支持多种模式,包括ASCII、RTU、TCP/IP等。本文所述的Modbus协议在STULZ设备中被用于实现C7000 common通讯协议。 Modbus协议的主要组成部分包括: 1. 从站地址(Slave Address):用于标识网络中的从...
ASTM C1000.pdf
假如整机上升级不成功,显示信息为:REF PWM NOT MATCH. 由于占空比不对应,软件升级上做了防呆处理,避免误升级而损坏屏。 请按如下方法升级: 1. 把升级文件名字改为:MS880_USB_210.bin 2. 把MS880_USB_210.bin...
- IGS:基于TCP/IP协议,支持多种主流PLC型号,为iFIX主推的通讯驱动。 2. **基于中间接口软件开发的通讯驱动**: - OMF、OMS:支持更广泛的PLC型号,尤其是欧姆龙新型PLC。 - OMRON Sysmac OPC Server:提供...
- **c1000/c1005**:分别适用于Cisco 1003和1004系列路由器以及1005系列路由器。 - **c10k**:适用于Cisco 10000边界服务路由器(ESR)。 - **c1600/c1700**:适用于Cisco 1600和1700系列路由器。 - **c2500/c25fx/...
长虹LED49C1000N系列主板原理图(MS881.PC701B) 本文档是关于长虹LED49C1000N系列主板的原理图,涵盖了主板的电路设计和组件布局。下面是根据原理图所提取的知识点: 1. 电源管理:主板采用了多个电压电平,包括5...