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

标签: C语言编程 高性能Web架构 C1000K libevent 高并发 | 发表时间:2013-09-18 22:06 | 作者:ideawu
出处:http://www.ideawu.net/blog

这是关于 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 的内存. 由此可推断出, 100 万 Comet 连接需要占用 2.7GB 内存. 此时, 服务器空闲, 进程占用 CPU 为 0%.

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

Related posts:

  1. 构建C1000K的服务器(1) – 基础
  2. 150行C代码的comet服务器
  3. 谈谈Facebook的聊天系统架构
  4. nginx-push-stream-module 笔记
  5. 小心递归次数限制

相关 [c1000k 服务器 百万] 推荐:

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

- - idea's blog
这是关于 C1000K 序列文章的第二篇, 在前一篇文章 构建C1000K的服务器(1) – 基础 中, 介绍了支持 C1000K 的 Linux 系统的内核参数调整和系统设置. 在本篇文章中, 将对一个真正的应用服务器做 C1000K 测试.. Comet 服务器是一类逻辑相对简单, 需要高并发连接的服务器.

构建C1000K的服务器(1) – 基础

- - idea's blog
有名的 C10K 问题提出的时候, 正是 2001 年, 到如今 12 年后的 2013 年, C10K 已经不是问题了, 任何一个普通的程序员, 都能利用手边的语言和库, 轻松地写出 C10K 的服务器. 这既得益于软件的进步, 也得益于硬件性能的提高.. 现在, 该是考虑 C1000K, 也就是百万连接的问题的时候了.

Node版单机100w连接(C1000K)是如何达成的 - 简书

- -
关于C10K的问题就不多说了,应该是一个说烂的话题. 网上也有很多C1000k,甚至C10M(也就是1kw并发)的文章,后面会给出我所阅读和学习的很多参考,这里也不多说了,这里我只给出在我深入研究了这些资料和总结之后的思路. 总的来说,要完成这个目标,首先要考虑的就是系统能分配的资源是否满足100w并发的需求,然后逐步分解,比如内存够不够,文件描述符够不够,然后再往下看应该怎么满足,调整参数等.

百万级运维经验五:服务器内核优化集锦

- - CSDN博客系统运维推荐文章
编辑文件 /etc/security/limits.conf ,添加两行参数:. 这两行参数设置linux系统最大可打开文件数. 编辑文件/etc/sysctl.conf,添加以下参数:. 如果服务器装有Redis,这个参数一定要加,不然Redis有很大的可能无法同步数据到磁盘. 把所有带backlog的参数的值调大,如:.

百万级运维经验四:服务器的选择和部署

- - CSDN博客系统运维推荐文章
对服务器的选择,我曾经盲目过. 流量大了服务器顶不住怎么办,我那时候的想法就是加配置,4核变8核,8核变16核,内存也加,4GB变8GB变16GB,为什么不加服务器呢,麻烦嘛,觉得提高服务器配置的效果也是一样的. 后来我才明白,这种想法是错误的,还是停留在个人电脑的思维. 我发现,增加了服务器配置并不能给我带来相应的性能提升,我对服务器和操作系统没有特别深的了解,我个人觉得原因如下:.

百万级运维经验一:Mongodb和Redis数据不能放在同一个服务器

- - CSDN博客系统运维推荐文章
一开始时,为了省服务器,把Mongodb和Redis放在一个服务器上. 网站每到高峰期都特别卡,还经常出现502. 找了很久的原因,发现硬盘的写数据很大,IOPS也很高,排查了很多原因都没找到. 然后再仔细研究监控,发现写硬盘的操作很有规律,每隔几分钟就有一次频繁的写硬盘,联想到Redis同步数据到硬盘的间隔就是几分钟,所以开始怀疑是Redis引起的.

使用四种框架分别实现1百万websocket常连接的服务器

- - 鸟窝
著名的 C10K 问题提出的时候, 正是 2001 年. 这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的限制,单机1万还是. 但是时光荏苒,随着硬件和软件的飞速发展,单机1万的目标已经变成了最简单不过的事情. 现在用任何一种主流语言都能提供单机.

日活上百万时,腾讯产品如何提前规避服务器宕机风险?

- - IT瘾-geek
原文链接: http://wetest.qq.com/lab/view/310.html. 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 众所周知,优异的应用性能是良好用户体验的坚实基础,而服务器响应缓慢、卡顿、崩溃的产品,即便设计再精美也无法留住用户的心. 2017年2月28日,百度就和用户们开了一个不大不小的玩笑,从当天的20点54分到21点24分左右,百度搜索整整宕机了30分钟,众多网友戏言那30分钟成为了百度最有存在感的30分钟,但是从后来百度的公关文章中,可以看到其提到了“错过了大家上亿次的搜索请求”,从这个体量来看,这无论如何都是一次很大的影响了.

kernel.org服务器遭入侵

- Lamo - Solidot
kernel.org网站首页发布公告,声称多台服务器在本月初(8月12日前)遭黑客攻击,他们在8月28日发现了入侵. 入侵者利用一位用户凭证获得了服务器根访问权限,他们正在调查黑客是如何提升权限的;系统启动脚本被加入了一个木马启动文件;ssh相关文件被修改. kernel.org声称,他们相信Linux kernel源代码库未受影响,因为git分布式版本控制系统的特性决定了它可以很容易注意到代码变化.

Ubuntu下赌ARM服务器

- Tim - Solidot
今日无数手机平板使用的低能耗处理器能否撑起未来的服务器市场. Canonical计划推出支持ARM架构的Ubuntu服务器版本. Ubuntu Linux并不是x86服务器市场的重量级选手,Red Hat才是. 但通过与ARM合作打造ARM服务器,Canonical正努力赢得更多市场份额. 计划于2011年10月发布的Ubuntu Server 11.10,将同步推出支持x86、x86-64和ARM架构的版本.