Thứ năm, 14/11/2013 | 00:00 GMT+7

Cách mở rộng Django: Tìm node thắt cổ chai

Django là một nền tảng dựa trên Python tuyệt vời để xây dựng các ứng dụng web hiện đại. Một trong những điểm mạnh lớn nhất của nó là nó giúp các nhà phát triển làm việc nhanh hơn.


Bạn đã xây dựng ứng dụng tuyệt vời của bạn và triển khai nó. Mọi thứ thật tuyệt, nhưng bây giờ bạn đang tải nó lên với lượng dữ liệu lớn hơn và bạn bắt đầu có nhiều người sử dụng nó cùng lúc, nó không nhanh như bạn muốn.

Đó là một vấn đề chung. May mắn là ta có một số công cụ để giúp giảm bớt vấn đề.

Trước tiên, hãy kiểm tra một số vấn đề rõ ràng hơn:

Sử dụng database thực


Trong quá trình phát triển local , thật khó để đánh bại SQLite3. Trừ khi bạn cẩn thận, bạn cũng có thể đang sử dụng nó trên server ảo của bạn .

SQLite3 không mở rộng quy mô cho nhiều user đồng thời như MySQL và PostgreSQL, đặc biệt là đối với các hoạt động thực hiện nhiều hoạt động ghi (nếu bạn đang sử dụng phiên thì bạn đang ghi vào database ).

Nếu bạn đang sử dụng VPS có bộ nhớ thấp, ví dụ như server 512MB, tôi khuyên bạn nên sử dụng MySQL. Nếu bạn có bộ nhớ trống (2GB trở lên), thì tôi khuyên bạn nên xem xét PostgreSQL, vì nó được nhiều nhà phát triển Django ưa thích.

Tắt chế độ gỡ lỗi


Chế độ gỡ lỗi là hoàn toàn cần thiết khi phát triển local , nhưng nó sẽ làm chậm server production của bạn. Xem settings.py của server ảo của bạn và kiểm tra đảm bảo rằng GỠ LỖI được đặt thành Sai. Đồng thời xác nhận TEMPLATE_DEBUG cũng được đặt thành Sai hoặc nó được đặt thành GỬI.

Sử dụng Thanh công cụ gỡ lỗi để ghim các vấn đề về hiệu suất


Trên máy tính phát triển local , không phải server production của bạn, hãy bật Thanh công cụ gỡ lỗi Django để xác định các sự cố cụ thể.

Bạn thực hiện việc này bằng cách cài đặt module django-debug-toolbar và sau đó thêm một mục vào từ điển MIDDLEWARE_CLASSES của bạn như sau:

MIDDLEWARE_CLASSES = (     # ...     'debug_toolbar.middleware.DebugToolbarMiddleware',     # ... ) 

Bạn cũng cần tạo một biến INTERNAL_IPS và thêm địa chỉ IP của bạn . Nếu bạn đang phát triển local , địa chỉ IP của bạn có thể là 127.0.0.1, vì vậy bạn sẽ thêm một dòng như thế này vào settings.py:

INTERNAL_IPS = ('127.0.0.1',) 

Cuối cùng, thêm debug_toolbar làm mục cuối cùng trong INSTALLED_APPS của bạn, như sau:

INSTALLED_APPS = (     # ...     'debug_toolbar', ) 

Tài liệu cài đặt chứa một số tùy chọn cấu hình chi tiết hơn và tùy chọn mà bạn có thể cần xem xét.

Hãy nhớ, đừng vô tình đẩy những thay đổi này sang production ! (Nếu bạn làm điều đó có mục đích thì tốt).

Đến đây bạn sẽ thấy một bảng màu đen xuất hiện ở bên cạnh các trang web khi bạn duyệt xung quanh trang web. Nếu bạn thích số liệu thống kê và số và tất cả các loại chi tiết thú vị, bạn sẽ thích nó. Bạn cũng sẽ nhanh chóng biết lý do tại sao bạn không muốn điều này trên server production của bạn !

<a href= "Signals "> <img src =“ https://assets.digitalocean.com/articles/scale_django/img1.png "> </a>

Sau khi xây dựng nhiều ứng dụng Django, tôi sẽ đề nghị bạn thu hẹp phần SQL của console , vì đó thường là một lĩnh vực đáng quan tâm.

Một lợi ích / vấn đề mà Django có là tải chậm các trường liên quan khi các truy vấn được thực hiện. Điều này nghĩa là Django sẽ không muốn tham gia. Nếu bạn cần các trường liên quan, nó sẽ thực hiện một truy vấn bổ sung mỗi khi cần một trường liên quan.

Nếu bạn cần các trường liên quan, điều này có thể gây ra n + 1 số truy vấn SQL. Ví dụ: giả sử bạn sẽ tạo một version thay thế của Twitter. Bạn tạo một mô hình cho các tweet và mỗi mô hình có liên quan đến mô hình User . Trên trang chủ của bạn , bạn liệt kê 30 tweet mới nhất cùng với tên của user đã tạo chúng. Điều này có thể khiến bạn thực hiện ít nhất 31 truy vấn SQL. Một truy vấn để lấy danh sách các tweet và một truy vấn cho mỗi lần tra cứu tên user .

Giải pháp cho vấn đề này là select_ related . Đây là một sửa đổi rất đơn giản đối với truy vấn khiến Django thực hiện một phép nối khi tìm nạp dữ liệu. Bạn nên sử dụng nó trong bất kỳ tra cứu nào mà bạn biết mình cần các trường liên quan.

Bạn chỉ cần sửa đổi một truy vấn như sau:

Entry.objects.get(id=5) 

trông như thế này:

Entry.objects.select_related().get(id=5) 

Đọc tài liệu về tính năng này và chỉ sử dụng khi cần thiết.

Gói (lại


Theo kinh nghiệm của tôi, các vấn đề trên giải quyết được nhiều vấn đề về hiệu suất ban đầu của nhiều trang web và tất cả đều khá dễ sửa với những thay đổi về mã và cấu hình tối thiểu.

<div class = “author”> Gửi bởi: <a href=osystemhttp://www.bearfruit.org/[> Matthew Nuzum </div>


Tags:

Các tin liên quan