2009-03-06 43 views
9

Ứ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.

+0

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? –

+0

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. –

+0

Có thể đến #pocoo trên freenode, và chúng ta có thể trò chuyện về nó? –

Trả lời

10

Armin đề xuất biên dịch trước các mẫu Jinja2 thành mã python và sử dụng các mẫu được biên dịch trong sản xuất. Vì vậy, tôi đã thực hiện một trình biên dịch/loader cho điều đó, và nó bây giờ ám một số mẫu phức tạp nhanh hơn 13 lần, ném đi tất cả chi phí phân tích cú pháp. Thảo luận liên quan với liên kết đến kho lưu trữ là here.

+0

Cảm ơn, Rodrigo, đó là chính xác những gì tôi đã được tìm kiếm. :) – zgoda

+0

Hầu hết các liên kết trên đó không còn giá trị. Bạn có thể vui lòng chia sẻ kho lưu trữ không? – Bugs

4

OK, con người, đây là những gì tôi có ngày hôm nay trên #pocoo:

[20:59] Zgoda: hello, tôi muốn biết nếu tôi có thể tối ưu hóa quá trình tạo môi trường jinja2 của tôi, vấn đề - >Optimizing Jinja2 Environment creation

[21:00] Zgoda: tôi có sản lượng hồ sơ từ "lạnh" ứng dụng ->http://paste.pocoo.org/show/107009/

[21:01] Zgoda: và cho "nóng" ->

[21 : 02] zgoda: Tôi tự hỏi nếu tôi có thể hạ thấp phần nào chi phí CPU của việc tạo ra môi trường cho các yêu cầu "lạnh"

[21:05] Mitsuhiko: Zgoda: đưa việc tạo env thành một mô-đun mà bạn nhập

[21:05] Mitsuhiko: như

[ 21:05] mitsuhiko: từ việc gây quỹ.utils nhập khẩu env

[21:05] Zgoda: nó đã có

[21:06] Mitsuhiko: hmm

[21:06] Mitsuhiko: tôi nghĩ rằng vấn đề là các mẫu được tái -compiled từng truy cập

[21:06] Mitsuhiko: may gae là đáng kinh ngạc có hạn, tôi không biết nếu có nhiêu là tôi có thể làm hiện

[21:07] Zgoda: tôi đã cố gắng với jinja bytecache nhưng nó không hoạt động trên prod (trên máy chủ dev)

[21:08] Mitsuhiko: tôi biết

[21:08] Mitsuhiko: appengine không có soái

[21:12] Zgoda: Mitsuhiko: cảm ơn bạn

[21 : 13] zgoda: tôi đã hy vọng tôi đang làm điều gì đó sai và điều này có thể được tối ưu hóa ...

[21:13] mitsuhiko: zgoda: bản phát hành tiếp theo sẽ được hỗ trợ appengine cải tiến, nhưng tôi không chắc chắn nhưng cách triển khai bộ nhớ đệm được cải tiến cho ae

Có vẻ Armin nhận thức được vấn đề với bộ nhớ đệm bytecode trên AppEngine và có một số kế hoạch cải thiện Jinja2 để cho phép lưu vào bộ nhớ đệm trên GAE. Tôi hy vọng mọi thứ sẽ tốt hơn theo thời gian.

+0

Chắc chắn có được một cách để làm cho nó tải ít nhất là gần như nhanh chóng như được xây dựng trong thư viện mẫu django, trừ khi họ cung cấp cho một số loại đặc quyền tải trước đặc biệt cho nó ... – gravitation

+0

Sau đó trên IRC Armin cho biết ông có một số ý tưởng như thế nào để cải thiện mọi thứ trên GAE. Có một số hy vọng. :) – zgoda

+0

Peterh đã tạo một bài đăng có thể hữu ích: http://groups.google.com/group/google-appengine/msg/cf207d882941cf8d – gravitation

2

Theo điều này google recipe bạn có thể sử dụng memcache để bộ nhớ cache bytecodes. Bạn cũng có thể tự lưu trữ nội dung tệp mẫu. Tất cả trong cùng một công thức

+0

nguyên soái không khả dụng trên công cụ ứng dụng của google, do đó một phần của công thức sẽ không hoạt động. Tôi đang di chuyển ứng dụng của mình sang jinja. Sẽ báo cáo nó như thế nào đi – bustrofedon