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

Go 压测程序异常退出

  •  
  •   lasuar · 2023-07-17 16:55:31 +08:00 · 1414 次点击
    这是一个创建于 524 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我正在写一个 TCP 长连接网关的压测代码,在 client 与 server 建立了 6w 个 conn 后,运行几分钟时间后 client 就异常退出了,没有 panic ,但控制台打印了很多下面的堆栈信息:

    goroutine 119057 [sleep]:
    time.Sleep(0x77359400)
            C:/Users/Administrator/sdk/go1.19.7/src/runtime/time.go:195 +0x13c
    command-line-arguments.runOneConn(0xc0004ded00, 0xc0008f4b18, 0xc0008f4b10, 0xea60, {0x8c2c91?, 0xc02a8a1fb0?, 0x1cff060?})
            D:/dev_bg/server/src/gateway/main_test.go:201 +0x24d
    command-line-arguments.TestTCPServer.func2(0x0?)
            D:/dev_bg/server/src/gateway/main_test.go:120 +0x8a
    created by command-line-arguments.TestTCPServer
            D:/dev_bg/server/src/gateway/main_test.go:110 +0x1a6
    
    goroutine 118925 [sleep]:
    time.Sleep(0x77359400)
            C:/Users/Administrator/sdk/go1.19.7/src/runtime/time.go:195 +0x13c
    command-line-arguments.runOneConn(0xc0004ded00, 0xc0008f4b18, 0xc0008f4b10, 0xea60, {0x8c2c91?, 0xc024cc3fb0?, 0x1cff060?})
            D:/dev_bg/server/src/gateway/main_test.go:201 +0x24d
    command-line-arguments.TestTCPServer.func2(0x0?)
            D:/dev_bg/server/src/gateway/main_test.go:120 +0x8a
    created by command-line-arguments.TestTCPServer
            D:/dev_bg/server/src/gateway/main_test.go:110 +0x1a6
            
    ...重复的堆栈信息
    
    

    想请教一下如何排查这个问题,server 端是没有 err 的,server 和 client 都运行在一台机器上。

    14 条回复    2023-07-18 11:25:47 +08:00
    opengps
        1
    opengps  
       2023-07-17 16:59:59 +08:00
    单个系统内,client 最大理论发起 65535 ,异常信息应该是没有端口可用
    lasuar
        2
    lasuar  
    OP
       2023-07-17 17:02:32 +08:00
    @opengps 我的预期就是 6w 个 conn ,全部连接成功了的,排除这个原因
    bv
        3
    bv  
       2023-07-17 17:04:07 +08:00
    这个堆栈看不出什么有用信息
    lasuar
        4
    lasuar  
    OP
       2023-07-17 17:07:09 +08:00
    @bv 我开始推断是 panic ,判断也许是因为输出太多覆盖了,加入了 panic 时写入文件的代码,但实际也没有触发此逻辑,说明也没有 panic 。但输出就是这个,我也懵,想知道有没有其他排查方式
    bv
        5
    bv  
       2023-07-17 17:26:09 +08:00
    出错的时候,最上面的栈信息应该有用,你可以翻到最上面看一下。
    lasuar
        6
    lasuar  
    OP
       2023-07-17 17:29:37 +08:00
    @bv #5 看不到了,输出太多了
    lasuar
        7
    lasuar  
    OP
       2023-07-17 17:36:20 +08:00 via iPhone
    @bv 准备把 stdout 定向到文件
    zdt3476
        8
    zdt3476  
       2023-07-17 17:51:48 +08:00
    @lasuar #2 大概率还是端口的问题,你如果没有修改过的话,可用端口号都是从 3w 多开始的,所以理论上用户可用的端口只有 3w 多
    huigeer
        9
    huigeer  
       2023-07-17 17:56:01 +08:00
    看看系统日志? /var/log/message ,是不是被系统强制 kill 了?
    lasuar
        10
    lasuar  
    OP
       2023-07-17 18:10:27 +08:00
    @zdt3476 “从 3w 多开始” 这个你有什么根据吗?
    gamexg
        11
    gamexg  
       2023-07-17 22:52:22 +08:00
    @lasuar #10 关键字 windows 动态端口
    zdt3476
        12
    zdt3476  
       2023-07-18 10:18:06 +08:00
    @lasuar #10 之前没注意看,还以为你是 linux 。windows 的默认就更小了,你可以在 powershell 查看: netsh int ipv4 show dynamicport tcp 。默认应该是从 49152 到 65535 。
    lasuar
        13
    lasuar  
    OP
       2023-07-18 10:32:59 +08:00
    @zdt3476 #12

    ```
    (venv) PS D:\dev_bg\server> netsh int ipv4 show dynamicport tcp

    协议 tcp 动态端口范围
    ---------------------------------
    启动端口 : 1024
    端口数 : 64511
    ```

    我改过了,所以真不是这个问题。
    lasuar
        14
    lasuar  
    OP
       2023-07-18 11:25:47 +08:00
    @opengps
    @bv #3
    @bv #5
    @huigeer
    @zdt3476 #8

    查到原因了。通过 在 go test 命令加 stdout/stderr 重定向到文件的指令,把信息保存下来了,在首次爆出堆栈的位置看到了原因是 触发了 go test 的默认运行 10m 超时机制 panic ,这个不是测试代码的问题,所以可以忽略了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2124 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:10 · PVG 00:10 · LAX 08:10 · JFK 11:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.