2009-03-30 42 views
20

Tôi muốn biết khi xây dựng một trang web điển hình trên ngăn xếp LAMP làm cách nào để tối ưu hóa trang web cho thời gian tải tốt nhất có thể. Tôi đang hình dung một trang web hướng DB điển hình.Các phương pháp hay nhất để tối ưu hóa các trang LAMP cho tốc độ?

Đây là giao diện cấp cao và có thể có thể đưa ra câu hỏi và cho phép tôi chia nhỏ nó thành từng lớp của ngăn xếp.

L - Ở cấp độ hệ thống, (thiết lập và hệ thống tệp) bạn có thể thực hiện để cải thiện tốc độ? Một điều tôi có thể nghĩ là kích thước hình ảnh, có thể nén ở đây giúp tối ưu hóa mọi thứ?

A - Phải có rất nhiều cài đặt liên quan đến tốc độ trang web tại đây trong máy chủ web. Không phải Forte của tôi. Có lẽ phụ thuộc rất nhiều vào bao nhiêu trang web đang chạy đồng thời.

M - MySQL trong một cơ sở dữ liệu điều khiển trang web, hiệu suất DB là chìa khóa. Có cách tiếp cận bình thường hóa tốt hơn, bằng cách sử dụng các bảng liên kết? Các nhà phát triển web thường chỉ làm cho các bảng nguyên khối đơn giản giống như 1NF và điều này có thể giết hiệu suất.

P - ngoài các cài đặt tăng hiệu suất như bộ nhớ đệm, người lập trình có thể làm gì để ảnh hưởng đến hiệu suất ở mức cao? Tôi thực sự muốn biết liệu các phương pháp tiếp cận thiết kế MVC có đạt hiệu suất nhanh hơn và nhanh chóng hay không. Các mẹo đơn giản khác như là các phiên nhanh hơn cookie sẽ rất thú vị để biết.

Rõ ràng bạn phải xuống và làm bẩn các chi tiết và tìm mã nào đang làm chậm bạn xuống. Ngoài ra tôi nhận ra rằng nhiều trang web có nhiều đặc tính hiệu suất khác nhau, nhưng chúng ta hãy giả sử một trang web điển hình có nhiều lần đọc hơn sau đó viết.

Tôi chỉ tự hỏi liệu chúng ta có thể biên soạn một loạt các phương pháp hay nhất và mong đợi mọi người liên kết các câu hỏi khác để chúng tôi có thể thực hiện một danh sách kiểm tra hiệu quả.

Mục tiêu của tôi là để xem liệu ngay cả những vấn đề thường gặp trong hoạt động có thể thấy một số điều kỳ quặc mà bạn không nghĩ đến.

Vì vậy, câu hỏi của tôi là, nếu bạn bắt đầu từ đầu, làm cách nào để bạn thực hiện chắc chắn trang web LAMP của bạn nhanh?

Trả lời

33

Dưới đây là một vài điều cần làm cá nhân mà tôi luôn thiết lập trong các ứng dụng LAMP của mình.

  • Cài đặt mod_deflate cho apache và không sử dụng trình xử lý gzip của PHP. mod_deflate sẽ cho phép bạn nén nội dung tĩnh, như javascript/css/static html, cũng như làm đầu ra PHP động thông thường và đó là một điều ít bạn phải lo lắng về mã của bạn.

  • Hãy cẩn thận với các tệp .htaccess! Bật các tệp .htaccess cho các thư mục trong ứng dụng của bạn có nghĩa là Apache phải quét hệ thống tệp liên tục, tìm kiếm .htaccess chỉ thị. Tốt hơn hết là đặt các chỉ thị bên trong cấu hình chính hoặc cấu hình vhost , nơi chúng được tải một lần. Bất cứ lúc nào bạn có thể xóa một tệp truy cập cấp thư mục bằng cách di chuyển vào tệp cấu hình chính, bạn tiết kiệm thời gian truy cập đĩa.

  • Chuẩn bị lớp cơ sở dữ liệu ứng dụng của bạn để sử dụng một trình quản lý kết nối của một số loại (tôi sử dụng một Singleton cho nhất ứng dụng). Nó không phải là rất khó làm, và giảm số của kết nối cơ sở dữ liệu ứng dụng của bạn mở sẽ tiết kiệm tài nguyên.

  • Nếu bạn cho rằng ứng dụng của mình sẽ là , hãy xem tải trọng đáng kể, ghi nhớ có thể thực hiện các phép lạ. Hãy ghi nhớ điều này trong tâm trí trong khi bạn viết mã của mình ... có lẽ một ngày thay vì tạo đối tượng khi đang di chuyển, bạn sẽ nhận được chúng từ memcached. Một chút tầm nhìn xa sẽ làm cho việc thực hiện không đau.

  • Khi ứng dụng của bạn lên và chạy, thiết lập thời gian truy vấn chậm MySQL của một số nhỏ và theo dõi nhật ký truy vấn chậm siêng năng. Điều này sẽ hiển thị cho bạn các yêu cầu truy vấn vấn đề của bạn đến từ, và cho phép bạn tối ưu hóa các truy vấn và chỉ mục trước khi chúng trở thành sự cố.

  • Đối với các loa hiệu suất nghiêm trọng, bạn sẽ muốn biên dịch PHP từ nguồn. Cài đặt từ một gói cài đặt nhiều thư viện mà bạn có thể không bao giờ sử dụng .Vì môi trường PHP được nạp vào mọi phiên bản của một luồng Apache , ngay cả bộ nhớ 5MB trên không từ thư viện bổ sung nhanh chóng trở thành 250MB bộ nhớ bị mất khi có 50 chủ đề Apache trong tồn tại. Tôi giữ một danh sách các tiêu chuẩn của tôi ./configure dòng Tôi sử dụng khi xây dựng PHP here và tôi tìm thấy nó phù hợp với hầu hết các ứng dụng của tôi. Các nhược điểm là nếu bạn kết thúc cần một thư viện, bạn phải biên dịch lại PHP để có được nó. Phân tích mã của bạn và kiểm tra nó trong một môi trường devel để đảm bảo bạn có mọi thứ bạn cần.

  • Giảm bớt Javascript của bạn.

  • Hãy chuẩn bị di chuyển nội dung tĩnh, chẳng hạn như hình ảnh và video, đến máy chủ web không hoạt động . Viết mã số của bạn để bất kỳ URL nào cho hình ảnh và video dễ dàng được định cấu hình để trỏ sang một máy chủ khác trong tương lai. Máy chủ web được tối ưu hóa cho nội dung tĩnh có thể dễ dàng phục vụ hàng chục hoặc thậm chí hàng trăm lần nhanh hơn máy chủ nội dung động động.

Đó là những gì tôi có thể nghĩ ra khỏi đỉnh đầu. Googling xung quanh cho PHP thực hành tốt nhất sẽ tìm thấy rất nhiều lời khuyên về cách viết mã nhanh hơn/tốt hơn là tốt (Chẳng hạn như: echo là nhanh hơn print).

+0

Câu trả lời hay. Cảm ơn bạn. –

+2

+1 nói chung tôi đồng ý, ngoại trừ "gói cài đặt nhiều thư viện mà bạn không bao giờ có thể sử dụng". Không đúng chút nào, trong bất kỳ bản phân phối Linux hiện đại nào, PHP được chia thành php-common, apache2-mod_php, php-cli và một số 30 php-bất cứ điều gì cho mỗi lib. Bạn chỉ cài đặt/kích hoạt những cái bạn cần. – vartec

+0

+1 Câu trả lời hữu ích. Ý tưởng tuyệt vời. –

1

tôi khuyên bạn nên bắt đầu với http://highscalability.com/

Đối với đề xuất của bạn:

nén cho hình ảnh, chắc chắn không. Loại tập tin hệ thống điều chỉnh, có, mà có thể có một số hiệu ứng, nhưng tối thiểu. Nhưng thực sự tốt nhất là sử dụng proxy ngược trong bộ nhớ, hoặc thậm chí là CDN tốt hơn.

Đối với Apache về cơ bản chỉ tải các mô-đun bạn cần. Không tải bất cứ thứ gì khác. Như với PHP bạn chỉ có thể sử dụng MPM forking, điều quan trọng là giữ nó mỏng. Đối với các thiết lập tối ưu, bạn cũng phải tinh chỉnh chúng cho ứng dụng cụ thể, phần cứng, vv Nếu bạn có đủ CPU, bạn nên sử dụng mod_deflate. Nhanh hơn máy chủ có thể gửi dữ liệu cho khách hàng, nhanh hơn nó có thể bắt đầu xử lý yêu cầu tiếp theo.

3

Tôi đã sử dụng MysqlTuner để phân tích hiệu suất trên các máy chủ mysql của tôi và cho nó một cái nhìn sâu sắc vào các vấn đề tốt hơn nữa cho googling, cũng như đưa ra khuyến cáo riêng của mình

2

Đừng quên thực tế là người dùng của bạn sẽ có hàng ngàn dặm từ máy chủ của bạn, và tải hàng chục file để vẽ lại một trang duy nhất. Độ trễ đó và chi phí hiển thị trang trong trình duyệt của họ có thể lớn hơn thời gian bạn dành để thu thập thông tin và tạo trang.

Xem các trang tại Mạng nhà phát triển Yahoo về Best Practices for Speeding Up Your Web SiteYSlow tool để xem phần nào của quá trình tải xuống trang web đang mất thời gian.

2

Đừng quên tắt thời gian chờ cho hệ thống tệp của bạn!

11

Đầu tiên, nhận ra rằng hiệu suất là một quá trình lặp lại. Bạn không xây dựng một ứng dụng web trong một lần, khởi chạy nó và không bao giờ làm việc trên nó một lần nữa. Ngược lại, bạn bắt đầu nhỏ và giải quyết các vấn đề hiệu suất khi trang web của bạn phát triển.

Bây giờ, vào chi tiết cụ thể:

  1. hồ sơ. Xác định các nút cổ chai của bạn. Đây là bước quan trọng nhất. Bạn cần phải tập trung nỗ lực của bạn, nơi bạn sẽ nhận được kết quả tốt nhất. Bạn nên có một số loại giải pháp giám sát tại chỗ (như xương rồng hoặc munin), cho bạn khả năng hiển thị những gì đang xảy ra trên máy chủ của bạn (s)
  2. Bộ nhớ cache, bộ nhớ cache, bộ nhớ cache. Có thể bạn sẽ thấy rằng truy cập cơ sở dữ liệu là nút cổ chai lớn nhất của bạn ở mặt sau - nhưng bạn nên tự mình xác minh điều này. May mắn thay, có thể bạn sẽ thấy rằng rất nhiều lưu lượng truy cập của bạn là dành cho một tập hợp tài nguyên nhỏ. Bạn có thể lưu trữ các tài nguyên đó trong một cái gì đó như memcached, tiết kiệm cho mình cơ sở dữ liệu hit, và dẫn đến hiệu suất phụ trợ tốt hơn.
  3. Như những người khác đã đề cập ở trên, hãy xem các quy tắc về hiệu suất YDN. Cân nhắc chọn số accompanying book. Điều này sẽ giúp bạn có hiệu suất giao diện người dùng
  4. Cài đặt PHP APC và đảm bảo được định cấu hình có đủ bộ nhớ để giữ tất cả mã byte bytecode đã biên dịch của bạn. Gần đây chúng tôi đã phát hiện ra rằng cài đặt APC của chúng tôi không có đủ ram; cho nó đủ để làm việc trong việc giảm thời gian CPU của chúng ta xuống một nửa, và hoạt động của đĩa bằng 10%
  5. Đảm bảo các bảng cơ sở dữ liệu của bạn được lập chỉ mục đúng. Điều này đi đôi với việc theo dõi nhật ký truy vấn chậm.

Ở trên sẽ giúp bạn rất xa. Đó là để nói, ngay cả một trang web khá db-nặng sẽ có thể tồn tại một frontpage digg trên một máy chủ khiêm tốn-spec'd duy nhất nếu bạn đã thực hiện ở trên.

Cuối cùng bạn sẽ đạt đến điểm mà cấu hình apache mặc định sẽ không luôn có thể theo kịp các yêu cầu đến. Khi bạn nhấn vào bức tường này, có hai việc cần làm:

  1. Như trên, hồ sơ. Theo dõi hoạt động apache của bạn - bạn nên có ý tưởng về số lượng kết nối đang hoạt động tại bất kỳ thời điểm cụ thể nào, ngoài số lượng kết nối hoạt động tối đa khi bạn nhận được lưu lượng truy cập đột ngột
  2. Định cấu hình apache với điều này. Đây là hướng dẫn tốt nhất để cấu hình apache tôi đã nhìn thấy: Practical mod_perl chapter 11
  3. Mất nhiều tải của apache như bạn có thể. Nhiệm vụ quá nặng nề của Apache để phục vụ nội dung tĩnh một cách hiệu quả. Bạn nên sử dụng proxy ngược lại có trọng số nhẹ hơn (như mực) hoặc máy chủ web (lighttpd hoặc nginx) để phân phát nội dung tĩnh và đảm nhận công việc của các byte cho ăn bằng thìa để làm chậm khách hàng. Điều này khiến Apache làm điều tốt nhất: thực thi mã của bạn. Một lần nữa, sách mod_perl thực hiện tốt công việc explaining this.

Khi bạn đã nhận được điều này đến nay, nó phần lớn là vấn đề lưu bộ nhớ cache nhiều hơn và theo dõi cơ sở dữ liệu của bạn. Cuối cùng, bạn sẽ outgrow một máy chủ duy nhất. Trước tiên, bạn có thể sẽ thêm nhiều hộp giao diện người dùng, tất cả được hỗ trợ bởi một máy chủ cơ sở dữ liệu duy nhất. Sau đó, bạn sẽ phải bắt đầu lan truyền tải cơ sở dữ liệu của bạn xung quanh, có lẽ bằng cách sharding. Để có tổng quan tuyệt vời về quy trình tăng trưởng này, hãy xem this livejournal presentation

Để có cái nhìn sâu hơn về phần lớn ở trên, hãy xem Building Scalable Web Sites, bởi Cal Henderson, của Flickr nổi tiếng. Google có portions of the book available for preview

2

Tôi khuyên bạn nên sử dụng Jet Profiler for MySQL để tìm bất kỳ truy vấn xấu nào. Tôi đã sử dụng thành công nó trên một vài trang web của tôi. Thực sự hữu ích và dễ tiêu hóa hơn nhật ký truy vấn chậm.

Các vấn đề liên quan