Go在业务量高的情况下连接数上不去,求帮忙

最近使用Go在写tcp服务器,在只创建连接无业务请求的情况, 可以同时保持50万以上的连接数。但是,加上业务逻辑后,每个连接1s一个请求的情况下,只能创建1万-2万左右的连接数, 后面的都是connect time out错误。 系统各项参数都没有达到瓶颈, cpu 20%, load 0.8, 网卡无丢包, 无硬盘操作,只有内存操作, 内存占用也不高

共 16 个回复


stevewang

怀疑是accept以后没有立刻创建一个goroutine去处理连接,导致accept调用经常被阻塞较长时间。

# 0

heimeil

1楼观点+1

# 1

liaozhongjing

已检查代码, 在accept后, 立即创建了goroutine 处理请求

# 2

liaozhongjing

在accept后的, 各个部分都加了时间统计, 发现耗时都不大, 消息量达到20000/s时, 耗时主要在Write 到client部分, 最高耗时2s. 现象就是, 只要能连上, 都能正常发消息, 收消息, 其他都是连接超时

# 3

stevewang

客户端的”connect time out“是系统层的报错,还是业务层的报错?

# 4

stevejiang

netstat看下实际创建的连接数,并且看下监听的端口请求队列有多长

# 5

liaozhongjing

是在 dialer.Dial("tcp", test_server) 这行报错,应该是系统层报错

# 6

darksword

是不是系统环境导致的?

# 7

bigbear

句柄数问题?

# 8

liaozhongjing

@darksword 多个环境都已经试过, 都有相同的现象

# 9

liaozhongjing

@bigbear 句柄数很少,没达到极限

# 10

linfangrong

我这边连接数到单机到85W都木有啥问题。。。 有时间交流下呗~

# 11

hewei861124

修改内核参数,另外你的网卡时100M还是1000M的网卡,跟PPS也有很大关系。

# 12

testing

带宽问题?

# 13

darksword

以前也碰到过,在自己电脑上连接1000个左右就不行了,错误信息跟楼主一样,后面换一台高配电脑后就不止这点连接了

# 14

David

机器多少个CPU,设了runtime.GOMAXPROCS了么?如果没有硬盘操作,就不会有blocking,所以 CPU 得够,否则可能会导致 Accept的 go routine 没被调度到。

# 15