今天使用python多线程请求服务时,出现Cannot assign requested address错误
网上找了下原因,大致上是由于客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。
client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口。
netstat -a|grep TIME_WAIT tcp 0 0 e100069210180.zmf:49477 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49481 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49469 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49505 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49547 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49513 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49543 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49571 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49488 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49582 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49476 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49462 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49561 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49259 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49371 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49455 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49572 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49509 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49546 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49539 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49468 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49496 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49313 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49479 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49486 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49452 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49500 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49447 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49580 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49565 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49454 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49499 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49494 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49591 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49566 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49557 e100069202104.zmf.tbs:websm TIME_WAIT tcp 0 0 e100069210180.zmf:49495 e100069202104.zmf.tbs:websm TIME_WAIT
解决办法
执行命令修改如下2个内核参数 (需要root权限)
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收