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

ideawu 发布于 2013/09/20 22:00
阅读 4K+
收藏 24

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

这是关于 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
0 39m 24m
100000 302m 288m
200000 579m 565m
500000 1441m 1427m
1000000 2734m 2720m

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

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

Related posts:

  1. 构建C1000K的服务器(1) – 基础
  2. 150行C代码的comet服务器
  3. 谈谈Facebook的聊天系统架构
  4. nginx-push-stream-module 笔记
  5. 高性能并发Web服务器实现核心内幕

Tags: C1000K, libevent, 高并发

原文: http://www.ideawu.net/blog/archives/742.html

加载中
0
中明明
中明明

make失败,貌似是提示util/config.h不存在

i
ideawu
不好意思, 应该是你获取代码的时候我正好没提交完. 请重新更新下代码. 如果还有问题, 麻烦把详细 log 贴一下.
0
中明明
中明明

更新了,貌似还这样

cd util; make 

make[1]: Entering directory `/root/icomet/util'

g++ -c  -g -O2 -Wall -Wno-sign-compare -D__STDC_FORMAT_MACROS -I "/root/icomet/deps/libevent-2.0.21-stable" -I "/root/icomet/deps/libevent-2.0.21-stable/include" -I "/root/icomet/deps/libevent-2.0.21-stable/compact" -I "/root/icomet/deps/jemalloc-3.4.0/include" log.cpp
make[1]: *** 没有规则可以创建“config.o”需要的目标“config.h”。 停止。
make[1]: Leaving directory `/root/icomet/util'
make: *** [all] 错误 2


中明明
中明明
回复 @ideawu : 可以了哈哈谢谢
i
ideawu
回复 @中明明 : 你修改下配置文件, 将 auth: token 改为 auth: none
中明明
中明明
回复 @ideawu : 非常感谢,安装完成。但是按照示例订阅貌似返回错误,icomet_cb({type: "401", cname: "12", seq: "0", content: "Token Error"});
i
ideawu
后续如果遇到问题, 欢迎到 github 上提交, 那里的问题回复比较及时. https://github.com/ideawu/icomet
i
ideawu
实在是非常抱歉. 因为 .gitignore 写的有问题, 所以导致 util/config.h 文件没有提交到 git 仓库, 所以编译的时候找不到文件. 现在已经更正了.
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部