如何c实现http服务器单服务器300万个长连接的

PHP中如何实现与服务器的长连接呢? - PHP进阶讨论
本回答由提问者推荐
(16条回答)
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;四种框架分别实现百万websocket常连接的服务器_教育指南_百度教育攻略
著名的C10K问题提出的时候, 正是 2001 年。这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的限制,单机1万还是一个非常值得挑战的目标。但是时光荏苒,随着硬件和软件的飞速发展,单机1万的目标已经变成了最简单不过的事情。现在用任何一种主流语言都能提供单机1万的并发处理的能力。所以现在目标早已提高了100倍,变成C1000k,也就是一台服务器为100万连接提供服务。在2010年,2011年已经看到一些实现C1000K的文章了,所以在2015年,实现C1000K应该不是一件困难的事情。本文是我在实践过程中的记录,我的目标是使用spran-websocket,netty, undertow和node.js四种框架分别实现C1000K的服务器,看看这几个框架实现的难以程度,性能如何。开发语言为Scala和Javascript。精彩内容,尽在百度攻略:当然,谈起性能,我们还必须谈到每秒每个连接有多少个请求,也就是RPS数,还要考虑每条消息的大小。 一般来说,我们会选取一个百分比,比如每秒20%的连接会收发消息。我的需求是服务器只是&code&push&/code&,客户端不会主动发送消息。 一般每一分钟会为这一百万群发一条消息。所以实现的测试工具每个client建立60000个websocket连接,一共二十个client。实际不可能使用20台机器,我使用了两台AWS C3.2xlarge(8核16G)服务器作为客户端机。每台机器10个客户端。 服务器每1分钟群发一条消息。消息内容很简单,只是服务器的当天时间。最近看到360用Go实现的消息推送系统,下面是他们的数据:精彩内容,尽在百度攻略:四个服务器的代码和Client测试工具代码可以在github上下载。(其实不止四种框架了,现在包括Netty, Undertow, Jetty, Spray-websocket, Vert.x, Grizzly 和 Node.js 七种框架的实现)测试下来可以看到每种服务器都能轻松达到同时120万的websocket活动连接,只是资源占用和事务处理时间有差别。120万只是保守数据,在这么多连接情况下服务器依然很轻松,下一步我会进行C2000K的测试。在测试之前我们需要对服务器/客户机的一些参数进行调优。精彩内容,尽在百度攻略:服务器的参数调优一般会修改两个文件,&code&/etc/sysctl.conf&/code&和&code&/etc/security/limits.conf&/code&, 用来配置TCP/IP参数和最大文件描述符。TCP/IP参数配置精彩内容,尽在百度攻略:修改文件&code&/etc/sysctl.conf&/code&,配置网络参数。数值根据需求进行调整。更多的参数可以看以前整理的一篇文章:Linux TCP/IP 协议栈调优。 执行&code&/sbin/sysctl -p&/code&即时生效。最大文件描述符精彩内容,尽在百度攻略:Linux内核本身有文件描述符最大值的限制,你可以根据需要更改:系统最大打开文件描述符数:/proc/sys/fs/file-max临时性设置:&code&echo 1000000 & /proc/sys/fs/file-max&/code&永久设置:修改&code&/etc/sysctl.conf&/code&文件,增加&code&fs.file-max = 1000000&/code&进程最大打开文件描述符数 使用&code&ulimit -n&/code&查看当前设置。使用&code&ulimit -n 1000000&/code&进行临时性设置。 要想永久生效,你可以修改&code&/etc/security/limits.conf&/code&文件,增加下面的行:还有一点要注意的就是hard limit不能大于&code&/proc/sys/fs/nr_open&/code&,因此有时你也需要修改nr_open的值。 执行&code&echo 2000000 & /proc/sys/fs/nr_open&/code&精彩内容,尽在百度攻略:查看当前系统使用的打开文件描述符数,可以使用下面的命令:其中第一个数表示当前系统已分配使用的打开文件描述符数,第二个数为分配后已释放的(目前已不再使用),第三个数等于file-max。总结一下:精彩内容,尽在百度攻略:所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max单个进程打开的文件描述符数不能超过user limit中nofile的soft limitnofile的soft limit不能超过其hard limitnofile的hard limit不能超过/proc/sys/fs/nr_open应用运行时调优Java 应用内存调优 服务器使用12G内存,吞吐率优先的垃圾回收器:精彩内容,尽在百度攻略:2. V8引擎OutOfMemory Killer如果服务器本身内存不大,比如8G,在不到100万连接的情况下,你的服务器进程有可能出现”Killed”的问题。 运行&code&dmesg&/code&可以看到精彩内容,尽在百度攻略:这是Linux的OOM Killer主动杀死的。 开启oom-killer的话,在/proc/pid下对每个进程都会多出3个与oom打分调节相关的文件。临时对某个进程可以忽略oom-killer可以使用下面的方式:&code&echo -17 & /proc/$(pidof java)/oom_adj&/code&解决办法有多种,可以参看文章最后的参考文章,最好是换一个内存更大的机器。客户端的参数调优在一台系统上,连接到一个远程服务时的本地端口是有限的。根据TCP/IP协议,由于端口是16位整数,也就只能是0到 65535,而0到1023是预留端口,所以能分配的端口只是,也就是64511个。也就是说,一台机器一个IP只能创建六万多个长连接。 要想达到更多的客户端连接,可以用更多的机器或者网卡,也可以使用虚拟IP来实现,比如下面的命令增加了19个IP地址,其中一个给服务器用,其它18个给client,这样 可以产生18 * 60000 = 1080000个连接。精彩内容,尽在百度攻略:修改&code&/etc/sysctl.conf&/code&文件:执行&code&/sbin/sysctl -p&/code&即时生效。服务器测试精彩内容,尽在百度攻略:实际测试中我使用一台AWS C3.4xlarge (16 cores, 32G memory)作为应用服务器,两台AWS C3.2xlarge (8 cores, 16G memory)服务器作为客户端。 这两台机器作为测试客户端绰绰有余,每台客户端机器创建了十个内网虚拟IP, 每个IP创建60000个websocket连接。客户端配置如下:&code&/etc/sysctl.conf&/code&配置&code&/etc/security/limits.conf&/code&配置精彩内容,尽在百度攻略:服务端配置如下:&code&/etc/sysctl.conf&/code&配置&code&/etc/security/limits.conf&/code&配置Netty服务器精彩内容,尽在百度攻略:建立120万个连接,不发送消息,轻轻松松达到。内存还剩14G未用。每分钟给所有的120万个websocket发送一条消息,消息内容为当前的服务器的时间。这里发送显示是单线程发送,服务器发送完120万个总用时15秒左右。发送时CPU使用率并不高,网络带宽占用基本在10M左右。精彩内容,尽在百度攻略:客户端(一共20个,这里选取其中一个查看它的指标)。每个客户端保持6万个连接。每个消息从服务器发送到客户端接收到总用时平均633毫秒,而且标准差很小,每个连接用时差不多。平均每个client的RPS = 1000, 总的RPS大约为 20000 requests /seconds. latency平均值为633 ms,最长735 ms,最短627ms。Spray服务器精彩内容,尽在百度攻略:建立120万个连接,不发送消息,轻轻松松达到。它的内存相对较高,内存还剩7G。每分钟给所有的120万个websocket发送一条消息,消息内容为当前的服务器的时间。 CPU使用较高,发送很快,带宽可以达到46M。群发完一次大约需要8秒左右。客户端(一共20个,这里选取其中一个查看它的指标)。每个客户端保持6万个连接。每个消息从服务器发送到客户端接收到总用时平均1412毫秒,而且标准差较大,每个连接用时差别较大。精彩内容,尽在百度攻略:Undertow建立120万个连接,不发送消息,轻轻松松达到。内存占用较少,还剩余11G内存。每分钟给所有的120万个websocket发送一条消息,消息内容为当前的服务器的时间。 群发玩一次大约需要15秒。客户端(一共20个,这里选取其中一个查看它的指标)。每个客户端保持6万个连接。每个消息从服务器发送到客户端接收到总用时平均672毫秒,而且标准差较小,每个连接用时差别不大。精彩内容,尽在百度攻略:node.jsnode.js不是我要考虑的框架,列在这里只是作为参考。性能也不错。参考文档精彩内容,尽在百度攻略:HTTP长连接200万尝试及调优Linux最大打开文件描述符数100万并发连接服务器笔记之1M并发连接目标达成知乎:如何实现单服务器300万个长连接的?构建C1000K的服务器千万级并发实现的秘密C1000k 新思路:用户态 TCP/IP 协议栈/xiaojiaqi/C1000kPracticeGuide600k concurrent websocket connections on AWS using Node.jshttps://plumbr.eu/blog/memory-leaks/out-of-memory-kill-process-or-sacrifice-child/java//out-of-memory-kill-process-or-sacrifice-child.html/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-captun.html/linux-network-tuning-for-2013.html#.VV0s6kawqgQhttp://warmjade.blogspot.jp/_archive.htmlhttp://mp./s?__biz=MjM5NzAwNDI4Mg==&mid=&idx=1&sn=9ffef32b3ab93d1e239c9dc753a3a9bb}

我要回帖

更多关于 netty 实现http服务器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信