V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Feiox
V2EX  ›  Node.js

开发长连接推送服务,如何模拟 100w 客户端频繁交互?

  •  
  •   Feiox · 2015-08-24 09:47:54 +08:00 · 11865 次点击
    这是一个创建于 3381 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最好能单机, Node Go Python 都可以,需要完成一定的业务逻辑。有现成的工具可以使用吗?

    内容为 1k 左右的内容。平均每秒约有 1/20 的客户端发送消息,峰值要能实现 1/2 的用户同时发送。

    第 1 条附言  ·  2015-08-24 18:11:43 +08:00
    抱歉,心思一乱多打了“单机”二字。应该是 测试客户端集群 <-> 服务端集群
    35 条回复    2015-08-26 14:31:42 +08:00
    jiumingmao
        1
    jiumingmao  
       2015-08-24 10:00:39 +08:00
    单 ip 只能对同一服务器 ip 发起 65535 个连接,要单机的话,这个机器需要有 20 个 ip
    cyshi
        2
    cyshi  
       2015-08-24 10:04:27 +08:00
    @jiumingmao 确定是 65535 么
    jiumingmao
        3
    jiumingmao  
       2015-08-24 10:14:24 +08:00
    @cyshi 这是只是 16 位端口的理论值,并且发起连接使用的是高端口,要修改系统配置才能使用低端口。多找几台机器方便,比如现在很多 vps 是按小时计费的,搞一批测一小时
    yuxizhou
        4
    yuxizhou  
       2015-08-24 10:32:07 +08:00
    100w 每秒 1/2 的活跃,你这 server 都很难单机吧
    rogerchen
        5
    rogerchen  
       2015-08-24 10:40:43 +08:00
    单机 500K 问题有成熟解决方案的只有 Google 这种体量的公司了,基本思路都不是 epoll 这些了,肯定要涉及到用户态协议栈的魔改,楼主洗洗睡吧。
    rogerchen
        6
    rogerchen  
       2015-08-24 10:44:21 +08:00
    楼主居然还是说的是单机 500K 长连接,请收下我的膝盖。
    ilskenyf
        7
    ilskenyf  
       2015-08-24 11:28:28 +08:00
    jmeter
    aszxqw
        8
    aszxqw  
       2015-08-24 11:38:16 +08:00
    个人觉得,开发一个模拟 100w 客户端的工作,比开发一个接受 100w 连接的服务器还麻烦得多。。。
    xufang
        9
    xufang  
       2015-08-24 11:41:50 +08:00
    只有 erlang 了, golang 目前还搞不定。
    odirus
        10
    odirus  
       2015-08-24 13:35:15 +08:00
    你是为了省钱么?最后反而还没集群便宜,做的时候就做成集群,省事儿。
    invite
        11
    invite  
       2015-08-24 13:50:35 +08:00
    楼主找到了分享一下。
    loqixh
        12
    loqixh  
       2015-08-24 14:12:23 +08:00
    @jiumingmao 端口可以共享的,远远不止 65K
    alexapollo
        13
    alexapollo  
       2015-08-24 14:15:30 +08:00
    @rogerchen 说实话这并不难,国内大公司都做得到。。
    jiumingmao
        14
    jiumingmao  
       2015-08-24 15:20:07 +08:00
    @loqixh local_ip:loacl_port:remote_ip:remote_port:[tcp,udp] . 5 元组中 4 个都相同,只剩下 loacl_port 可以变,就只能到 65K 了
    free6om
        15
    free6om  
       2015-08-24 16:34:12 +08:00
    可以试试 tsung ,私有协议的话就自己写一个 tsung 插件,端口的问题可以用 linux 的虚拟网络接口, 100w 连接 32G 内存差不多了。
    mengzhuo
        16
    mengzhuo  
       2015-08-24 17:10:39 +08:00 via iPhone
    500w 长链接 单机…嗯

    4k * 500 w = 19GB tcp buffer
    16 核 * 3G *2/ 500w = 20KHZ 每个客户端
    1G 网卡 /500w = 200B/s 每个客户端
    确定你的机子有这个能力么…
    caoyue
        17
    caoyue  
       2015-08-24 17:45:26 +08:00
    Tsung 可以试试
    硬件够的话,加上虚拟网卡虚拟 IP 之类的方法应该可以实现
    shangjiyu
        18
    shangjiyu  
       2015-08-24 17:57:29 +08:00 via iPhone
    首先 定义一个 socket 的元组是 IP 加端口,虚拟 IP 可以实现模拟并发客户端的
    对于 c10k 可以 io 多路复用,多线程啊等现有技术实现
    500K 应该也可以吧,以现在硬件性能
    现在都在研究 c10M 问题了,脱离操作系统独立于内核的数据包快速处理(貌似 DPDK , pf-ring ?, snap-switch ),自己实现 tcp 栈
    jiumingmao
        19
    jiumingmao  
       2015-08-24 18:00:13 +08:00
    @free6om 虚拟网络接口,这要求客户端和服务端在同一台机器上。这样对服务端的测试不准确吧。
    zonghua
        20
    zonghua  
       2015-08-24 18:37:29 +08:00 via iPhone
    这怎么可能,不是小数目啊,你的单机是天河二号?
    ovear
        21
    ovear  
       2015-08-24 18:40:56 +08:00
    现在的项目都是几百万几千万起步了么。。膜拜。。
    crystom
        22
    crystom  
       2015-08-24 18:51:08 +08:00
    楼上重点全放在单机上了。。
    zado
        23
    zado  
       2015-08-24 19:29:56 +08:00
    @mengzhuo 服务端的话,长连接并不等于并发,我用 32 位下编写的程序( 2GB 的用户内存空间)也可以支持到 100 万连接。不收发数据的话是几乎不需要花 CPU 时间的,如果不是瞬间建立大量连接的话,网卡流量也不是很大的。
    Los
        24
    Los  
       2015-08-24 20:25:29 +08:00
    参考一下 erlang 的这篇文章
    《 100 万并发连接服务器笔记之 1M 并发连接目标达成》
    http://www.blogjava.net/yongboy/archive/2013/04/28/398558.html
    mengzhuo
        25
    mengzhuo  
       2015-08-24 20:46:51 +08:00   ❤️ 1
    @zado

    服务端不收发数据,拿来干嘛……
    zado
        26
    zado  
       2015-08-24 22:25:05 +08:00
    @mengzhuo 是啊,我也不知道......
    realpg
        27
    realpg  
       2015-08-25 02:21:27 +08:00
    百万没比划过,单机搞过四十万并发持续 TCP 连接的单端口单机鉴权解码程序,传输量比较小没啥问题。
    CPU IO NETIO 都不高 就是疯狂的吃内存 linux 内核都重新编译在 TCP 调度器做一些修改才能抗住这么高持续连接

    至于上面几层人说的端口号问题,又不是服务器发起那么多远程连接, 65535 限制跟这个风马牛不相及……
    服务器端只需要一个服务端口开出去……是客户端连过来的……
    powergx
        28
    powergx  
       2015-08-25 02:28:00 +08:00 via iPhone
    @realpg 客户端是单机
    JonyOang
        29
    JonyOang  
       2015-08-25 07:20:08 +08:00
    歪个楼,为什么这个帖子打开页面背景是黑色的
    zonghua
        30
    zonghua  
       2015-08-25 08:58:27 +08:00 via iPhone
    @JonyOang V2EX 不同节点有不同主题的,这里是 node
    JonyOang
        31
    JonyOang  
       2015-08-25 09:26:20 +08:00
    @zonghua 涨知识了 哈
    llbgurs
        32
    llbgurs  
       2015-08-25 12:09:48 +08:00
    用 erlang 吧,省事,多找几台测试客户端的机器,跑一下就可以了
    azhao
        33
    azhao  
       2015-08-25 13:33:00 +08:00
    单机器模拟 100w 连接是不可能的,去阿里云或 aws 开虚拟机来做吧
    jiangzhuo
        34
    jiangzhuo  
       2015-08-25 13:45:48 +08:00
    单机别想了用 loadRunner 做集群方便 跟单机没太大区别
    free6om
        35
    free6om  
       2015-08-26 14:31:42 +08:00
    @jiumingmao 不需要同一台机器
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5682 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:04 · PVG 14:04 · LAX 22:04 · JFK 01:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.