发送大型请求时,生产服务器比本地测试服务器慢得多

发送大型请求时,生产服务器比本地测试服务器慢得多

我正在运行一个 django 应用程序,并尝试向我的生产服务器发送一个相当大的 API POST 请求。

现在的问题是本地 4 秒在生产中需要 1 分钟。这听起来可能不算什么,但我计划发送此请求 100 次,每一秒都很重要。

我圈出了问题,我认为这可能是 nginx 配置问题,但我不能确定。以下是我使用相应代码进行故障排除的过程:

我有一本大字典dataset_dict = {1:1234, 2:1244 ... 525600: 124345662},这意味着大约有五十万个条目。

我发送此信息并测量我的时间post-request

            dataset_dict = {1:1234, 2:1244 ... 525600: 124345662}

            data = {
                "element": name_element,
                "description": f"description of element",
                "type_data": "datatype",
                "data_json": dataset_dict,
            }

            start = datetime.datetime.now()
            requests.request("post", url="myendpoint", json=data)
            end = datetime.datetime.now()
            runtime = end - start
            print("time-post-request:", runtime)

这在本地需要 4 秒,在生产中需要 50 秒。

所以我继续,只测量服务器代码的时间。我的意思是只测量在我的视图中执行的代码。我使用原始 SQL 来实现最佳性能

    start_time = datetime.datetime.now()
    cursor = connection.cursor()
    data_json = json.dumps(request.data["data_json"])
    
    ##......code shortened for clarity

    cursor.execute(
        "INSERT INTO sql_table(data_json) VALUES ('{}')".format(data_json)
    )
    end_time = datetime.datetime.now()
    runtime = end_time - start_time
    
    print("success, time needed", runtime)

    msg = {"detail": "Created successfully"}
    return Response(msg, status=status.HTTP_201_CREATED)

服务器上的此代码需要本地 3 秒,生产仅 2 秒

所以现在我的问题是:这 56 秒去哪儿了?

我推断我可以排除 postgreSQL 设置,因为数据注入似乎工作得相当快。

Nginx 设置可能是一个很好的开始,所以我监控了服务器日志,然后我得到了warn] 28#28: *9388 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000060,

在官方文档中我读到:

如果请求主体大小大于缓冲区大小,则将整个(或部分)请求主体写入临时文件

因此,我假设我浪费了时间,因为 nginx 将请求写入磁盘。我将大小调整request body size为 4GB。我再次运行它,它花费的时间几乎相同(55 秒),但我仍然收到警告......我应该将大小调得更高吗?

还有其他我可以调整的螺丝吗,以提高性能并将创建时间缩短到本地的水平???一般来说,生产服务器不应该比本地开发服务器更快吗???也许是网络连接的问题?

所以我的主要问题是:如何提高性能,以便我可以获得与我的数据创建相当的时间(秒)?

眼镜:

Linux server 
RAM: 16GB 
CPUS: 4

我将发布我的 nginx 设置。我真的不是 nginx 专家,因此,如果能帮助我提高此用例的性能,即使不能解决问题,我也非常感谢。

Nginx的:

worker_processes auto;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}


http {

    ...
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay    on;
    send_timeout       90;
    keepalive_timeout  90;
    fastcgi_read_timeout 120;
    proxy_read_timeout 120;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;
    client_body_timeout 120;
    client_body_buffer_size 4G;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    client_header_timeout 120;
    client_max_body_size 5G;

    reset_timedout_connection on;
    types_hash_max_size 2048;
    server_tokens off;

    gzip  on;
    gzip_static on;
    gzip_min_length 512;

}

若需要更多信息,我会很乐意发布。

相关内容