如何在 kubernetes 的 pod 中设置 Gunicorn 工作编号

rom*_*lym 9 python gevent flask gunicorn kubernetes

我正在运行一个带有工人阶级flask的应用程序。在我自己的测试环境中,我按照官方指南设置worker编号。gunicorngeventmultiprocessing.cpu_count() * 2 + 1

如果我想将应用程序放在 Kubernetes 的 pod 上并假设资源如下

resources:
  limits:
    cpu: "10"
    memory: "5Gi"
  requests:
    CPU: "3"
    memory: "3Gi"
Run Code Online (Sandbox Code Playgroud)

如何计算工人数量?我应该使用限制 CPU 还是请求 CPU?


附言。我通过pyinstaller本质上打包的二进制文件启动应用程序flask run(python script.py),并在主线程中启动gunicorn:

def run():
    ...
    if config.RUN_MODEL == 'GUNICORN':
        sys.argv += [
            "--worker-class", "event",
            "-w", config.GUNICORN_WORKER_NUMBER,
            "--worker-connections", config.GUNICORN_WORKER_CONNECTIONS,
            "--access-logfile", "-",
            "--error-logfile", "-",
            "-b", "0.0.0.0:8001",
            "--max-requests", config.GUNICORN_MAX_REQUESTS,
            "--max-requests-jitter", config.GUNICORN_MAX_REQUESTS_JITTER,
            "--timeout", config.GUNICORN_TIMEOUT,
            "--access-logformat", '%(t)s %(l)s %(u)s "%(r)s" %(s)s %(M)sms',
            "app.app_runner:app"
    ]
    sys.exit(gunicorn.run())

if __name__ == "__main__":
    run()
Run Code Online (Sandbox Code Playgroud)

附言。无论是我设置的工人数量limits CPU (10*2+1=21)还是requests CPU (3*2+1=7)性能仍然达不到我的预期。在此问题下欢迎任何提高性能的尝试建议

Mik*_*iak 3

如何计算工人数量?我应该使用限制 CPU 还是请求 CPU?

这取决于你的情况。首先,查看有关请求和限制的文档(这个示例是针对内存的,但对于CPU也是如此)。

如果 Pod 运行的节点有足够的可用资源,则容器可能(并且允许)使用比该 request 资源指定的资源更多的资源。然而,容器不允许使用超过其资源的资源 limit

例如,如果您 memory 为容器设置 256 MiB 的请求,并且该容器位于调度到具有 8GiB 内存的节点且没有其他 Pod 的 Pod 中,则该容器可以尝试使用更多 RAM。

memory 如果您为该容器 设置 4GiB 的限制,则 kubelet (和容器运行时)会强制执行该限制。运行时会阻止容器使用超过配置的资源限制。例如:当容器中的进程尝试消耗超过允许的内存量时,系统内核会终止尝试分配的进程,并出现内存不足 (OOM) 错误。

回答你的问题:首先,你需要知道你的应用程序需要多少资源(例如CPU)。请求将是应用程序必须接收的最小 CPU 量(您必须自己计算该值。换句话说 - 您必须知道应用程序需要多少最低 CPU 才能正常运行,然后您需要设置该值。)例如,如果您的应用程序在接收更多 CPU 时性能会更好,请考虑添加限制(这是应用程序可以接收的最大 CPU 量)。如果要按照最高性能计算worker数量,请使用limit来计算该值。另一方面,如果您希望应用程序平稳运行(可能不是尽可能快,但会消耗更少的资源),请使用request类型。