2

我有一个简单的扭曲应用程序,提供“Hello World!”。通过 HTTP 协议。我正在尝试运行几个实例以利用所有处理器。

但我提到,单个扭曲的应用程序处理的请求甚至比 haproxy 后面的同一应用程序的 1、2 或 5 个实例要多得多。我不知道为什么会这样。

/我通过 JMeter运行了 5000 个线程。当我在 127.0.0.1:9001 上运行它时,它会在 500 毫秒内成功处理每个请求。当我在 127.0.0.1:8080 上运行它时,一些响应503 Service Unavailable和一些运行超过 500 毫秒。

这是我的配置文件:

global
    maxconn 500000
    user german

defaults
    mode http
    retries 0
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    balance roundrobin
    # if something goes wrong with server, redistribute client to a working server
    option redispatch

listen http 127.0.0.1:8080
    mode http
    option httpchk GET / HTTP/1.1

    server prototype-local 127.0.0.1:9001 maxconn 0 weight 1 maxqueue 0 cookie server01 check inter 5000 rise 1 fall 3

    balance roundrobin

    # to see ip's of clients
    option forwardfor
    option http-server-close
    # disable or enable immediate session resource cleaning(useful for chat)
    # option nolinger
    # inserts cookie to each client requet to identify a process
    cookie SWCOMMET insert indirect nocache
    # will be enalbed as soon as main server with process crashed :nice fail resistance
    option allbackups
4

1 回答 1

0

当我在 127.0.0.1:9001 上运行它时,它会在 500 毫秒内成功处理每个请求

你在开玩笑吗 ?如果像“hello world”这样简单的应用程序在 500 毫秒内响应,那么肯定有什么地方坏了。

您应该检查您的服务器是否没有交换(例如:由于内存泄漏),这可以解释如此巨大的响应时间以及为什么在链中添加 haproxy 时会更糟,因为这两个进程都会受到影响。

您从 haproxy 获得 503 的事实意味着它丢失了未能响应健康检查的服务器。这符合 BTW 巨大的响应时间。

也有可能由于任何原因,应用程序正在占用所有 CPU,并且如果它绑定到同一个 CPU,则会对 haproxy 产生高调度延迟。您应该监控 CPU 使用率并查看每个进程在哪个 CPU 上运行(为此使用“top”)。理想情况下,您应该将 haproxy 强制到特定核心(使用任务集)并将您的应用程序强制到另一个核心。避免跨内核的线程迁移对于实现高负载至关重要,因此每个新实例都必须在专用内核上运行。

如果服务器占用大量内存,您应该使用 haproxy 的服务器 maxconn 参数来序列化请求(并删除 maxqueue)。

在我在您的 haproxy 配置中看到的其他内容中,全局 maxconn 很大并且没有多大意义,因为您需要大约 9 GB 的 RAM 仅用于 haproxy 才能达到此限制。此外,您需要在默认部分设置一个 maxconn 值,因为前端的默认值为 2000,这可能低于您尝试的值。

您应该删除“maxconn 0”、“maxqueue 0”和“weight 1”,因为它们是默认设置,只会使对配置的理解复杂化。

于 2012-08-25T07:53:05.537 回答