IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

构建C1000K的服务器(2) – 实现百万连接的comet服务器

idea's blog 2014-12-04 13:18:23 累计浏览 3,566 次
本机暂存

这是关于 C1000K 序列文章的第二篇, 在前一篇文章 构建C1000K的服务器(1) - 基础 中, 介绍了支持 C1000K 的 Linux 系统的内核参数调整和系统设置. 在本篇文章中, 将对一个真正的应用服务器做 C1000K 测试.

Comet 服务器是一类逻辑相对简单, 需要高并发连接的服务器. Comet 在网站系统中的应用非常广泛, 可以见这篇日志的介绍: http://www.ideawu.net/blog/archives/737.html.

HTTP 协议处理

要开发一个支持百万并发连接的 Comet 服务器, 我选择 C/C++ 语言, 当然还有其它的选择如 Erlang, Java 等. 对于一个只支持 long-polling Comet 服务器, 首先要具备解析 HTTP 协议的能力, 我选择 libevent 来处理 HTTP 协议.

通道和订阅者管理

服务器在启动的时候, 就预先分配了 100 万个通道对象的空间, 但订阅者对象是按需分配的, 通过内存池方式. 100 万个通道对象和程序的其它数据占用了 24MB 的内存.

Benchmark

启动 icomet 服务器:

./icomet

服务器监听了 100 个端口, 是为了测试方便, 原因见前一篇文章的分析: 构建C1000K的服务器(1) - 基础.

然后启动 benchmark 客户端:

./tools/benchmark 127.0.0.1 8100

benchmark 程序每创建十万个连接, 就会暂停, 按回车后继续. 通过 top/ps 查看 icomet 进程的内存占用. 最终, 得出如下数据.

连接数进程VIRT进程RES
039m24m
100000302m288m
200000579m565m
5000001441m1427m
10000002734m2720m

可以看到, 每一个 Comet 连接大约占用了 2.7KB 的内存. 此时, 服务器空闲, 进程占用 CPU 为 0%.

项目的代码在: https://github.com/ideawu/icomet, 欢迎大家试用, 并反馈你的测试数据.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 大型高并发高负载网站的系统架构分析 (累计阅读 9,006)
  2. 各消息队列软件产品大比拼 (累计阅读 6,207)
  3. 读腾讯大讲堂 (累计阅读 6,148)
  4. 实现一个简单的服务端推方案 (累计阅读 6,078)
  5. 如果用户在5分钟内重复上线,就给他发警告,问如何设计? (累计阅读 6,029)
  6. 关于Linux的文件系统cache (累计阅读 5,917)
  7. 正确用DD测试磁盘读写速度 (累计阅读 5,097)
  8. 神奇的两次按位非运算符 (累计阅读 3,930)
  9. 估算Apache所需要的内存 (累计阅读 3,768)
  10. 一个小小的C 写的web server (累计阅读 3,760)