Những phần nào của lớp mô hình có thể được bỏ qua vì lợi ích của tối ưu hóa hiệu suất


28

Tôi hiện đang thấy rằng đối với bảng cơ sở dữ liệu có lược đồ rất đơn giản (khoảng 5 trường), nó sẽ chèn các bản ghi mới với tốc độ chỉ dưới ~ 50 lần chèn / giây, trong môi trường phát triển cục bộ của tôi (ổ SSD) - đây là với không có người quan sát trên mô hình dân cư liên quan đến bảng.

Sử dụng SQL trực tiếp Tôi thấy khá cải thiện - ~ 1800 lần chèn / giây. Chúng tôi đang suy nghĩ về việc cố gắng tối ưu hóa hiệu suất của các mô hình của mình, nhưng tất nhiên chúng tôi không muốn mất tất cả sự ổn định và linh hoạt tốt đẹp mà lõi Magento mang lại cho chúng tôi.

Tôi đang tự hỏi liệu ai đó đã đi theo con đường này trước đây và liệu có một số chiến thắng dễ dàng về các thành phần của lớp mô hình có thể được bỏ qua tương đối an toàn sẽ giúp tăng hiệu suất đáng kể.

Những thứ như:

  • Phân giải tên lớp
  • trước và sau khi lưu sự kiện
  • Công văn sự kiện
  • Giao dịch
  • v.v.

CẬP NHẬT: Tôi đã nói dối, thực sự có một số truy vấn bổ sung bắn ra từ người quan sát hoặc afterSave (), mà tôi đã thấy khi tôi kiểm tra nhật ký truy vấn cơ sở dữ liệu. Điểm chuẩn đối với một thực thể hoàn toàn đơn giản thực sự mang lại cho tôi ~ 300 hàng / giây với các mô hình Magento - chỉ có chi phí hoạt động của MySQL là giao dịch.


1
Bạn đã thử sử dụng lại đối tượng mô hình để ghi dữ liệu chưa? Tức là xóa nó, setData và sau đó lưu lại. Điều này sẽ tránh các lệnh gọi getModel và chi phí khởi tạo đối tượng vốn có của PHP.
davidalger

Ngoài ra, tôi sẽ đoán rằng nút cổ chai ở đây nằm trong CPU của bạn chứ không phải ổ đĩa ... vì tất cả các tệp mã cần thiết sẽ được tải trong lần đầu tiên đi qua.
davidalger

Cảm ơn, David! Tôi cũng sẽ thử nó. Trên thực tế tôi nghĩ rằng chúng ta vẫn còn I / O bị ràng buộc bởi số lượng truy vấn đang được thực hiện. Chúng tôi có khoảng 20 truy vấn đang chạy cho một mô hình nhất định - một số truy vấn chúng tôi cần giữ (điền vào các bảng được liên kết, CHỌN để kiểm tra sự tồn tại trước khi lưu) và các truy vấn khác mà chúng tôi có thể xóa (lưu phiên ngoài, tải thêm () Có thể tránh được trong logic ứng dụng)
kalenjordan

Bạn có thể dễ dàng tìm ra. Gắn toàn bộ thư mục gốc và DB DB trên đĩa RAM. Nhưng tôi rất nghi ngờ I / O là một vấn đề trong thiết bị cấp máy chủ. Bạn có thể sẽ thấy nhiều lợi ích hơn chỉ đơn giản là vô hiệu hóa "Chỉ mục khi lưu".
Ben Lessani - Sonassi

Câu trả lời:


17

Một điều có thể tăng tốc toàn bộ trang web là xóa tất cả các tham chiếu đến Varien_Profilertrên trang web sản xuất của bạn. Ngay cả khi trình lược tả bị vô hiệu hóa, nó luôn kiểm tra xem nó có được bật hay không để mọi cuộc gọi đến Varien_Profiler::sẽ dẫn đến một ifcâu lệnh bổ sung . Tất nhiên, loại bỏ tất cả các cuộc gọi này đi kèm với chi phí không thể sử dụng trình hồ sơ nữa. Tuy nhiên, điều này có thể tăng tốc toàn bộ trang web khoảng 5% hoặc hơn (đây là một sự háo hức chủ quan, nhưng có NHIỀU cuộc gọi đến Varien_Profilerkhắp Magento). Tôi thực sự đã viết một tập lệnh shell nhỏ để tự động nhận xét các cuộc gọi này trong tất cả các tệp và tôi sẽ thêm nó vào bài viết của mình vào ngày mai khi tôi đang làm việc và chuẩn bị sẵn mã.

Như đã hứa bây giờ mã để nhận xét các cuộc gọi này:

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

Điều này nên được chạy trong bảng điều khiển linux cả trong ứng dụng / cũng như trong thư mục lib /. Bạn có thể cần điều chỉnh tệp /lib/Varien/Profiler.php theo cách thủ công sau đó. Cũng lưu ý rằng bạn nên kiểm tra kỹ điều này trong một môi trường an toàn trước khi phát trực tiếp - nhưng tôi đoán điều này là hiển nhiên;)


Ồ Tôi sẽ không bao giờ tưởng tượng bất cứ điều gì thậm chí gần 5% chỉ cho các cuộc gọi Varien_Profiler khi bị vô hiệu hóa. Tôi sẽ kiểm tra xem, cảm ơn!
kalenjordan

@sparcksoft Như đã hứa, tôi đã thêm mã bây giờ.
mpaepper

1
Đó là nơi điều kiện tiền biên dịch C thực sự tốt đẹp. Thật tệ khi PHP không có chúng, nhưng tất nhiên, điều đó có nghĩa là nó sẽ phải có phương thức biên dịch trước và bộ nhớ đệm tích hợp sẵn. :)
davidalger

2
Bạn cũng có thể viết nó find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;nếu bạn thích một oneliner nhanh.
kojiro

14

Khi thực hiện nhiều tiết kiệm trên các mô hình Magento, tốt nhất là vô hiệu hóa bộ chỉ mục Magento làm chậm quá trình:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

Và kích hoạt nó khi bạn hoàn thành:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

Ah gotcha, tốt đẹp. Vì vậy, sẽ như thế nào nếu bạn đang lưu rất nhiều hồ sơ của khách hàng và muốn tránh việc lập chỉ mục của khách hàng xảy ra cho mỗi lần lưu? Trong trường hợp của tôi, tôi thực sự đang làm điều này chống lại một thực thể tùy chỉnh không có bất kỳ lập chỉ mục nào - ít nhất là đối với điểm chuẩn tôi đã làm. Chúng tôi cũng có một số chỉ mục tùy chỉnh mà tôi có thể sẽ sử dụng mẹo này!
kalenjordan

Tôi không nghĩ có bất kỳ khách hàng nào lập chỉ mục nhưng nó chắc chắn sẽ giúp bạn khi sửa đổi nhiều sản phẩm và những thứ tương tự. Dù bằng cách nào thì nó cũng đáng để thử!
Rick Kuipers

Xin lỗi, có dữ liệu sản phẩm EAV và ví dụ như vậy. Cảm ơn.
kalenjordan

Chào! Bạn có thể phải (một phần) reindex sau đó?
Alex

@Alex Có, các bộ chỉ mục được đặt lại thành MODE_REAL_TIME để nó sẽ giới thiệu lại theo lịch trình. Tất nhiên, bạn có thể buộc nó nếu bạn muốn.
Rick Kuipers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.