2010-03-24 14 views
5

Đây là giao dịch. Chúng tôi đã thực hiện đường html tĩnh hoàn chỉnh để giải quyết các vấn đề về hiệu suất, nhưng vì trang web sẽ có phần động, điều này sẽ không hiệu quả đối với chúng tôi. Thay vào đó, chúng tôi đã nghĩ đến việc sử dụng memcache + eAccelerator để tăng tốc độ PHP và chăm sóc bộ nhớ đệm cho dữ liệu được sử dụng nhiều nhất.Kết hợp các phương pháp bộ nhớ cache - memcache/disk based

Dưới đây là hai cách tiếp cận của chúng tôi mà chúng tôi đã nghĩ đến ngay bây giờ:

  • Sử dụng memcache trên >> tất cả < < truy vấn lớn và để lại nó một mình để làm những gì họ làm tốt nhất.

  • Ghi nhớ Usinc cho dữ liệu được truy xuất phổ biến nhất và kết hợp với bộ nhớ cache được lưu trữ trong ổ cứng chuẩn để sử dụng thêm.

Ưu điểm chính của việc sử dụng memcache tất nhiên là hiệu suất, nhưng khi người dùng tăng, việc sử dụng bộ nhớ trở nên nặng. Kết hợp hai âm thanh như một cách tiếp cận tự nhiên hơn cho chúng ta, mặc dù sự thỏa hiệp về mặt lý thuyết trong hiệu suất. Memcached dường như có một số tính năng sao chép có sẵn là tốt, mà có thể đến tiện dụng khi đó là thời gian để tăng các nút.

Chúng tôi nên sử dụng phương pháp nào? - Thật ngu ngốc khi thỏa hiệp và kết hợp hai phương pháp? Chúng ta có nên tập trung vào việc sử dụng memcache và thay vào đó tập trung vào việc nâng cấp bộ nhớ khi tải tăng lên với số lượng người dùng?

Cảm ơn rất nhiều!

Trả lời

4

Làm phức tạp và kết hợp hai phương pháp này là một cách rất thông minh, tôi nghĩ vậy.

Quy tắc quản lý bộ nhớ cache rõ ràng nhất là độ trễ v.s. quy tắc kích thước, được sử dụng trong CPU được lưu trữ. Trong bộ nhớ cache đa cấp, mỗi cấp độ tiếp theo sẽ có kích thước lớn hơn để bù lại độ trễ cao hơn. Chúng tôi có độ trễ cao hơn nhưng tỷ lệ truy cập bộ nhớ cache cao hơn. Vì vậy, tôi đã không khuyên bạn nên đặt bộ nhớ cache dựa trên đĩa trước memcache. Thay vào đó nó nên được đặt phía sau memcache. Ngoại lệ duy nhất là nếu bạn lưu trữ thư mục cache trong bộ nhớ (tmpfs). Trong trường hợp này, bộ nhớ đệm dựa trên tệp có thể bù đắp tải cao trên memcache và cũng có thể có lợi nhuận trễ (vì địa phương dữ liệu).

Hai kho này (tệp dựa trên, memcache) không chỉ là các bộ lưu trữ thuận tiện cho bộ nhớ cache. Bạn cũng có thể sử dụng hầu như bất kỳ cơ sở dữ liệu KV nào vì chúng rất tốt trong việc kiểm soát đồng thời.

Vô hiệu hóa bộ nhớ cache là câu hỏi riêng biệt có thể thu hút sự chú ý của bạn. Có một số thủ thuật bạn có thể sử dụng để cung cấp cập nhật bộ nhớ cache tinh tế hơn trên bộ nhớ cache bị mất. Một trong số đó là dự đoán hiệu ứng đống chó. Nếu một số chủ đề đồng thời nhận được bộ nhớ cache bỏ lỡ đồng thời tất cả trong số họ đi đến phụ trợ (cơ sở dữ liệu). Ứng dụng sẽ chỉ cho phép một trong số chúng tiếp tục và phần còn lại của chúng nên đợi trong bộ nhớ cache. Thứ hai là cập nhật bộ nhớ cache nền. Thật tuyệt khi cập nhật bộ nhớ cache không phải trong chuỗi yêu cầu web mà ở chế độ nền. Trong nền bạn có thể kiểm soát mức độ tương tranh và thời gian chờ cập nhật thêm một cách duyên dáng.

Thực tế, có một phương pháp tuyệt vời cho phép bạn theo dõi bộ nhớ cache dựa trên thẻ (ví dụ: memcached-tag). Nó rất đơn giản dưới mui xe. Với mỗi mục nhập bộ nhớ cache, bạn lưu một vectơ các phiên bản thẻ mà nó thuộc về (ví dụ: {directory#5: 1, user#8: 2}). Khi bạn đọc dòng bộ nhớ cache, bạn cũng đọc tất cả các số vectơ thực tế từ memcached (điều này có thể được thực hiện hiệu quả với multiget). Nếu ít nhất một phiên bản thẻ thực tế lớn hơn phiên bản thẻ được lưu trong dòng bộ nhớ cache thì bộ nhớ cache bị vô hiệu. Và khi bạn thay đổi các đối tượng (ví dụ thư mục) phiên bản thẻ thích hợp sẽ được tăng lên. Đó là phương pháp rất đơn giản và mạnh mẽ, nhưng có những bất lợi riêng của nó, mặc dù. Trong lược đồ này, bạn không thể thực hiện hiệu lực bộ nhớ cache hiệu quả. Memcached có thể dễ dàng bỏ các mục nhập trực tiếp và giữ các mục cũ.

Và tất nhiên bạn nên nhớ: "Chỉ có hai điều khó khăn trong Khoa học Máy tính: không hợp lệ bộ nhớ cache và đặt tên cho mọi thứ" - Phil Karlton.

+0

Hi Dotsid, những suy nghĩ thực sự thú vị mà bạn có. Rất được đánh giá cao! Bạn có nói rằng nó nên được xếp lớp theo cách dữ liệu được yêu cầu đi qua lớp đệm đầu tiên, là memcache và nếu dữ liệu trong memcache không hợp lệ, lớp bộ nhớ cache tiếp theo là dựa trên ổ cứng, nếu nó không hợp lệ nữa sẽ mở ra một kết nối đến cơ sở dữ liệu và lấy dữ liệu mà người dùng đã yêu cầu? – Industrial

+1

Vâng. Tôi cũng được thêm vào để trả lời một số suy nghĩ về tính hiệu lực của bộ nhớ cache. –

+0

Xin chào lại! Câu hỏi - bạn đề xuất phương pháp nào để theo dõi các khóa trong ứng dụng? Ý tôi là, không có cách nào rõ ràng để "gắn thẻ" một khóa trong memcache với nguồn gốc của nó? Sẽ siêu ngọt để có thể thực hiện việc này và vô hiệu hóa tất cả dữ liệu bộ nhớ cache liên quan đến một hoặc nhiều "danh mục", "cha mẹ" hoặc bất kỳ thứ gì có thể được sắp xếp tùy theo ứng dụng ... – Industrial

2

Tôi khuyên bạn nên sử dụng memcache trước tiên cho tất cả các truy vấn chính. Sau đó, kiểm tra để tìm các truy vấn ít được sử dụng nhất hoặc dữ liệu hiếm khi được thay đổi và sau đó cung cấp bộ nhớ cache cho việc này.

Nếu bạn có thể tách dữ liệu chung khỏi dữ liệu hiếm khi được sử dụng, bạn có thể tập trung vào việc cải thiện hiệu suất trên dữ liệu thường được sử dụng hơn.

+0

@AKRamkumar Cảm ơn sự giúp đỡ của bạn! Đó là một góc thú vị cho vấn đề này. – Industrial

1

Bạn có thể ủy quyền kết hợp bộ nhớ cache đĩa/bộ nhớ với hệ điều hành (nếu hệ điều hành của bạn đủ thông minh). Đối với Solaris, bạn thậm chí có thể thêm lớp SSD ở giữa; công nghệ này được gọi là L2ARC.

Tôi khuyên bạn nên đọc phần này để bắt đầu: http://blogs.oracle.com/brendan/entry/test.

+0

Xin chào! Có vẻ như ngay bây giờ, chúng tôi sẽ sử dụng CentOS. Tôi sẽ kiểm tra Solaris, nhưng đó sẽ là một điều hoàn toàn mới để học hỏi. Tôi không chắc liệu chúng ta có thể hy sinh phần đó để bắt đầu lại từ đầu với việc học bắt đầu và lên từ hệ điều hành .... Cảm ơn rất nhiều vì sự giúp đỡ của bạn. Bạn có biết hệ điều hành khác: es có hỗ trợ tính năng này không? – Industrial

+1

Vâng, đó là sự lựa chọn của bạn ... nhưng nó có thể rẻ hơn/nhanh hơn để chỉ sử dụng Solaris và nhận được bộ nhớ đệm miễn phí. Và bạn sẽ nhận được ZFS mà có lẽ là fs tốt nhất hiện nay. Thật không may, tôi không nhận thức được bất cứ điều gì tương tự cho Linux. – mindas

3

Memcached là một hệ thống có khả năng mở rộng. Ví dụ, bạn có thể tái tạo bộ nhớ cache để giảm thời gian truy cập cho các nhóm khóa nhất định hoặc thực hiện thuật toán Ketama cho phép bạn thêm/xóa các cá thể Memcached khỏi nhóm mà không cần sửa lại tất cả các khóa. Bằng cách này, bạn có thể dễ dàng thêm các máy mới dành riêng cho Memcached khi bạn có thêm bộ nhớ. Hơn nữa, như thể hiện của nó có thể chạy với các kích cỡ khác nhau, bạn có thể ném lên một thể hiện bằng cách thêm nhiều RAM hơn vào một máy cũ. Nói chung, cách tiếp cận này kinh tế hơn và ở một mức độ nào đó không thua kém mức đầu tiên, đặc biệt là đối với các yêu cầu multiget(). Về hiệu suất giảm với sự tăng trưởng dữ liệu, thời gian chạy của các thuật toán được sử dụng trong Memcached không thay đổi theo kích cỡ của dữ liệu, và do đó thời gian truy cập chỉ phụ thuộc vào số lượng yêu cầu đồng thời. Cuối cùng, nếu bạn muốn điều chỉnh ưu tiên bộ nhớ/hiệu suất của mình, bạn có thể đặt thời gian hết hạn và các giá trị cấu hình bộ nhớ sẵn có sẽ sử dụng RAM nghiêm ngặt hoặc tăng lượt truy cập bộ nhớ cache.

Đồng thời, khi bạn sử dụng đĩa cứng, hệ thống tệp có thể trở thành nút cổ chai của ứng dụng của bạn. Bên cạnh độ trễ I/O chung, những thứ như phân mảnh và các thư mục khổng lồ có thể ảnh hưởng đáng kể đến tốc độ yêu cầu tổng thể của bạn. Ngoài ra, hãy cẩn thận rằng các thiết lập đĩa cứng mặc định của Linux được điều chỉnh để tương thích hơn với tốc độ, vì vậy bạn nên cấu hình nó đúng cách trước khi sử dụng (ví dụ, bạn có thể thử tiện ích hdparm).

Vì vậy, trước khi thêm một điểm tích hợp khác, tôi nghĩ bạn nên điều chỉnh hệ thống hiện có. Thông thường, cơ sở dữ liệu được thiết kế phù hợp, cấu hình PHP, Memcached và xử lý dữ liệu tĩnh là đủ ngay cả đối với một trang web tải cao.

+0

Hi Vitalii. Cảm ơn rất nhiều sự giúp đỡ của bạn và suy nghĩ của bạn về câu hỏi này! – Industrial

2

Memcached là thứ mà bạn sử dụng khi bạn chắc chắn mình cần. Bạn không phải lo lắng về việc nó nặng nề trong bộ nhớ, bởi vì khi bạn đánh giá nó, bạn bao gồm chi phí của các hộp dành riêng cho các hộp mà bạn sẽ triển khai.

Trong hầu hết các trường hợp đặt memcached trên một máy tính chia sẻ là một sự lãng phí thời gian, như bộ nhớ của nó sẽ được sử dụng tốt hơn bộ nhớ đệm bất cứ điều gì khác thay vào đó.

Lợi ích của việc ghi nhớ là bạn có thể sử dụng nó làm bộ nhớ cache dùng chung giữa nhiều máy, làm tăng tỷ lệ lần truy cập.Hơn nữa, bạn có thể có kích thước bộ nhớ cache và hiệu suất cao hơn một hộp duy nhất có thể cung cấp, như bạn có thể (và thường sẽ) triển khai một số hộp (cho mỗi vị trí địa lý).

Cách thức ghi nhớ thường được sử dụng phụ thuộc vào liên kết độ trễ thấp từ máy chủ ứng dụng của bạn; do đó bạn sẽ không thường sử dụng cụm memcached cùng ở vị trí địa lý khác nhau trong cơ sở hạ tầng của bạn (mỗi DC sẽ có cụm riêng của mình)

Quá trình này là:

  1. Xác định vấn đề hiệu suất
  2. Quyết định số tiền Cải thiện hiệu suất là đủ
  3. Tái sản xuất các vấn đề trong phòng thí nghiệm của bạn, trên phần cứng cấp sản xuất với các máy điều khiển cần thiết - điều này là không cần thiết và bạn có thể cần rất nhiều phần cứng chuyên dụng (thậm chí chuyên dụng).
  4. Kiểm tra giải pháp được đề xuất
  5. Nếu nó hoạt động, hãy giải phóng nó vào sản xuất, nếu không, hãy thử thêm tùy chọn và bắt đầu lại.

Bạn không nên

  • Cache "tất cả mọi thứ"
  • Làm những điều mà không đo lường tác động thực tế của họ.

Khi môi trường thử nghiệm hiệu suất của bạn sẽ không bao giờ hoàn hảo, bạn nên có đủ thiết bị/giám sát để có thể đo lường hiệu suất và cấu hình ứng dụng của bạn TRONG SẢN XUẤT.

Điều này cũng có nghĩa là mọi thứ mà bạn lưu vào bộ nhớ cache sẽ có bộ đếm truy cập bộ nhớ cache/bỏ qua trên đó. Bạn có thể sử dụng điều này để xác định thời điểm bộ nhớ cache bị lãng phí. Nếu bộ nhớ cache có tỷ lệ truy cập thấp (< 90%, nói), thì có thể nó không đáng giá.

Cũng có thể đáng để lưu trữ bộ nhớ cache riêng lẻ trong sản xuất.

Hãy nhớ: OPTIMISATIONS GIỚI THIỆU CHỨC NĂNG CHỨC NĂNG. Làm như tối ưu hóa ít nhất có thể, và chắc chắn rằng chúng là cần thiết và hiệu quả.

+0

Xin chào. Chúng tôi sẽ sử dụng một VPS cho phần memcache để đưa ra các hộp cụ thể cho nó. Tuy nhiên, bạn nghĩ rằng nó sẽ là sai để sử dụng một đĩa dựa trên dữ liệu "không phổ biến" hoặc để nó tất cả tối đa memcache? – Industrial

+1

Tôi nghĩ rằng bạn nên sử dụng tin thực sự chuyên dụng. Nếu bạn có vấn đề về hiệu suất với máy ảo, thì động thái rõ ràng là sử dụng tin thực. Đừng lãng phí nỗ lực của bạn dev và giới thiệu lỗi bằng cách thêm bộ nhớ đệm vô nghĩa. Caching dữ liệu trên đĩa thường không hữu ích, bởi vì nếu nó nằm trên đĩa ở một nơi khác, trừ khi đĩa khác được ồ ạt hơn contended, nó sẽ không hiệu quả hơn. Một hoạt động IO đĩa mất bao lâu, bất kể nó đọc dữ liệu từ bộ nhớ cache hoặc vị trí ban đầu của nó. – MarkR

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