jboss 如何增加Wildfly中的最大连接数、流数和线程数?

mnemlml8  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(332)

我正在建立一个通知系统,它允许客户端连接到一个Web服务器,然后得到服务器端事件的通知。我目前使用Wildfly 16.0单机版(在Windows上)作为Web服务器。我得到了服务器端事件与下面的示例代码一起工作。

@GET
@Path("register")
@Produces("text/event-stream")
public void subscribe(@Context SseEventSink sseEventSink,
                      @HeaderParam(HttpHeaders.LAST_EVENT_ID_HEADER)) {

    while (true) {

        OutboundSseEvent sseEvent = this.eventBuilder
                .data("some data")
                .reconnectDelay(3000)
                .build();
        CompletionStage<?> cs = sseEventSink.send(sseEvent);

        cs.whenComplete((x, y) -> {
            System.out.println("Completed " + x);
            if (y != null) y.printStackTrace();
        });

        Thread.sleep(5 * 1000);

    }
    sseEventSink.close();
}

此解决方案可用于最多120个连接的客户端,且服务器负载最小,之后无法建立新连接。
我使用ApacheBench 2.3版进行测试。

ab -A 123:123 -c 120 -n 120 http://127.0.0.1:8080/

如果我的并发连接数超过120,其他人就无法连接。在我看来,这似乎是一个活动连接或流或线程限制。如果一个用户断开连接,另一个用户就可以连接。我试图在standalone.xml中的http-listener上设置max-connections。这没有效果。我只是简单地在我能找到的每个connection / thread / pool选项中添加了一个零。尽管如此,没有变化。
下一步该去哪里?

zynd9foi

zynd9foi1#

我认为您面临的不是连接限制问题,而是wildfly耗尽了I/O线程。如果您运行一个8核CPU,它将与您提到的大约120个并发客户端相匹配:来自https://wildscribe.github.io/WildFly/18.0/subsystem/io/worker/index.html#attr-task-max-threads
指定工作者任务线程池的最大线程数。如果未设置,则使用通过公式cpuCount * 16计算的默认值
通过www.example.com增加价值jboss-cli.sh:

/subsystem=io/worker=default:write-attribute(name=task-max-threads, value=1024)

或者在独立的.xml中:

<subsystem xmlns="urn:jboss:domain:io:3.0">
    <worker name="default" task-max-threads="1024"/>
    <buffer-pool name="default"/>
</subsystem>
trnvg8h3

trnvg8h32#

您可以将max-connections连接属性添加到http-listner标记。例如:

<http-listener name="default" max-connections="1000" socket-binding="http" redirect-socket="https" enable-http2="true"/>

这样,您将能够增加最大连接数。

zd287kbt

zd287kbt3#

我相信您的连接已经用完了,因为您的subscribe方法由于while (true) { ... }循环而永远不会返回。
以下是我的工作:

@Singleton
@Path("")
public class BroadcastService {

    @Context
    private Sse sse;

    private SseBroadcaster broadcaster;

    @PostConstruct
    void initialise() {
        this.broadcaster = sse.newBroadcaster();
    }

    @PreDestroy
    void shutdown() {
        this.broadcaster.close();
    }

    @GET
    @Path("register")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public void subscribe(@Context SseEventSink sseEventSink) {
        this.broadcaster.register(sseEventSink);
    }

    @Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
    public void broadcastData() {
        OutboundSseEvent sseEvent = this.sse.newEventBuilder()
          .data("some data")
          .reconnectDelay(3000)
          .build();
        this.broadcaster.broadcast(sseEvent);
    }
}

我测试了:

ab -c 2000 -n 4000 http://127.0.0.1:8080/sse-demo/register

并且仍然能够:

curl http://127.0.0.1:8080/sse-demo/register

retry: 3000
data: some data

retry: 3000
data: some data

相关问题