IT Blog

Kiến thức Odoo

Tổng quan về hiệu suất (Perfomance) trong Odoo 16

Trong bài trước, mình đã thực hiện hướng dẫn cài đặt Odoo 16 trên Ubuntu 22.04 (LTS). Bài viết hôm nay, chúng ta sẽ cùng tìm hiểu tổng quan về hiệu suất (performance) trong Odoo 16.

Như chúng ta đã biết, con người có thể nhìn thấy 35 khung hình cho mỗi giây, tức là 30 mili giây cho mỗi khung hình và một cái chớp mắt là 150 mili giây. Vậy có nghĩa là, Odoo cần phải vẽ một khung hình lên màn hình trình duyệt web trong vòng 30 mili giây và hoàn tất hiển thị trong vòng chưa đấy 150 mili giây.

Để có thể đạt được mức độ hiệu quả đó, Odoo 16 đã thực hiện cản thiệt toàn bộ hiệu năng các layer có trong stack của mình. Bắt đầu với Hosting & Hardware, sau đó là đến Server Famework Python, tiếp theo là Business Features. Cuối cùng mọi thứ được truyền tải đến Web Client  trong vòng chưa tới 150 mili giây.

Odoo 16 tương thích với PostgressSQL 14.

hinh1

Chúng ta hãy cùng xem xét những gì Odoo 16 đã làm được. Trước tiên bắt đầu từ Web Client:

1.Web Client

web-client

  • Thiết kế lại thư viện JavaScript để hiển thị DOM ảo (virtual DOM), hay còn gọi là BlockDOM.
  • Nâng cấp OWL Framework lên version 2. Tất cả JavaScript Component đã được convert sang OWL 2:
    • Ở Odoo 15:
      • 70%  JS cho Widget.
      • 30% JS cho OWL 1.
    • Ở Odoo 16:
      • 99% JS cho OWL 2.
      • 1% JS cho Odoo Studio.
    • Số lượng dòng code giảm 30%.
    • Tốc độ nhanh hơn khoảng 2 lần đến 20 lần (tùy thuộc vào chế độ xem).
  • Dọn dẹp lại CSS bằng cách giảm sổ lượng các quy tắc CSS để trình duyệt có thể hiển thị nhanh hơn ( khoảng 50%).
    • Nâng cấp Bootstrap từ 4 lên 5.1.3 cho cả giao diện fontend và backend.
    • Merged CSS bản Community và Enterprise
    • Rút lại khoảng 68% số lượng các quy tắc CSS.
  • Giảm bớt sự phụ thuộc vào JavaScript.
  • Chuyển đổi từ bootstrap 4.3 sang bootstrap 5.

Cải tiến khác:

  • Cấu trúc lại hoàn toàn chatter để cải thiện hiệu suất. Chuyển từ Long Polling sang Web Socket.

2.Network

  • Giảm số lượng HTTP Calls cho một truy vấn.
    • Fontend:
      • Hợp nhất lệnh và giao diện người dùng.
        • 1 CSS và 1 JS để tải bất kỳ trang nào.
      • Loại bỏ các truy vấn không sử dụng.
    • Backend, khi tải bộ điều khiển /web. Odoo đã thực hiện việc giảm số lượng truy vấn HTTP:
      • Odoo 15: 15 HTTP
      • Odoo 16: 9 HTTP
      • Giảm 60%
  • Kích thước của 1 view giảm trung bình 35%.
  • Giảm sự phụ thuộc vào các Worker.

 

3. Business Apps

Chuyển từ phương thức onchange sang phương thức compute.

Ví dụ: tạo 50 hóa đơn với 50 dòng cho mỗi hóa đơn. onchange: 79.5s, compute: 19.44s -> nhanh hơn gấp 4 lần!

Computed Fields:

  • Chỉ thực hiện một phép tính.
  • Làm việc trong Python module và JS client.
  • Hoàn toàn phụ thuộc vào graph.
  • Thể hiện một business logic.
  • Tách các khái niệm kinh doanh.
onchange() method:

  • Có thể dẫn đến nhiều phép tính.
  • Chỉ làm việc trong JS client.
  • Không phụ thuộc graph: đệ quy.
  • Logic giao diện, không business logic.
  • Khái niệm kinh doanh được tổng hợp.

 

precompute=True: Các trường được tính toán (Computed Fields) sẽ được đánh giá trước hàm create() để tránh các giá trị mặc định và các truy vấn SQL bổ sung.

  • Cho phép tính toán thay thế mặc định.
  • Cho phép mặc định có điều kiện mà không cần phải ghi đè hàm create().
  •  precompute=False
    • INSERT
    • compute()
    • UPDATE
  •  precompute=TRUE
    • compute
    • INSERT

 

4. Python Server

Các trường biên dịch (Translated Fields)

  • Thay vì lưu trữ bản dịch trong một table riêng biệt, Odoo 16 lưu trữ các bản dịch trên bản ghi dưới dạng dữ liệu JSONB. Điều này làm cho việc truy xuất dữ liệu trong Posgress SQL nhanh hơn.

 

  • So sánh hiệu suất, thời gian (mili giây) cho mỗi hoạt động:
    • read(): nhanh hơn 5 lần (2 lần cho các Database lớn).
    • read() XML: nhanh hơn 7,4 lần.
    • search(): nhanh hơn rất nhiều với PosgressSQL ilike.
    • update(): yêu cầu ít flushing / SQL hơn.
  • Nhược điểm: Cài đặt một ngôn ngữ mới sẽ chậm hơn gấp 2 lần. Nhưng đó chỉ là lúc cài đặt cơ sở dữ liệu vì Odoo 16 phải cập nhật rất nhiều bản ghi thay vì chỉ bảng ir.translation.

 

Fragment Caching

  • Đây là một phương pháp để lưu vào bộ nhớ đệm dữ liệu trong Odoo.
  • Bằng cách thêm trường t-cahe=”True” trên một số khu vực trong html file. Odoo sẽ cho người dùng biết khu vực nào của hệ thống người dùng muốn cache.
  • Người dùng cũng có thể tạo ra những bộ nhớ cache khác nhau và một số bộ nhớ cache có thể có một số từ khóa như (t-cache=”products,pricelist”)
  • Nhờ vậy, Odoo không cần phải tính toán bất cứ thứ gì chỉ để hiển thị nội dung lên trang web.

Một vài thông số nổi bật về tốc độ tải trang:

  • Shop:
    • Odoo 15: khoảng 100ms
    • Odoo 16: khoảng 25ms
  • Elearning:
    • Odoo 15: khoảng 60ms
    • Odoo 16: khoảng 20ms
  • Event:
    • Odoo 15: khoảng 55ms
    • Odoo 16: khoảng 25ms

Như vậy, với Fragment Caching, tốc độ tải các trang đã nhanh hơn rất nhiều trên Odoo 16.

 

Indexes Optimization (Tối ưu hóa chỉ mục)

  • Odoo 15: chỉ mục có sẵn
    • index=True(=btree)
  • Odoo 16: chỉ mục có sẵn
    • index=”btree”
    • index=”btree_not_null”
    • index=”trigram”
    • index=True(=btree)

 

View & Menus

  • Thời gian load View nhanh gấp 6 lần.

 

Sessions

Chỉ được lưu trữ nếu các giá trị mặc định thay đổi.

  • Odoo 15: Tạo và lưu trữ session:
    • 30 triệu session trong 117 Gb
  • Odoo 16: Chỉ tạo session khi cần và không lưu trữ session, điều này giúp giảm việc lưu trữ session xuống:
    • 200 nghìn session trong 0.8 Gb

 

5. Hardware & Hosting

Odoo Online:

  • Nâng cấp hàng trăm máy chủ.
  • Chuyển đổi từ HTTP 1/1 lên HTTP 2.0

 

6. Tổng quan:

Odoo 16:

  • Mở một Invoice: Tốc độ nhanh hơn 3,7 lần.
    • Odoo 15: 552ms
    • Odoo 16: 150ms
  • Website: Truy vấn SQL ít hơn 2,4 lần.
  • eCommerce: Nhanh hơn 3,9 lần.

 

7. Bảng so sánh truy vấn giữa Odoo 15 và Odoo 16.

Odoo 15:

 

Odoo 16:

 

Kết luận:

Như vậy chúng ta đã điểm qua được một số thay đổi về hiệu năng của Odoo 16. OneIT hy vọng bài viết này sẽ hữu ích đến các bạn, cũng như mong nhận được sự phản hồi, góp ý từ các bạn. Trân thành cảm ơn!

Leave a Reply

Your email address will not be published. Required fields are marked *