跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 高并发 TCP 的 time_wait 问题。为什么服务器资源会被占满
未分類
9 5 月 2020

高并发 TCP 的 time_wait 问题。为什么服务器资源会被占满

高并发 TCP 的 time_wait 问题。为什么服务器资源会被占满

資深大佬 : Moonkin 8

一个端口可以建立 2^16 个 TCP 链接吧,为什么讲解 time_wait 的博客大多都是说服务器端口被占满,难道一般情况下设计的服务器是为每一个 TCP 链接单独占用一个端口吗?

所有空闲端口*每个端口 2^16 个链接,差不多可以有 2^30 个链接,这样的话,不会发生 time_wait 过多的问题吧?

所以 time_wait 到底是占用了什么导致后续客户端访问被拒绝的?

大佬有話說 (26)

  • 資深大佬 : soulzz

    他们可能不知道 nio
    time_wait 基本都是卡在数据库那里了
    如果请求方做了超时处理,这时候就成了 close_wait 了

  • 資深大佬 : zjj19950716

    cpu fd 内核参数 ?

  • 資深大佬 : hopingtop

    如果服务是短链接,例如 HTTP 这种,高并发情况下,会创建很多新的 TCP 新链接。当服务器主动发起 FIN 包关闭链接时,会出现 2 个 MSL 的等待时间(此时的 fd 资源是没有释放的),这都是为了安全关闭 TCP 链接所做的机制。可以修改系统参数,适当的缓解 time_wait 这种情况。

  • 資深大佬 : fxxkgw

    我记得看过的 time_wait 都是基本上说是占用系统资源,没有特别强调说把端口占满这种问题。。。正常端口范围是 1024-65535 之间

    不过 time_wait 状态最好的办法就是扩容机器,盲目把 tcp_tw_recycle=1,在 NAT 环境下因为服务器间系统时间不一致,导致包时间戳不一致而产生丢包这种问题能折腾死人。

  • 資深大佬 : rrfeng

    fd 也是一种资源,一般是受限的( ulimit )
    @fxxkgw

  • 主 資深大佬 : Moonkin

    @soulzz nio 对 time_wait 过多的问题有哪方面帮助啊? nio 是高并发的时候不需要每个为 socket new 一个处理线程吧。。

  • 主 資深大佬 : Moonkin

    @zjj19950716
    @hopingtop
    @fxxkgw
    @rrfeng
    我看这个 StackOverflow 上面的回答也是说 TCP 链接数目没有限制,是 fd 限制。。。可能我之前看的博客比较水吧。。。
    https://stackoverflow.com/questions/2332741/what-is-the-theoretical-maximum-number-of-open-tcp-connections-that-a-modern-lin

  • 資深大佬 : liuminghao233

    你要是没用 reuseaddr
    timewait 的时候用那个端口是不可用的
    如果你几秒钟内把 2^16 个端口都用了
    timewait 还没到时间
    那么就没有端口用了

  • 主 資深大佬 : Moonkin

    @liuminghao233 也就是说,没有 reuseaddr 的话,每个端口只能有一个 TCP 链接吗?

  • 資深大佬 : raynor2011

    是发起短连接的客户端会有 time_wait 占用端口问题, 服务器不会有这个问题

  • 資深大佬 : SAIKAII

    1. 首先,每次来一个连接都对应一个套接字,套接字由(local_ip, local_port, remote_ip, remote_port)标志,然后每个新的连接套接字的本地 ip 和 port 不变,变的是 remote 的 ip 和 port 。
    2,每个套接字对应一个文件描述符 fd,fd 用完就无法再创建了。wait_time 导致的资源耗尽是 fd 的耗尽,这个资源大小可以修改。

  • 資深大佬 : misaka19000

    time_wait 一般是短连接太多导致的吧,解决办法是尽量复用 TCP 连接

  • 資深大佬 : misaka19000

    上的一些文字真是让我很诧异,time_wati 和 nio 没关系,和 fd 也没关系

    我估计主想问的是另一个问题:一个端口可以对应多个 TCP 链接吗?
    答案是可以的,因为 client_host:client_port — server_host:server_port 为一个连接,可见服务器端是可以维护多个连接的,一个连接会占用一个 fd,fd 由操作系统限制并且可以修改

  • 資深大佬 : sagaxu

    time_wait 的时候,fd 已经 close 掉了,怎么个占用法呢?

  • 主 資深大佬 : Moonkin

    @misaka19000 那 time_wait 的危害是什么呢?为什么要减少 time_wait 。。。

  • 主 資深大佬 : Moonkin

    @raynor2011 也就是说客户端一个端口只能发起一个 tcp 链接吗?我看 StackOverflow 说“一个端口可以有 64K 个 tcp 链接”,这是说端口在服务器被监听的情况下才可以吗?发起方不能发起 64K 个?

  • 資深大佬 : gravitybox

    @Moonkin time_wait 会占着端口不放,如果有大量的连接处于 time_wait,那么可能后续无法分配端口了。

  • 資深大佬 : misaka19000

    @Moonkin #14 一个 time_wait 代表了一个未被释放的 TCP 连接,总归是会占用一些内存的,如果出现了大量的 time_wait 需要考虑是不是系统被攻击了或者有什么可以优化的地方

  • 主 資深大佬 : Moonkin

    @gravitybox 只有一个服务器而且只有一个客户端 才会出现端口占满的情况吧,因为这种情况只能客户端改变端口标识唯一 tcp

  • 資深大佬 : liuminghao233

    @Moonkin
    假设你有个 tcp
    10.10.10.10:6666—远程 8.8.8.8:80 timewait 了
    你就暂时不能用
    [10.10.10.10:6666—8.8.8.8:80]
    但是有 reuseport 的话
    虽然[10.10.10.10:6666—8.8.8.8:80]还是用不了
    但是你可以用[10.10.10.10:6666—8.8.8.8:83]
    或者是[10.10.10.10:6666—8.8.8.2:80]

  • 資深大佬 : liuminghao233

    打错了 是 reuseaddr

  • 主 資深大佬 : Moonkin

    @liuminghao233 #20 嗯,懂啦,谢谢大佬。查了查 so_reuseaddr 和 so_reuseport,感觉我这个问题还是得事先说清楚是不是 reuse
    https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ

  • 資深大佬 : akira

    @fxxkgw 对的,之前我们有遇到过这个情况,他们查了一个多月都没查到问题

  • 資深大佬 : catror

    time_wait 是客户端的状态……占用的我是客户端的资源

  • 資深大佬 : julyclyde

    “讲解 time_wait 的博客大多都是说服务器端口被占满”的主要原因是文盲

  • 資深大佬 : wanguorui123

    修改 Linux 的参数,time_wait 都杀掉

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具