Ứng dụng của tôi đang chạy trên Google App Engine và hầu hết các yêu cầu liên tục nhận được cờ vàng do sử dụng CPU cao. Sử dụng profiler Tôi theo dõi vấn đề xuống đến thói quen tạo ví dụ jinja2.Environment
.Tối ưu hóa Jinja2 Tạo môi trường
tôi là tạo ra các ví dụ ở cấp module:
from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))
Do chế độ hoạt động AppEngine Google (CGI), mã này có thể chạy trên mỗi và mọi yêu cầu (cache cho module nhập khẩu của họ dường như bộ nhớ cache mô-đun cho giây thay vì cho phút).
Tôi đã suy nghĩ về việc lưu trữ cá thể môi trường trong memcache, nhưng có vẻ như không thể chọn được. Ví dụ FileSystemLoader
dường như có thể được lưu trữ và có thể được lưu vào bộ nhớ cache, nhưng tôi không quan sát thấy bất kỳ cải tiến đáng kể nào trong việc sử dụng CPU với phương pháp này.
Bất kỳ ai cũng có thể đề xuất cách giảm chi phí tạo ví dụ jinja2.Environment
?
Chỉnh sửa: dưới đây là (có liên quan) một phần của đầu ra profiler.
222172 function calls (215262 primitive calls) in 8.695 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
33 1.073 0.033 1.083 0.033 {google3.apphosting.runtime._apphosting_runtime___python__apiproxy.Wait}
438/111 0.944 0.002 2.009 0.018 /base/python_dist/lib/python2.5/sre_parse.py:385(_parse)
4218 0.655 0.000 1.002 0.000 /base/python_dist/lib/python2.5/pickle.py:1166(load_long_binput)
1 0.611 0.611 0.679 0.679 /base/data/home/apps/with-the-flow/1.331879498764931274/jinja2/environment.py:10()
Một cuộc gọi, nhưng tôi có thể thấy (và điều này nhất quán trên tất cả các ứng dụng dựa trên GAE), đắt nhất trong toàn bộ chu trình xử lý yêu cầu.
Phần nào của cuộc gọi Môi trường gây ra sự đau đớn? chúng ta có thể xem thông tin tiểu sử không? –
Cảm ơn thông tin hồ sơ, nó không thực sự làm sáng tỏ (ngoài 4000 cuộc gọi đến dưa!). Tôi nghĩ rằng tôi sẽ cần phải nhìn thấy toàn bộ điều. –
Có thể đến #pocoo trên freenode, và chúng ta có thể trò chuyện về nó? –