我正在运行一个 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;
}
若需要更多信息,我会很乐意发布。