问题描述:
在进行压测时,一开始很正常,大约在30000次请求之后,错误率达到100%且接口耗时超过3s(人工设定的超时等待时间),查看日志后发现大量的Cannot assign requested address异常。
“Cannot assign requestedaddress”异常是由于Linux分配的客户端连接端口用尽,无法建立socket连接所致,虽然socket正常关闭,但是端口不是立即释放,而是处于TIME_WAIT状态,默认等待60s后才释放。所以也出现了大量的接口超时的现象了。
因为我们在初始化Netty时使用了保活策略(ChannelOption.SO_KEEPALIVE),当长时间通道没有数据交流时,TCP会发送活动探测数据报文来测试通道的连接状态。在代码逻辑中我们在每一次建立与channel的连接时均新建了一个handler对象(即每次都新建一个通道的连接),所以每当有连接请求时都会分配新的通道,最终导致连接端口用尽。