Hồ sơ thời gian Python

Phát triển phần mềm nghiêm túc yêu cầu tối ưu hóa hiệu suất. Khi bạn bắt đầu tối ưu hóa hiệu suất của ứng dụng, bạn không thể không nhìn vào trình cấu hình. Cho dù giám sát các máy chủ sản xuất hay theo dõi tần suất và thời lượng của các cuộc gọi phương thức, trình cấu hình sẽ chạy toàn bộ giao diện. Trong bài viết này, tôi sẽ đề cập đến những kiến ​​thức cơ bản về cách sử dụng trình lược tả Python, chia nhỏ các khái niệm chính và giới thiệu các thư viện và công cụ khác nhau cho từng khái niệm chính trong cấu hình Python

Đầu tiên, tôi sẽ liệt kê từng khái niệm chính trong hồ sơ Python. Sau đó, tôi sẽ chia từng khái niệm chính thành ba phần chính

  • định nghĩa và giải thích
  • các công cụ hoạt động cho các ứng dụng Python chung
  • các công cụ giám sát hiệu suất ứng dụng [APM] phù hợp

Các công cụ APM lý tưởng để lập hồ sơ toàn bộ vòng đời giao dịch cho các ứng dụng web. Hầu hết các công cụ APM có thể không được viết bằng Python, nhưng chúng hoạt động tốt bất kể ứng dụng web của bạn được viết bằng ngôn ngữ nào

Trước khi bắt đầu, hãy lưu ý rằng tôi sẽ chỉ tập trung vào các ví dụ về Python 3 vì 2. 7 dự kiến ​​ngừng hoạt động vào ngày 1 tháng 1 năm 2020. Do đó, các ví dụ về mã trong bài đăng này sẽ sử dụng python3 làm tệp thực thi Python 3. Với cấu trúc đó trong tâm trí, hãy bắt đầu

truy tìm

Chính thức, theo dõi là trường hợp sử dụng đặc biệt của ghi nhật ký để ghi lại thông tin về việc thực thi chương trình. Vì trường hợp sử dụng này rất giống với ghi nhật ký sự kiện nên sự khác biệt giữa ghi nhật ký sự kiện và theo dõi không rõ ràng. Ghi nhật ký sự kiện có xu hướng lý tưởng cho các quản trị viên hệ thống, trong khi các nhà phát triển phần mềm quan tâm nhiều hơn đến việc theo dõi để gỡ lỗi các chương trình phần mềm. Dưới đây là sơ lược để suy nghĩ về việc theo dõi—đó là khi các nhà phát triển phần mềm sử dụng ghi nhật ký để ghi lại thông tin về quá trình thực thi phần mềm. Trong Thư viện chuẩn Python mã nguồn mở, các mô-đun theo dõi và trình xử lý lỗi bao gồm tính năng theo dõi cơ bản

Tùy chọn Python chung. mô-đun theo dõi

Tài liệu Python cho mô-đun theo dõi không nói nhiều, nhưng Mô-đun Python của tuần [PyMOTW] có một mô tả ngắn gọn mà tôi thích. Nó nói rằng dấu vết sẽ “đi theo các câu lệnh Python khi chúng được thực thi. ” Mục đích của mô-đun theo dõi là để “theo dõi những câu lệnh và chức năng nào được thực thi khi chương trình chạy để tạo ra thông tin về phạm vi và biểu đồ cuộc gọi. ” Tôi không muốn đi vào quá nhiều chi tiết với dấu vết, vì vậy tôi sẽ sử dụng một số ví dụ tuyệt vời trong PyMOTW và để bạn tìm hiểu sâu hơn nếu muốn

Sử dụng cùng một mã mẫu trong PyMOTW

from recurse import recurse

def main[]:
print 'This is the main program.'
recurse[2]
return

print 'recurse[%s]' % level

if level:
recurse[level-1]
return

def not_called[]:
print 'This function is never called.'

if __name__ == '__main__':
main[]

def recurse[level]:

Bạn có thể làm một số điều với dấu vết

  • Tạo một báo cáo về mức độ phù hợp của mã để xem những dòng nào được chạy hoặc bỏ qua [python3 -m trace –count trace_example/main. py]
  • Báo cáo về mối quan hệ giữa các hàm gọi một hàm khác [python3 -m trace –listfuncs trace_example/main. py. grep -v nhập khẩu]
  • Theo dõi hàm nào là hàm gọi [python3 -m trace –listfuncs –trackcalls trace_example/main. py. grep -v nhập khẩu]

Bạn có thể tìm hiểu thêm chi tiết tại tài liệu Mô-đun Python của Tuần

Tùy chọn Python chung. mô-đun xử lý lỗi

Ngược lại, trình xử lý lỗi có tài liệu về Python tốt hơn một chút. Nó tuyên bố rằng mục đích của nó là kết xuất truy nguyên Python một cách rõ ràng do lỗi, sau khi hết thời gian chờ hoặc do tín hiệu của người dùng. Nó cũng hoạt động tốt với các trình xử lý lỗi hệ thống khác như Apport hoặc trình xử lý lỗi Windows. Cả mô-đun trình xử lý lỗi và theo dõi đều cung cấp nhiều khả năng theo dõi hơn và có thể giúp bạn gỡ lỗi mã Python của mình. Để biết thêm số liệu thống kê hồ sơ, hãy xem phần tiếp theo

Nếu bạn là người mới bắt đầu theo dõi, tôi khuyên bạn nên bắt đầu đơn giản với dấu vết

Tùy chọn APM mã nguồn mở

Đối với các tùy chọn APM, có các công cụ như Jaeger và Zipkin. Mặc dù chúng không được viết bằng Python, nhưng chúng hoạt động tốt cho các ứng dụng web và phân tán. Jaeger chính thức hỗ trợ Python, là một phần của Cloud Native Computing Foundation và có tài liệu triển khai mở rộng hơn. Vì những lý do này, tôi khuyên bạn nên bắt đầu với Jaeger nếu bạn muốn theo dõi các yêu cầu trong một kiến ​​trúc web phân tán. Nếu nó không phù hợp với nhu cầu theo dõi của bạn trong một hệ thống phân tán, thì bạn có thể xem Zipkin

Tôi nên lập hồ sơ cho phần nào của mã?

Bây giờ hãy đi sâu vào chi tiết cụ thể về hồ sơ. Thuật ngữ "lập hồ sơ" chủ yếu được sử dụng để kiểm tra hiệu suất và mục đích của kiểm tra hiệu suất là tìm ra các nút cổ chai bằng cách thực hiện phân tích sâu. Vì vậy, bạn có thể sử dụng các công cụ theo dõi để giúp bạn lập hồ sơ. Nhớ lại rằng theo dõi là khi các nhà phát triển phần mềm ghi lại thông tin về việc thực thi phần mềm. Do đó, ghi nhật ký chỉ số hiệu suất cũng là một cách để thực hiện phân tích hồ sơ

Nhưng chúng tôi không bị hạn chế truy tìm. Khi việc lập hồ sơ thu hút được sự quan tâm trong cộng đồng, giờ đây chúng tôi có các công cụ thực hiện việc lập hồ sơ trực tiếp. Bây giờ câu hỏi đặt ra là chúng ta lập hồ sơ cho những phần nào của phần mềm [đo lường các chỉ số hiệu suất của phần mềm]?

Thông thường, chúng tôi hồ sơ

  • Phương thức hoặc chức năng [phổ biến nhất]
  • Dòng [tương tự như lập hồ sơ phương pháp, nhưng thực hiện từng dòng một]
  • Bộ nhớ [sử dụng bộ nhớ]

Trước khi tôi đi sâu vào từng vấn đề này và cung cấp các tùy chọn Python và APM chung, hãy khám phá những số liệu nào sẽ sử dụng để lập hồ sơ và bản thân các kỹ thuật lập hồ sơ

Tôi nên lập hồ sơ những số liệu nào?

Tốc độ [thời gian]

Thông thường, một điều chúng tôi muốn đo lường khi định hình là lượng thời gian dành cho việc thực hiện từng phương thức. Khi chúng tôi sử dụng công cụ lập hồ sơ phương pháp như  [có sẵn bằng ngôn ngữ Python], chỉ số thời gian cho phương pháp có thể hiển thị cho bạn số liệu thống kê, chẳng hạn như số lượng lệnh gọi [được hiển thị dưới dạng ncalls], tổng thời gian dành cho hàm [tottime], . Các chỉ số thời gian cụ thể có thể khác nhau giữa các công cụ, nhưng nhìn chung, bạn có thể mong đợi điều gì đó tương tự như lựa chọn chỉ số thời gian của cProfile trong các công cụ tương tự

Cuộc gọi [tần suất]

Một số liệu khác cần xem xét khi định hình là số lượng lệnh gọi được thực hiện trên phương thức. Nếu một phương thức có tốc độ chấp nhận được nhưng thường xuyên được gọi đến mức nó trở thành một khoảng thời gian khổng lồ, bạn sẽ muốn biết điều này từ trình hồ sơ của mình. Ví dụ: cProfile làm nổi bật số lượng lệnh gọi hàm và bao nhiêu trong số đó là lệnh gọi gốc

Phương pháp và hồ sơ dòng

Hầu hết các hướng dẫn lập hồ sơ sẽ cho bạn biết cách theo dõi số liệu thời gian của phương pháp. Đó cũng là những gì tôi khuyên bạn nên bắt đầu, đặc biệt nếu bạn là người mới bắt đầu lập hồ sơ

Lập hồ sơ theo dòng, như tên cho thấy, có nghĩa là lập hồ sơ từng dòng mã Python của bạn. Các số liệu phổ biến nhất được sử dụng để định hình dòng là số liệu thời gian. Hãy nghĩ về nó tương tự như cấu hình phương pháp, nhưng chi tiết hơn. Nếu bạn là người mới bắt đầu, trước tiên hãy bắt đầu với các phương pháp lập hồ sơ. Khi bạn cảm thấy thoải mái với các phương pháp lập hồ sơ và bạn cần lập hồ sơ cho các dòng, thì hãy tiếp tục như vậy

Tùy chọn Python chung. mô-đun cProfile và hồ sơ

Cả và  là các mô-đun có sẵn trong ngôn ngữ Python 3. Các số do các mô-đun này tạo ra có thể được định dạng thành các báo cáo thông qua mô-đun

Đây là

import cProfile
import re

cProfile.run['re.compile["foo|bar"]']

197 function calls [192 primitive calls] in 0.002 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno[function]
1 0.000 0.000 0.001 0.001 :1[]
1 0.000 0.000 0.001 0.001 re.py:212[compile]
1 0.000 0.000 0.001 0.001 re.py:268[_compile]
1 0.000 0.000 0.000 0.000 sre_compile.py:172[_compile_charset]
1 0.000 0.000 0.000 0.000 sre_compile.py:201[_optimize_charset]
4 0.000 0.000 0.000 0.000 sre_compile.py:25[_identityfunction]
3/1 0.000 0.000 0.000 0.000 sre_compile.py:33[_compile]

Như bạn có thể thấy, các chỉ số thời gian khác nhau được đề cập trong Hồ sơ theo Tốc độ [Thời gian] [chẳng hạn như ncalls và tottime] cũng có trong ví dụ này về cProfile. Mô-đun hồ sơ cho kết quả tương tự với các lệnh tương tự. Thông thường, bạn chuyển sang cấu hình nếu không có cProfile

tùy chọn APM

Hầu hết các công cụ APM đều là những công cụ giám sát khá đầy đủ. Họ thường sẽ cung cấp hồ sơ dòng và phương pháp. Số liệu thời gian là công dân hạng nhất trong các công cụ này. Tôi sẽ không liệt kê các công cụ ở đây vì hầu như tất cả sẽ có các tính năng này

hồ sơ bộ nhớ

Một thành phần phổ biến khác để cấu hình là việc sử dụng bộ nhớ. Mục đích là để tìm rò rỉ bộ nhớ và tối ưu hóa việc sử dụng bộ nhớ trong các chương trình Python của bạn. Xét về các tùy chọn chung của Python, các công cụ được đề xuất nhiều nhất để lập hồ sơ bộ nhớ cho Python 3 là thư viện pympler và objgraph

Tùy chọn Python chung. thư viện pympler

Pympler's  cung cấp thêm thông tin chi tiết. Bạn có thể sử dụng pympler để

  • xác định lượng bộ nhớ mà các đối tượng Python cụ thể tiêu thụ,
  • xác định xem các đối tượng có bị rò rỉ ra khỏi phạm vi hay không và
  • theo dõi thời gian tồn tại của các đối tượng của các lớp nhất định

Tài liệu sẽ cung cấp cho bạn các ví dụ rõ ràng. Ở đây, tôi muốn làm nổi bật một ví dụ mà tôi thấy hữu ích nhất—theo dõi thời gian tồn tại của các đối tượng cho các lớp

>>> from pympler import classtracker
>>> tr = classtracker.ClassTracker[]
>>> tr.track_class[Document]
>>> tr.create_snapshot[]
>>> create_documents[]
>>> tr.create_snapshot[]
>>> tr.stats.print_summary[]
active 1.42 MB average pct
Document 1000 195.38 KB 200 B 13%

Ví dụ này cho thấy tổng dung lượng bộ nhớ đo được là 1. 42 MB, với 1.000 nút hoạt động có kích thước trung bình 200B. Có nhiều hướng dẫn trong tài liệu pympler, bao gồm một hướng dẫn để theo dõi việc sử dụng bộ nhớ trong Django với thanh công cụ Gỡ lỗi Django

Tùy chọn Python chung. thư viện objgraph

Theo người tạo ra nó, mục đích của objgraph là giúp tìm rò rỉ bộ nhớ. Như Marius Gedminas đã nói: “Ý tưởng là chọn một đối tượng không nên có trong bộ nhớ và sau đó xem tham chiếu nào đang giữ cho đối tượng đó tồn tại. ”

Tôi muốn nói rằng Marius nhấn mạnh việc làm cho hình ảnh trong objgraph tốt hơn so với các công cụ định hình bộ nhớ khác. Và đó là sức mạnh của nó. Marius một lần , nhưng tôi sẽ không sao chép nó ở đây do hạn chế về dung lượng

tùy chọn APM

Không có công cụ APM nào chuyên về lập hồ sơ bộ nhớ

Hồ sơ xác định so với hồ sơ thống kê

Khi chúng tôi lập hồ sơ, điều đó có nghĩa là chúng tôi cần theo dõi quá trình thực thi. Bản thân điều đó có thể ảnh hưởng đến phần mềm cơ bản đang được theo dõi. Chúng tôi theo dõi tất cả các cuộc gọi chức năng và các sự kiện ngoại lệ hoặc chúng tôi sử dụng lấy mẫu ngẫu nhiên và suy ra các số. Cái trước được gọi là lập hồ sơ xác định và cái sau là lập hồ sơ thống kê. Tất nhiên, phương pháp nào cũng có ưu nhược điểm của nó. Hồ sơ xác định có thể có độ chính xác cao, nhưng chi phí bổ sung của nó có thể ảnh hưởng đến độ chính xác của nó. Hồ sơ thống kê có ít chi phí hơn so với, với nhược điểm là độ chính xác thấp hơn

cProfile, mà tôi đã đề cập trước đó, sử dụng hồ sơ xác định. Hãy xem xét một trình cấu hình Python mã nguồn mở khác sử dụng cấu hình thống kê. dụng cụ kim

Trình hồ sơ Python chung. dụng cụ kim

Pyinstrument khác biệt với các trình lập hồ sơ điển hình khác theo hai cách. Đầu tiên, nó nhấn mạnh rằng nó. Nó lập luận rằng mặc dù hồ sơ xác định có thể mang lại cho bạn độ chính xác cao hơn so với hồ sơ thống kê, nhưng độ chính xác bổ sung đòi hỏi nhiều chi phí hơn. Các chi phí phát sinh thêm có thể ảnh hưởng đến độ chính xác và dẫn đến tối ưu sai phần của chương trình. Cụ thể, nó tuyên bố rằng việc sử dụng cấu hình xác định có nghĩa là “mã tạo ra nhiều lệnh gọi hàm Python sẽ gọi trình cấu hình rất nhiều, khiến nó chậm hơn. ” Đây là cách kết quả bị bóp méo và phần sai của chương trình được tối ưu hóa

Thứ hai, pyinstrument tự tạo sự khác biệt bằng cách là "bản ghi toàn ngăn xếp. ” Hãy so sánh nó với cProfile. cProfile thường đo lường một danh sách các hàm và sau đó sắp xếp chúng theo thời gian dành cho mỗi hàm. Ngược lại, Pyinstrument được thiết kế sao cho nó sẽ theo dõi, chẳng hạn như lý do mà mọi chức năng đơn lẻ được gọi trong một yêu cầu web—do đó, tính năng ghi lại toàn bộ ngăn xếp. Điều này làm cho pyinstrument lý tưởng cho các khung web Python phổ biến như Flask và Django. Và ghi âm toàn bộ ngăn xếp chính xác là khái niệm cuối cùng tôi sẽ trình bày

Ghi toàn bộ ngăn xếp

Có thể cho rằng, tất cả các công cụ APM khác nhau trên thị trường đều có tính năng ghi toàn bộ. Ý tưởng đằng sau việc ghi toàn ngăn xếp là, khi một yêu cầu tiến triển qua từng lớp trong ngăn xếp, chúng tôi muốn xem nút cổ chai trong hiệu suất xảy ra ở tầng nào của ngăn xếp. Tất nhiên, đôi khi sự chậm chạp có thể xảy ra bên ngoài tập lệnh Python của bạn

Trước đó, tôi đã đề cập đến tùy chọn trình lược tả mã nguồn mở Python. dụng cụ kim. Ở đây, tôi sẽ đề cập đến các tùy chọn APM nổi tiếng khác

tùy chọn APM

Bạn có thể chia các tùy chọn APM thành hai loại

  • Mã nguồn mở APM và dành riêng cho Python
  • APM được lưu trữ và dành riêng cho Python

Đối với APM nguồn mở dành riêng cho Python, bạn có thể xem APM đàn hồi. Các tùy chọn APM được lưu trữ dành riêng cho Python bao gồm New Relic, AppDynamics và Scout. Các tùy chọn APM được lưu trữ tương tự như Truy xuất riêng của Stackify. Tuy nhiên, Retrace là cửa hàng một cửa, thay thế một số công cụ khác và chỉ tính phí theo mức sử dụng. Ngoài việc định hình mã ứng dụng của bạn, các công cụ này còn theo dõi yêu cầu web của bạn. Bạn có thể xem yêu cầu web của mình tiêu tốn thời gian như thế nào thông qua ngăn xếp công nghệ, bao gồm các truy vấn cơ sở dữ liệu và yêu cầu máy chủ web. Điều này làm cho các tùy chọn này trở nên tuyệt vời dưới dạng công cụ lập hồ sơ, nếu bạn có ứng dụng web hoặc ứng dụng phân tán

phần thưởng. người xem hồ sơ

Nói một cách chính xác, người xem hồ sơ không phải là người lập hồ sơ, nhưng họ có thể giúp biến số liệu thống kê hồ sơ của bạn thành một màn hình hiển thị đẹp mắt hơn. Một ví dụ là SnakeViz, là một trình xem đồ họa dựa trên trình duyệt cho đầu ra của mô-đun Python. Một điều tôi thích ở SnakeViz là nó cung cấp sơ đồ sunburst, như bên dưới

Một tùy chọn khác để hiển thị số liệu thống kê tốt hơn từ số liệu thống kê cProfile của bạn là cá ngừ. Tuna xử lý thời gian chạy và nhập cấu hình, đồng thời sử dụng D3 và Bootstrap làm công nghệ cơ bản để hiển thị

Phần kết luận

Tôi đã trình bày tất cả các khái niệm chính, chạy từ theo dõi đến trình xem hồ sơ, trong lĩnh vực lập hồ sơ Python. Vì vậy, hãy sử dụng bài đăng này để chọn cấp độ và lĩnh vực lập hồ sơ bạn muốn thực hiện. Tôi khuyên bạn nên bắt đầu với quy mô nhỏ và dễ dàng, nếu bạn chưa từng lập hồ sơ trước đây. Khi bạn đã hiểu rõ về nó, bạn có thể thử nghiệm với công cụ phức tạp hơn. Chúc may mắn tối ưu hóa

Chủ Đề