这是关于 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, 欢迎大家试用, 并反馈你的测试数据.
[root@localhost icomet]# ps aux | grep comet
root 11196 95.4 0.0 40728 17904 ? Rs 17:23 1:51 ./comet-server comet.conf -d
我的配置如下:
pidfile = ./comet.pid
logger:
level: debug
#output: stdout
output: ./logs/log.txt
rotate:
size: 100000000000
admin:
#listen: 127.0.0.1:8000
listen: 0.0.0.0:8101
# allowed ip prefix, one ip each line
allow: 127.0.0.1
allow: 192.168
#deny: all
#allow: all
max_channels: 100000
front:
listen: 0.0.0.0:8100
# none|token
auth: none
max_channels: 100000
max_subscribers_per_channel: 16
# number of messages buffered
channel_buffer_size: 0
# in seconds
channel_timeout: 30
# in seconds
polling_timeout: 30
启动一会,用户就连不进来了,如果发送信息,会有漏消息的情况。 Reply
请问博主是设置的问题么,如何解决? Reply
不知道都有哪些方法和参数; Reply
cd util; make
make[1]: Entering directory `/root/icomet-master/util’
make[1]: Nothing to be done for `all’.
make[1]: Leaving directory `/root/icomet-master/util’
cd comet; make
make[1]: Entering directory `/root/icomet-master/comet’
g++ -o ../comet-server -g -O2 -Wall -Wno-sign-compare -D__STDC_FORMAT_MACROS -I "/root/icomet-master/deps/libevent-2.0.21-stable" -I "/root/icomet-master/deps/libevent-2.0.21-stable/include" -I "/root/icomet-master/deps/libevent-2.0.21-stable/compact" -I "/root/icomet-master/deps/jemalloc-3.4.0/include" -I ../ \
comet-server.cpp channel.o server.o \
../util/*.o \
/root/icomet-master/deps/libevent-2.0.21-stable/.libs/libevent.a \
-lrt -pthread "/root/icomet-master/deps/jemalloc-3.4.0/lib/libjemalloc.a"
comet-server.cpp: In function ¡®int main(int, char**)¡¯:
comet-server.cpp:138: 警告:当转换到 ‘int'(从‘double’)时
make[1]: Leaving directory `/root/icomet-master/comet’ Reply
在一个频道里消息很多,有没有方法可以 一次性把这些消息全部清除? Reply
jQuery19108672550765331835_1387285654444({type: "ok"});
sub.php过一会才有返回:
icomet_cb_0({type: "noop", cname: "public", seq: "0"});
icomet_cb_0({type: "noop", cname: "public", seq: "1"});
…
就是消息在其它聊天窗口没有出现; Reply
http://comet.k8008.test:8100/sub?cb=icomet_cb_0&cname=public&seq=2&noop=0&token=67f1a8207b70496b2fde96d0499ae2f8&_=1387285654448&callback=cb Reply
server: ubuntu12.04 4GB RAM
/etc/sysctl.conf:
# For connector server
net.ipv4.tcp_rmem = 128 4096 102400
net.ipv4.tcp_wmem = 1024 4096 102400
## The unit is memory page(4KB), so this means: 512M 1G 3G, for the case of 4GB RAM server
net.ipv4.tcp_mem = 131072 262144 786432
## For fast connect
### Default: 1000
net.core.netdev_max_backlog = 1024
### Default: 128
net.core.somaxconn = 1024
### Default: 2048
net.ipv4.tcp_max_syn_backlog = 2048
## For fast half-open connection detection
### Default: 75
net.ipv4.tcp_keepalive_intvl = 30
### Default: 9
net.ipv4.tcp_keepalive_probes = 3
fs.file-max = 999999
# for connector server’s test client
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65535
=========================================================
client: ubuntu 12.04 2GB RAM
===========================================================
result:
before/after 100k connection
free -m 170M/1132M
icomet(RSS) 13M/190M
=============================================================
Any idea why the OS consume so much memory? Which type of OS are you using?
Thanks. Reply
result:
before/after 100k connection
free -m 170M/460M Reply
可以说下你用的操作系统和tcp配置参数吗? Reply