【问题标题】:Glassfish Thread Pool, Acceptor Threads, HTTP Max ConnectionsGlassfish 线程池、接受者线程、HTTP 最大连接数
【发布时间】:2015-10-13 06:54:35
【问题描述】:

请看附图,请帮助我理解线程池(最大和最小线程池大小)、接受者线程及其最大连接数和 HTTP 最大连接数之间的关系。

线程池:

HTTP:

传输 TCP:

【问题讨论】:

    标签: java multithreading glassfish request connection


    【解决方案1】:

    首先我会给你一些官方文档

    线程池

    线程池是服务器可以处理的最大并发请求数。服务器有一个等待线程处理的连接队列。

    请记住,线程的请求生命周期会很长。也就是说,不仅在从套接字读取 HTTP 请求,或者在向客户端写入 HTTP 响应时,而且一直在处理业务逻辑,等待 DB 完成,写入日志文件,发送/接收 WS 方法,...

    阅读:https://docs.oracle.com/cd/E18930_01/html/821-2431/abehk.html

    HTTP 最大连接数

    HTTP 服务器正在监听客户端请求,每个客户端都有一个关联的连接队列,其中的请求正在排队等待由 线程池 中的线程处理。

    这里是等待服务排队请求的线程所在的位置。

    阅读:https://docs.oracle.com/cd/E18930_01/html/821-2431/abegk.html

    传输接受线程

    这个数字表示在任何时候每个侦听套接字在accept mode 中可以容纳您的服务器的线程数。 Oracles 文档建议使这个数字低于 CPU 的数量。

    也就是说,这是同时读/写的套接字数。您可以认为与线程池有直接关系,但请记住,线程不仅用于读取/写入客户端,还用于处理请求。

    阅读:http://docs.oracle.com/cd/E18930_01/html/821-2431/gkxjt.html

    我的解释

    因此,您的服务器将为每个客户端(侦听套接字)设置一个队列,其中不能超过 最大连接数。此连接将由 线程池 处理,同时它不能超过 Acceptor Threads 处理/接受的套接字。

    如果客户端请求等待的时间超过 超时,它将被拒绝。 Min Thread Pool 确保您拥有最少的线程,准备好进行处理。 Max Connection Count 限制了您可以等待的 listen sockets 总数。如果超过最后一个限制,新的连接将被拒绝。

    希望对你有帮助。

    【讨论】:

    • malaguna,您可以提供一个图片来解释吗?这将有助于我理解内部机制。
    • 每个客户的队列?这意味着什么?。假设有 5 个同时出现的请求,每个请求来自不同的客户端。所以你的意思是说会有5个队列等待服务。每个队列长度4096?
    • 对不起,我刚刚重读了一遍,不是很清楚。对于每个客户,我指的是每个听众,而不是每个访问您的网络应用程序的人,对于给您带来的不便,我们深表歉意。这就是为什么我把 listen socket 放在对监听器的引用中。括号之间,但它有点混乱。为了澄清,请阅读:blogs.oracle.com/binublog/entry/…第一段非常清楚。
    • 那么,一个http监听器可以同时处理4096个请求吗?还是取决于线程池计数?我假设所有请求都放入此队列,如果我有 500 个作为线程池计数,则同时从该队列中获取前 500 个请求并开始处理,这是什么意思?
    • 一个 HTTP 侦听器可以保持许多 Max Connections 请求,这些请求正在等待处理池中的空闲线程,所以你是对。但请注意,处理不是同时,而是同时......这是不一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多