背景
业务有一段时间有大量的短耗时请求,导致业务报错:connect: cannot assign requested address。
原因
Go数据库连接池设置不合理导致大量TIME_WAIT连接占满端口问题排查与解决
MaxIdleConns不能小于MaxOpenConns,否则如果请求量大时,归还给连接池时,只会保留MaxIdleConns数量的连接,会产生大量的连接被建立与关闭:比如MaxOpenConns为100,MaxIdleConns为10,则每一个循坏会导致有90个链接建立与关闭。由于连接需要客户端退出TIME_WAIT(2MSL)状态才会释放,大量的请求会导致大量的连接处于TIME_WAIT状态,从而耗尽系统端口资源,然后报错:connect: cannot assign requested address