Tái cấu trúc Wordpress để cải thiện hiệu năng bộ nhớ [đã đóng]


63

Tôi đã có một cái nhìn cận cảnh về mức tiêu thụ bộ nhớ Wordpress. Trên trang web của tôi, dường như với mỗi trang, 20 MB RAM được phân bổ, chỉ để chuẩn bị môi trường thoải mái cho tất cả các plugin chạy. Tôi đã vẽ nó như vậy:

Không có điểm duy nhất để tối ưu hóa, không có kẻ xấu nào ăn hầu hết bộ nhớ. Tiêu thụ là tất cả trải rộng trên nhiều nhiều mô-đun php.

Làm cách nào chúng ta có thể khiến Wordpress khởi tạo môi trường của nó trong bộ nhớ chỉ một lần và sau đó sử dụng lại nhiều lần cho mỗi lần nhấn? Tôi không muốn PHP chậm ăn 20 MB mỗi lần nhấp chuột của người dùng - ngay cả trên một máy chủ có nhiều bộ nhớ, phải mất vài giây để hoàn thành công việc. Về cơ bản, bạn sẽ cần các đoạn bộ nhớ chỉ đọc có thể được sử dụng lại.

Ngoài ra ... tại sao 20MB? Bất cứ ai có thể cung cấp cái nhìn sâu sắc về điều này?

Chỉnh sửa: Đây là đầu ra WinCacheGrind trên Wordpress đang chạy trên máy phát triển của tôi (nhanh hơn rất nhiều so với lưu trữ được chia sẻ). Như bạn có thể thấy, phải mất một giây giòn giã chỉ để tạo HTML của trang chính. Làm chậm nó xuống bằng cách chia sẻ lưu trữ và bạn có một công thức cho rắc rối. Tôi chọn phương pháp mất phần lớn thời gian. Làm thế nào bạn sẽ đi về tối ưu hóa điều này?

Chỉnh sửa: Dưới đây là số liệu thống kê truy vấn từ công cụ định hình hàm.php tuyệt vời này .

Tải: 12 truy vấn - 532ms - 19.1MB - 43 lần truy cập bộ đệm / 53
Truy vấn: 15 truy vấn - 563ms - 19.0MB - 72 lần truy cập bộ đệm / 86
Hiển thị: 21 truy vấn - 705ms - 19,2MB - 234 lần truy cập bộ nhớ cache / 257

Chỉnh sửa: Bạn có muốn thấy một cái gì đó được đảm bảo để làm bạn hoảng sợ? Chèn các dòng này vào cuối index.php:


echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";

Tôi đã cố gắng đếm bao nhiêu lần cơ thể của bài hiện tại được lưu trữ trong bộ nhớ. Tôi đếm được 20 trường hợp. Sau đó, tôi nhận ra rằng PHP có tính năng tham chiếu, vì vậy số lượng bản sao giảm xuống chỉ còn ba: hai dường như trong WP_Query, một trong bộ đệm của đối tượng. Tôi đang điều tra thêm.

Đây là lý do tại sao tôi nghĩ rằng WordPress cần tái cấu trúc nhắm mục tiêu các vấn đề bộ nhớ. Bạn không còn có thể đổ lỗi cho việc tiêu thụ bộ nhớ của nó về sự phức tạp tuyệt đối của những gì nó làm. Nó chỉ đơn giản là làm một loạt những điều sai .

Chỉnh sửa: Sau một ngày cố gắng để tìm ra điều này, đây là những phát hiện của tôi:

1) 88% của tất cả bộ nhớ đến từ yêu cầu hoặc bao gồm hoặc bao gồm loại cuộc gọi:

2) Tệp php bao gồm hầu hết xảy ra trong phần đầu tiên của việc phục vụ một yêu cầu (không đáng ngạc nhiên), đó cũng là nơi tất cả bộ nhớ bị ăn hết:

3) Khá thú vị khi vẽ tất cả các chức năng đang được thực hiện trong khi thực hiện một yêu cầu. Tổng cộng có hơn 12000 cuộc gọi. Tôi đã xáo trộn chúng để làm cho nó rõ hơn (trục Cấp cơ bản là độ sâu của ngăn xếp):

4) Cách duy nhất mà tôi có thể nghĩ đến là giảm thiểu số lượng tệp .php đi kèm. Nếu tôi phân chia các chức năng cho mỗi tệp mà chúng xuất phát, bạn có thể thấy rằng nhiều tệp được nhấn nhiều nhất một hoặc hai lần. Chúng ta cần một cách để bỏ qua những thứ đó khi chúng không cần thiết. Ví dụ, plugin sao lưu cơ sở dữ liệu từ xa của tôi được tải và đăng ký, hoàn toàn không bao giờ được sử dụng. Dưới đây là âm mưu chia ở trên theo tên tệp:

Tôi đang cung cấp một tiền thưởng xứng đáng với tất cả danh tiếng của tôi :) cho các phép tái cấu trúc sẽ dẫn đến việc cắt giảm 30% dung lượng bộ nhớ blog của tôi.

Chỉnh sửa: Tôi đã cài đặt WP 3.1, đây là so sánh với phiên bản cũ.

Màu xanh là WP 3.1, màu đỏ là 3.0.4. WP mới nhanh hơn, nhưng cũng ăn nhiều bộ nhớ hơn.

Đây là một danh sách bao gồm tập tin.

Điều này cho tôi nhận ra "Bộ nhớ SEO All In One" đã ăn bao nhiêu bộ nhớ - một cách duy nhất là chỉ sử dụng một phần nhỏ chức năng của plugin để có được những gì tôi muốn. Ngoài ra, các plugin của riêng tôi có vẻ khá tệ.

Tôi muốn thử tải có điều kiện vào ví dụ bình luận.php (Tôi không cho phép nhận xét trên blog của mình) và một số người khác. Tôi đã xóa tất cả các mã không dùng nữa. Tôi đã cắt bớt kodes.php để chỉ tải các bảng toàn cầu của nó theo yêu cầu. Tôi đã đơn giản hóa l10n (tôi không bản địa hóa), làm cho các hàm của nó trả về chuỗi ngay lập tức mà không cần tra cứu. Tôi vẫn còn cách xa mốc 30% mà tôi tự ý thiết lập.

Chỉnh sửa: Tôi đã tải xuống và kích hoạt APC với cài đặt mặc định (bộ nhớ cache opcode 32 MB). Đây là so sánh:

Bạn có thể thấy rằng việc tải mã được tăng tốc ồ ạt và mã cũng chiếm ít không gian hơn trong bộ nhớ (có lẽ vì chúng ta chỉ xử lý các opcodes chứ không phải nguồn gốc). Tiêu thụ bộ nhớ tuy nhiên vẫn còn khá cao.


Bạn có thể tải lên tập tin cacheegrind ở đâu đó không? Chỉ cần lưu ý tôi không nhớ nếu có bất cứ điều gì đáng để giữ riêng tư được bao gồm trong đó, nếu là - thì đừng.
Hết


1
hm, tôi đồng ý với kết luận của bạn - không có gì thực sự nhảy ra, yêu cầu được sửa chữa. Tôi đã bỏ hồ sơ mới vào ngăn xếp thử nghiệm cục bộ của mình (3.1, MS, Twenty Ten, dữ liệu Kiểm tra đơn vị chủ đề) và nhận được 1,5 giây (hầu hết sự khác biệt dường như là do menu tùy chỉnh - điều này rất chậm). Vì vậy, tôi đoán không có gì để sửa = nghiên cứu bộ nhớ đệm.
Rarst

@Rarst Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. Tôi nghĩ rằng có những thứ cần khắc phục, nhưng nó sẽ yêu cầu thay đổi kiến ​​trúc của Wordpress thành một số triết lý hoàn toàn khác, và đó là quá nhiều công việc.
Roman Zenka

Câu trả lời:


25

Không đáng để gặp rắc rối. WordPress không ăn nhiều bộ nhớ chỉ vì. Nó ăn rất nhiều bộ nhớ vì nó chạy rất nhiều chức năng dưới mui xe.

Sẽ dễ dàng và hiệu quả hơn rất nhiều khi kết quả bộ đệm (trang được tạo) với plugin bộ đệm tĩnh và phục vụ điều đó. Bằng cách đó, hầu hết khách truy cập thậm chí sẽ không nhấn WP.


2
Tôi đã sử dụng bộ đệm, nhưng tôi vẫn có một vài trang thực sự năng động (ví dụ: giỏ hàng). Và khi các ngôi sao không được phân bổ chính xác, người dùng có thể đợi trong 20 giây - nghĩa là, được cấp, trên GoDaddy, nhưng ngay cả khi không, tôi nghĩ rằng ít nhất sẽ là ~ 3 giây. Tôi chỉ đơn giản là không thể cung cấp loại trải nghiệm thực sự thú vị mà mọi người đã sử dụng từ Google.
Roman Zenka

8
@Roman Zenka nếu bạn có nhu cầu hiệu suất cụ thể thì tốt hơn bạn nên tìm kiếm các giải pháp cụ thể, thay vì hy vọng rằng chính WordPress sẽ trở nên siêu nhanh và nhẹ về tài nguyên. Điều đầu tiên tôi khuyên bạn nên xem xét là bộ đệm opcode và bộ đệm tĩnh phân mảnh ... Nhưng trước đó, bạn cần phải chuẩn hóa cái quái đó và xác định không chỉ bộ nhớ sẽ đi đâu, mà còn cả thời gian. WordPress là môi trường, không phải là một nút cổ chai. Nút cổ chai là trong những gì bạn làm cho nó làm.
Hết

@Rarst Tôi thực sự đã đánh giá mức độ sử dụng CPU và tôi không thể chỉ tay vào bất kỳ vị trí cụ thể nào gây ra sự cố. Tương tự như bộ nhớ - nó dường như được lan truyền khắp nơi. Tuy nhiên, việc đo điểm chuẩn của tôi có thể không được thực hiện theo cách tối ưu - tôi sử dụng trình tạo hồ sơ XDebug và bộ nhớ đệm - ví dụ, rất khó để trêu chọc độ trễ do các cuộc gọi cơ sở dữ liệu. Tôi rất biết ơn về con trỏ đến các kỹ thuật định hình tốt hơn.
Roman Zenka

Ảnh chụp màn hình @Rarst Profiling đã được thêm vào.
Roman Zenka

4
Nó cũng có thể là máy chủ của GoDaddy bị chậm. Họ được biết đến vì không có phần cứng lớn nhất và " thà trả tiền cho quảng cáo trên truyền hình hơn là nâng cấp máy chủ của họ "
Zack

23

Và đây là lý do tại sao tôi nghĩ rằng WordPress đang rất cần viết lại. Bạn không còn có thể đổ lỗi cho việc tiêu thụ bộ nhớ của nó về sự phức tạp tuyệt đối của những gì nó làm. Nó chỉ đơn giản là làm những điều sai trái.

Thật là một kết luận ngây thơ. Đọc Những điều bạn không bao giờ nên làm, Phần I .

Cảm ơn cho các lô sử dụng bộ nhớ, mặc dù.

Chỉnh sửa sau này: Autommatic đã phát hành một thư viện có tên prefork dường như làm những gì bạn yêu cầu: chỉ tải mã WordPress trong RAM một lần.


Đúng là ngây thơ. Có lẽ tôi nên nói "refactor" thay vì "viết lại", thì nó có vẻ tốt hơn nhiều. Đăng cập nhật.
Roman Zenka

2
Ok, nếu bạn có đề xuất cụ thể (đặc biệt là các bản vá), rất mong bạn đăng chúng trên trac: core.trac.wordpress.org
scribu

Tôi đang làm việc trên nó ngay bây giờ. Tôi đang cố gắng vẽ sơ đồ các đối tượng trong bộ nhớ, vì vậy tôi có thể thấy mức độ được sử dụng bởi những gì. Có một công cụ sẽ lấy một bộ nhớ và vẽ nó không?
Roman Zenka

5
@ fouu - +1 cho liên kết đến bài đăng của Joel!
MikeSchinkel

1
Ok, hãy nhớ rằng WP_Object_Cache có thể được thay thế bằng triển khai memcached, v.v.
scribu

17

Bắt đầu với WordPress 3.2, PHP 5.2 sẽ là yêu cầu tối thiểu. Tôi nghĩ với điều đó dưới vành đai của chúng tôi, các bit của lõi có thể bắt đầu được cấu trúc lại và sử dụng các lớp với tính năng tự động tải. Điều này sẽ cho phép chúng tôi tránh tải một số đoạn mã trừ khi chúng thực sự cần thiết. Ví dụ: nếu không có nhúng hoặc phòng trưng bày trong chế độ xem trang, chúng tôi có thể tránh tải nhiều mã phương tiện.

Tuy nhiên, ngay cả khi họ quyết định đi theo con đường đó, tôi sẽ hy vọng đó là một sự tiến hóa chậm (giống như nhiều thay đổi khác đã xảy ra). Nó sẽ yêu cầu xáo trộn xung quanh vị trí của rất nhiều tệp và mã, có thể phá vỡ compat ngược cho một số plugin.

Một phần của vấn đề (nếu nó thực sự có thể được gọi là vậy) là nếu không có loại tải có điều kiện đó, khung cốt lõi không thể biết trước chức năng nào nó sẽ cần hoặc không cần để tạo chế độ xem nội dung. Vì vậy, rất nhiều chức năng phải được tải lên trong trường hợp cần thiết.


@Dougal Campbell Tôi đã bắt đầu trả tiền cho câu hỏi này, để xem liệu chúng tôi có thể hack ít nhất một phiên bản WordPress này đủ tệ để cải thiện ít nhất 30% mức tiêu thụ bộ nhớ hay không, tương đối không đau. Nó có thể truyền cảm hứng cho một số sự phát triển trong tương lai.
Roman Zenka

Tải có điều kiện, trong khi có khả năng làm giảm sự kết hợp bộ nhớ, làm tổn thương tốc độ khi bộ nhớ đệm opcode có liên quan. Chúng ta có xu hướng ủng hộ tốc độ.
scribu

Thêm suy nghĩ về tải tự động: stackoverflow.com/questions/4788452/ từ
scribu

@ fouu Khi bạn nói "tải có điều kiện", bạn đang nói về tự động tải, hoặc thực sự tải mã dựa trên một điều kiện? Bao nhiêu nó làm tổn thương tốc độ?
Roman Zenka

1
Cảm ơn bạn! Như tôi đã nói, tôi không biết liệu lõi WP có bao giờ đi theo con đường đó không (yêu cầu tái cấu trúc có thể quá cực đoan). Nhưng tôi rất ấn tượng với nỗ lực của bạn khi phân tích điều này và các biểu đồ bạn tạo ra. Hãy tiếp tục phát huy!
Dougal Campbell

16

Làm cách nào chúng ta có thể khiến Wordpress khởi tạo môi trường của nó trong bộ nhớ chỉ một lần và sau đó sử dụng lại nhiều lần cho mỗi lần nhấn?

Nó được gọi là opcode-cacheing.

http://en.wikipedia.org/wiki/PHP_accelerator


1
Tôi sẽ thử APC và xem điều gì sẽ xảy ra. Khi ban đầu tôi hỏi câu hỏi đó, tôi có ý nghĩa nhiều hơn là chỉ lưu vào bộ đệm ẩn - tôi có nghĩa là sử dụng lại toàn bộ môi trường mà WordPress xây dựng - mã + dữ liệu. Memcached sẽ giúp bạn lấy dữ liệu nhanh hơn, nhưng bạn vẫn sẽ nhân bản dữ liệu trong bộ nhớ máy chủ. Bây giờ có vẻ như bộ nhớ đệm opcode có khả năng sẽ chiếm ~ 90% tổng lượng tiêu thụ bộ nhớ.
Roman Zenka

Nếu bạn có tài nguyên cho một số thử nghiệm, bạn cũng có thể thử thiết lập môi trường FastCGI. Tôi rất quan tâm đến một số so sánh giữa mod_php và chạy trong FastCGI.
Dougal Campbell

5

bạn có thể sẽ không quản lý để giảm việc sử dụng ram nhiều như vậy. Nhưng nếu bạn đang sử dụng mod_php, bạn có thể muốn chuyển sang mod_fcgidthay thế.

trong khi mod_php chậm hơn một chút, nó tải php ngay cả khi không cần, chẳng hạn như phục vụ hình ảnh, tệp tĩnh hoặc thậm chí lưu vào bộ đệm. Nếu bạn có nhiều yêu cầu, đây là rất nhiều ram.

sử dụng fcgid sẽ giảm điều này rất nhiều.

Ngoài ra, sử dụng bộ đệm tĩnh (như bộ đệm w3total) sẽ tránh gọi php hoàn toàn là một lợi thế thực sự: sử dụng ít ram hơn, ít kết nối db hơn.


4

Hà. Bây giờ tôi đang làm việc trên một ứng dụng web mà tôi hoàn toàn có ý định quá tải dữ liệu và việc sử dụng vượt quá những gì tài khoản lưu trữ chia sẻ của tôi có thể xử lý, vì vậy tôi đã quyết định - trong khi nó rất dễ để xây dựng trong WP - để thử làm việc từ BackPress như một khung và chỉ xây dựng những gì tôi cần cho các trường hợp sử dụng cụ thể của mình.

Vì vậy, tôi đã có thể giảm môi trường cốt lõi của mình từ hàng trăm tệp PHP trong WP xuống chỉ còn hai mươi hoặc tôi thực sự cần, trong khi vẫn có thể tận dụng tất cả db, HTTP, quản lý người dùng, định dạng và cron các chức năng mà tôi yêu thích trong WordPress.

Vấn đề là rất nhiều công việc, và tôi sẽ không bao giờ tin vào hackjob của mình cho bất cứ điều gì ngoài việc sử dụng cá nhân của riêng tôi. Nếu bạn muốn sử dụng môi trường WP đầy đủ, hãy sử dụng nó. Nó tốt như nó là bởi vì hàng trăm nhà phát triển tinh chỉnh nó trong nhiều năm. Giống như mọi người ở đây đã nói, bạn sẽ nhận được nhiều hơn nữa bằng cách tìm một kế hoạch lưu trữ tốt hơn và nghiên cứu các kỹ thuật lưu trữ hơn là bạn có thể có được bằng cách hack lõi.


1
Tôi đồng ý rằng WP đã được tinh chỉnh trong một thời gian dài. Nhưng tôi không nghĩ rằng nó đã được tinh chỉnh để hoạt động trên lưu trữ crappy, với một hỗn hợp bổ sung cụ thể. Tôi tò mò muốn xem tôi có thể đẩy nó bao xa. Ngay cả khi những thay đổi không biến nó thành cốt lõi, thật tốt khi có một cách hack tài liệu cốt lõi nếu bạn nghĩ rằng bạn phải làm.
Roman Zenka

3

Có, WordPress tải lên mọi thứ trước và sau đó thực hiện những gì chúng tôi yêu cầu. Tôi có thể nhớ lại ở đâu đó rằng chúng ta có thể tạo một nhóm ảo trong RAM nơi chúng ta có thể đặt các tệp. Tôi đã có ý tưởng đưa toàn bộ WordPress vào bộ nhớ (<10MB) và sau đó chúng ta có thể tiết kiệm rất nhiều I / O mà chỉ một mình sẽ tăng tốc độ. Nhưng tôi chưa bao giờ có cơ hội để thử nó và hơn nữa tôi không thực sự thành thạo trong việc theo đuổi thứ gì đó như thế. Nhưng nó có vẻ đáng thử.


Và tôi đồng ý với Rarst để sử dụng plugin bộ nhớ cache tĩnh để không xử lý được. Nhưng điều đó có thể được sử dụng với các động lực tốt quá. :)
Ashfame

Tối thích ý tưởng đó. Tôi không chắc chắn bao nhiêu vấn đề này là do độ trễ I / O và bao nhiêu là do PHP từ từ nhai dữ liệu. Bạn có biết một cách để nói?
Roman Zenka

Xin lỗi nó chỉ là một ý tưởng trong đầu của tôi. Có thể nó không ảnh hưởng đến hiệu suất của những gì có vẻ như dữ liệu thường được đọc từ đĩa cứng dưới dạng khối, vì vậy rất nhiều dữ liệu khác có thể đã được tìm nạp. Tôi không chắc chắn lắm.
Ashfame

3

một vài gợi ý cơ bản:

  1. w3 tổng bộ đệm cache cho bộ nhớ đệm ..
  2. cài đặt và kích hoạt memcache, cũng kích hoạt từ cài đặt bộ đệm tổng w3 (bộ đệm opcode cũng là một tùy chọn tốt nhưng nó không hoạt động tốt với plugin tổng bộ đệm w3)
  3. giảm thiểu các truy vấn để liên kết trực tiếp trong các tập tin chủ đề ..
  4. Vô hiệu hóa tất cả các plugin không sử dụng thêm và loại bỏ.
  5. tối ưu hóa cơ sở dữ liệu.

Tôi đang điều hành một trang web wordpress nổi tiếng với lưu lượng truy cập lớn hàng ngày .. tôi thậm chí không tận tâm, làm rất tốt cho tôi :)

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.