【问题标题】:uWSGI lazy-apps and ThreadPooluWSGI 惰性应用程序和线程池
【发布时间】:2017-11-12 14:04:26
【问题描述】:

使用 uWSGI 运行

$ cat /etc/uwsgi/uwsgi.cfg

[uwsgi]
callable = app
socket = /var/run/arivale-service/uwsgi.sock
chmod-socket = 666
pidfile = /var/run/arivale-service/uwsgi.pid
master = true
enable-threads = true
single-interpreter = true
thunder-lock
need-app
processes = 4

如果不启用lazy-apps,对调用以下端点的请求会挂起

import boto3
# ...irrelevant imports
from multiprocessing.dummy import Pool as ThreadPool


POOL = ThreadPool(6)

# ...irrelevant setup


def get_ecs_task_definitions(service_name):
    ecs_service_name, _ = get_ecs_service_name_and_cluster(service_name)

    def get_task_definition(task_definition_arn):
        formatted_task_definition = {}
        task_definition = ECS.describe_task_definition(taskDefinition=task_definition_arn)['taskDefinition']
        # ...
        # build formatted_task_definition from task_definition
        # ...
        return formatted_task_definition
    task_definition_arns = ECS.list_task_definitions(
        familyPrefix=ecs_service_name, status='ACTIVE')['taskDefinitionArns']
    return POOL.map(get_task_definition, task_definition_arns)


@service.api('/api/services/<service_name>/ecs/task-definitions')
def get_task_definitions(service_name):
    return {'service_name': service_name, 'task_definitions': get_ecs_task_definitions(service_name)}

NGINX 正在平衡 uWSGI 应用程序,这就是它在 error.log (NGINX) 中所说的:

Jun 10 03:54:26 93e04e04e2cf nginx_error: 2017/06/10 03:54:26 [error] 49#49: *33 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 172.16.254.95, server: localhost, request: "GET /api/services/data-analysis-service/ecs/task-definitions HTTP/1.1",upstream: "uwsgi://unix:/var/run/arivale-service/uwsgi.sock", host: "devops-service.arivale.com"

对端点的每个请求都会挂起一个worker(下面是uwsgitop在2个请求后的输出):

uwsgi-2.0.15 - Sat Jun 10 21:26:10 2017 - req: 0 - RPS: 0 - lq: 0 - tx: 0
node: localhost - cwd: /var/www/arivale-service/web - uid: 0 - gid: 0 - masterpid: 45
 WID    %       PID     REQ     RPS     EXC     SIG     STATUS  AVG     RSS     VSZ     TX      ReSpwn  HC      RunT    LastSpwn
 1      0.0     74      0       0       0       0       busy    0ms     0       0       0       1       0       0       21:23:20
 2      0.0     75      0       0       0       0       busy    0ms     0       0       0       1       0       0       21:23:20
 3      0.0     76      0       0       0       0       idle    0ms     0       0       0       1       0       0       21:23:20
 4      0.0     77      0       0       0       0       idle    0ms     0       0       0       1       0       0       21:23:20

启用lazy-apps 可解决此问题。有谁确切地知道为什么?

【问题讨论】:

    标签: multithreading nginx threadpool uwsgi


    【解决方案1】:

    这是因为 uWSGI 工作人员无法访问在主服务器中创建的线程池,请参阅https://stackoverflow.com/a/39890941/2419669

    使用@postfork 可以解决这个问题:

    global THREAD_POOL = None
    
    @postfork
    def _make_thread_pool():
        global THREAD_POOL
        THREAD_POOL = ThreadPool(8)
    

    【讨论】:

    • THREAD_POOL = ThreadPool(8) NameError: name 'ThreadPool' is not defined
    • 从 uwsgidecorators import * from multiprocessing.pool import ThreadPool 添加但仍未解决
    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 2014-08-13
    • 2023-04-07
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多