V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
holinhot
V2EX  ›  Go 编程语言

golang 一秒能完成多少次 http 探测

  •  
  •   holinhot · 2020-01-03 11:31:32 +08:00 · 6630 次点击
    这是一个创建于 1779 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 python 写了个,一秒几百而一。
    最近有个任务,要一秒探测上万网址的 http 状态。这里只获取状态码,暂时没检测内容。

    如果用 golang 一秒能完成多少次 http 探测?如果设置 10 秒超时。这样是不是最大的问题在于阻塞?如果很多 url 都超时了,这样就有 n 个 10 秒被阻塞。有没有什么好办法能高效探测成千上网 url.
    如果排除超时阻塞一秒能完成多少次探测?

    cpu 打算配置个双 E5,宽带 1gbps.
    37 条回复    2020-01-05 17:52:19 +08:00
    shoaly
        1
    shoaly  
       2020-01-03 11:57:12 +08:00
    golang 协程做这个玩意 好像正好合适, 没毛病
    状态即可
    holinhot
        2
    holinhot  
    OP
       2020-01-03 12:08:55 +08:00
    @shoaly 我看阿里云监控探测是用 go 写的
    watsy0007
        3
    watsy0007  
       2020-01-03 12:32:05 +08:00
    python 异步吗?
    hitsmaxft
        4
    hitsmaxft  
       2020-01-03 13:30:45 +08:00
    取决于你能开多少个 tcp 链接。
    用纯异步执行模式
    go routine,利用 channel,按 cpu 核数开几个队列异步消费,只检查 headline 不访问 body。
    剩下的,就取决于你的网卡和 cpu 瓶颈了。
    想高并发,首先一点是去阻塞
    hitsmaxft
        5
    hitsmaxft  
       2020-01-03 13:32:47 +08:00
    身边有 go 的简单代理服务,8core 的生产机器, 单机 1 万 qps,只检查头部应该更高。
    encro
        6
    encro  
       2020-01-03 14:00:15 +08:00
    holinhot
        7
    holinhot  
    OP
       2020-01-03 16:21:58 +08:00
    @encro python 真能在这个场景中发挥长处吗? 好像 python 多线程是伪的吧。。压榨 cpu python 好像不行。
    holinhot
        8
    holinhot  
    OP
       2020-01-03 16:24:55 +08:00
    @hitsmaxft tcp 连接网络几万肯定没问题。这是要开 1 万个协程吗
    so1n
        9
    so1n  
       2020-01-03 16:28:45 +08:00 via Android
    @holinhot 多线程不是伪的……
    monkeyWie
        10
    monkeyWie  
       2020-01-03 16:32:28 +08:00
    考虑到客户端每个 tcp 连接要占用一个端口,所以单机同时最大应该在几 W 左右,当然前提是带宽够用,go 启几万个协程还是没什么压力的
    monkeyWie
        11
    monkeyWie  
       2020-01-03 16:36:56 +08:00
    不过单机下用 docker 多跑几个容器,可以突破端口使用量的限制
    encro
        12
    encro  
       2020-01-03 16:45:43 +08:00
    @holinhot
    试一下就知道了,
    这个是异步 request 库,
    应该也是用到协程的,
    能帮你压榨 CPU 和带宽、磁盘先到极限的
    opengps
        13
    opengps  
       2020-01-03 16:49:05 +08:00
    考虑这个问题更多因素在于网络延迟,程序只要做好并发控制就可以了
    encro
        14
    encro  
       2020-01-03 16:49:23 +08:00
    fastapi 这 python 库,
    因为用了不同的异步模型,
    性能比 flask 原来提升了一个数量级。
    https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7
    veike
        15
    veike  
       2020-01-03 16:55:25 +08:00
    很好奇你要做什么,难道要和我的想法一样吗?
    tourist2018
        16
    tourist2018  
       2020-01-03 16:57:09 +08:00
    goroutine 并发去请求你说的那些网址就行了 至于能开多少 限制的应该不是语言这边 限制的应该是 tcp 连接你的机器一次能建立多少

    如果只完成你说的任务 一秒探测网址的 status 最简单的 开你说的网址个 goroutine select 限制一秒时间 能返回正常值得说明就是符合的网址 超时的就是有问题的。。。
    sagaxu
        17
    sagaxu  
       2020-01-03 17:02:00 +08:00 via Android
    @monkeyWie 端口数是 per ip 的,多开 docker 能增加出口 IP 吗?
    est
        18
    est  
       2020-01-03 17:05:18 +08:00   ❤️ 2
    就没有一个人哪怕是提一下 gevent ?
    monkeyWie
        19
    monkeyWie  
       2020-01-03 17:14:34 +08:00
    @sagaxu 每个容器都会有一个虚拟 ip 的呀,我之前看一个 C1000K 测试就是用 docker 来做的
    phantomzz
        20
    phantomzz  
       2020-01-03 17:21:55 +08:00
    blackbox_exporter 了解一下。。。现成的东西。。[]( https://github.com/prometheus/blackbox_exporter)
    tourist2018
        21
    tourist2018  
       2020-01-03 17:28:26 +08:00
    @tourist2018 golang 本身 client 可以限制超时时间 那就不用 timer 了
    sagaxu
        22
    sagaxu  
       2020-01-03 18:11:57 +08:00 via Android
    @monkeyWie 不管你 nat 之后有几个虚拟 IP,对方服务器看到的 IP 只有出口 IP 这一个
    monkeyWie
        23
    monkeyWie  
       2020-01-03 18:17:23 +08:00
    @sagaxu 服务器对出口 IP 又没有限制,只要 fd 够用就行了
    superrichman
        24
    superrichman  
       2020-01-03 18:22:47 +08:00 via iPhone   ❤️ 1
    劝你别这么做,qps 太高分分钟被运营商屏蔽,第二天就上新闻:xxx 涉嫌对 xxx xxx 台服务器进行大规模攻击,已被拘留。 /狗头🐶
    sagaxu
        25
    sagaxu  
       2020-01-03 18:23:10 +08:00 via Android
    @monkeyWie 那是 tcpip 四元组的限制,跟服务器没有关系
    sagaxu
        26
    sagaxu  
       2020-01-03 18:23:47 +08:00 via Android
    @monkeyWie 你的公网地址只有一个,无论你怎么开 docker,也变不出两个地址来
    monkeyWie
        27
    monkeyWie  
       2020-01-03 18:31:02 +08:00
    @sagaxu 懂了😅,又看了那个 C1000K 测试也是本地一台机器做的,所以可以适用
    holinhot
        28
    holinhot  
    OP
       2020-01-03 18:58:24 +08:00
    @monkeyWie 端口问题可以用分配多个 ip 地址来解决
    liuxu
        29
    liuxu  
       2020-01-03 19:03:31 +08:00
    @superrichman 10K CC,不是买的发包机不封才怪
    holinhot
        30
    holinhot  
    OP
       2020-01-03 19:11:24 +08:00
    @phantomzz 还有 https://github.com/yanc0/beeping 这个我也看了,这两个如果任务量不大还行,任务量大了 call 自己的接口又浪费就个数量级的性能吧
    holinhot
        31
    holinhot  
    OP
       2020-01-03 19:12:47 +08:00
    @superrichman 自己的服务器,不是构建 cc 攻击器哦。
    0x1d12er
        32
    0x1d12er  
       2020-01-04 07:27:56 +08:00
    @monkeyWie 我刚刚看了下 Docker 的文档好像每个 container 的 port 是映射到 host 的 port 上面的,所以可用的 port 的数量还是一样的吧
    https://docs.docker.com/config/containers/container-networking/
    https://github.com/mesosphere/marathon/issues/647
    0x000007b
        33
    0x000007b  
       2020-01-04 09:16:04 +08:00
    @est 哈哈哈哈老哥我也想问
    monkeyWie
        34
    monkeyWie  
       2020-01-04 12:02:43 +08:00
    b00tyhunt3r
        35
    b00tyhunt3r  
       2020-01-04 12:13:02 +08:00 via iPhone
    @veike 从你们头像分析应该相差不大
    xvrzhao
        36
    xvrzhao  
       2020-01-05 17:49:42 +08:00
    正好前些天用 Go 写了你这个需求,正好可以体现 goroutine 的优势,你可以看下: https://github.com/xvrzhao/site-monitor
    xvrzhao
        37
    xvrzhao  
       2020-01-05 17:52:19 +08:00
    哦 对了 我是单个 url,没有使用 channel,你可以用 channel 做 url 队列供给下面的 goroutine task 消费。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2804 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:49 · PVG 13:49 · LAX 21:49 · JFK 00:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.