Bộ nhớ 'lãng phí' cao bất ngờ (?) Trong memcached


18

Cập nhật, xem dưới cùng của câu hỏi dài (xin lỗi).

Nhìn vào số liệu thống kê memcached của chúng tôi, tôi nghĩ rằng tôi đã tìm thấy một vấn đề mà trước đây tôi không biết. Có vẻ như chúng ta có một lượng không gian lãng phí cao. Tôi đã kiểm tra với phpmemcacheadmin để biết sự thay đổi và thấy hình ảnh này đang nhìn chằm chằm vào tôi:

đồ họa kích thước bộ nhớ cache memcached

Bây giờ tôi đã có ấn tượng rằng kịch bản trường hợp xấu nhất sẽ là lãng phí 50%, mặc dù tôi là người đầu tiên thừa nhận không biết tất cả các chi tiết. Tôi đã đọc - trong số những người khác - trang này thực sự hơi cũ, nhưng phiên bản memcached của chúng tôi cũng vậy. Tôi nghĩ rằng tôi hiểu cách hệ thống hoạt động ( ví dụ ) tôi tin, nhưng tôi có một thời gian khó hiểu làm thế nào chúng ta có thể có đến 76% không gian lãng phí.

Tỷ lệ trục xuất mà phpmemcacheadmin cho thấy là 2 ev/s, vì vậy có một số vấn đề ở đây.

  • Câu hỏi chính là: tôi có thể làm gì để khắc phục điều này . Tôi có thể ném thêm bộ nhớ vào nó (tôi nghĩ có thêm một số khả dụng), có lẽ tôi nên sử dụng cấu hình slab (điều đó có khả thi với phiên bản này không?), Có thể có các tùy chọn khác không? Nâng cấp phiên bản memcached không phải là một tùy chọn có sẵn nhanh chóng.

  • Câu hỏi thứ hai, vì tò mò, tất nhiên là nếu tỷ lệ lãng phí 75% (và tăng) được mong đợi, và nếu vậy, tại sao.

Hệ thống: Đây hiện không phải là thứ tôi có thể làm bất cứ điều gì, tôi biết phiên bản memcached không phải là mới nhất, nhưng đây là những thẻ tôi đã bị xử lý.

  • Ghi nhớ 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

Như một câu trả lời cho câu trả lời của @DavidSchwartz: đây là số liệu thống kê phiến mà phpmemcacheadmin tạo ra: (có nhiều tấm btw hơn những cái này)

( Tôi cũng đã dán số liệu thống kê từ một chút sau ở định dạng văn bản ở đây )

Chi tiết phiến

CẬP NHẬT

Tôi đã khởi động lại daemon với -f 1.5, và nó trông thực sự tốt. Sau một số sự nóng lên, chúng tôi đã sử dụng / lãng phí 50/50. Nhưng, giống như trước đây, chúng ta càng có nhiều thời gian trong ngày (nó trở nên bận rộn hơn trong ngày), nó bắt đầu rơi trở lại như hiện tại: 30/70, và lãng phí vẫn đang tăng lên. Ngoài ra, tôi vẫn không biết 'lãng phí' đến từ đâu. Tôi thấy tấm này:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

Nó không đầy đủ, nó không bị đuổi, nhưng nó đang lãng phí 117,3 MB. Tính toán nhanh tôi đã làm (sửa tôi nếu tôi sai) là:

  • tấm trước đó có kích thước khối là 328, vì vậy trường hợp xấu nhất là tấm này chứa đầy các khối 329 byte.
  • điều này có nghĩa là nó đang lãng phí 167 byte cho mỗi chunk được sử dụng = 12942834 byte = 12.3 MB

Vậy 105 MB lãng phí khác đến từ đâu? Đó là người anh lớn ngay bên cạnh trông như thế này:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109

Vấn đề là có hàng tấn không gian chưa sử dụng trong các tấm khác, nhưng tấm 3 đã đầy 100% và thấy bị trục xuất.
David Schwartz

Điểm hay, điều đó sẽ giải thích cho việc trục xuất, mặc dù tôi không thực sự chắc chắn cách tính số 'lãng phí'. Nếu phiến 8 chỉ có 13,9% được sử dụng, chắc chắn phải còn một khoảng trống "miễn phí"?
Nanne

Vâng, có không gian trống trong tấm đó. Nhưng điều đó không có ích gì nếu các đối tượng bị đuổi không đi trong phiến đó.
David Schwartz

Đó là những gì tôi đã tìm ra từ câu trả lời của bạn, nhưng tại sao không có không gian trống được liệt kê? Cần có một phần của biểu đồ hình tròn màu trắng (như trong bản cài đặt thử nghiệm của tôi) nếu vẫn còn chỗ trống, ít nhất, đó là những gì tôi đã tìm ra
Nanne

Câu trả lời:


10

Đã một năm kể từ câu hỏi này và tôi không biết liệu bạn có tìm thấy câu trả lời của mình không nhưng tôi sẽ nói rằng nhận thức của bạn về "lãng phí" là sai.

Bộ nhớ bị lãng phí được cấp phát trong bộ nhớ để ứng dụng khác không thể sử dụng, nhưng nó vẫn có sẵn cho memcached.

Để đơn giản hóa lời giải thích, giả sử bạn có một memcache với 3 MB ram với 3 Tấm:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

Thực hiện một "bộ" duy nhất với kích thước 10k. Bạn sẽ thấy trong số liệu thống kê của bạn (đại khái) mà bạn có:

0.03% used
66.6% free
33% wasted

Điều này là do memcached đã phân bổ một đoạn duy nhất từ ​​"phiến lớp 1" và 99% bộ nhớ cho phiến đó là "lãng phí" và 1% là "được sử dụng" Điều này không có nghĩa là phiến và bộ nhớ được cấp cho phiến đó đã biến mất.

Thực hiện một "bộ" đơn khác với kích thước 10k. Lần này bạn sẽ thấy:

0.06% used
66.6% free
32.7% wasted

vì vậy, bây giờ bạn đang sử dụng 2 trong số 100 khối được phân bổ trong phiến 1, số liệu thống kê "lãng phí" bị giảm và số liệu thống kê được sử dụng tăng lên.

Không có gì sai khi sử dụng% + lãng phí% bằng 100%. Điều đó không có nghĩa là bạn không còn bộ nhớ nữa, nó đơn giản có nghĩa là bạn đã phân bổ ít nhất một khối từ mỗi tấm.

Để xem vấn đề này, một "bộ" với kích thước 100k và một bộ khác có kích thước 1000k

Bây giờ bạn sẽ thấy

36.6% used
   0% free
63.3% wasted

Nghe hay đấy! Bạn có bất kỳ liên kết để sao lưu này? Nếu vậy có nghĩa là máy chủ memcache của tôi đã hoạt động tốt hơn thì chúng tôi nghĩ :). Nếu tôi hiểu chính xác bạn là lãng phí có nghĩa là nó đã được phân bổ, nhưng vẫn có sẵn để sử dụng. Điều này có nghĩa là nếu không có gì miễn phí, bạn không thể phân bổ nhiều tấm hơn, nhưng không có nghĩa là bạn có vấn đề?
Nanne

1
Tôi không có một liên kết trên đầu của tôi nhưng nó rất dễ dàng để tự kiểm tra. Nhấn dòng lệnh của bạn và tạo một máy chủ nhỏ mẫu để kiểm tra cách hoạt động của nó. Bạn có thể sử dụng tùy chọn -vv cho các thông báo gỡ lỗi dài dòng, nó sẽ hiển thị cho bạn các tấm được tạo ban đầu, ví dụ: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" sẽ tạo cho bạn 3 tấm với kích thước khối 10k 100k và 1000k. Và tiếp tục phát hành "bộ" và xem số liệu thống kê lãng phí / đã sử dụng của bạn thay đổi chính xác như tôi đã mô tả ở trên.
kali

điểm tốt. bây giờ để tìm hiểu làm thế nào tôi có thể chú ý thêm vào câu trả lời này cho bạn :)
Nanne

6

Bạn có thể có một số lượng rất lớn các đối tượng rất nhỏ. Thông thường, tấm nhỏ nhất chứa các mục 104 byte. Nếu bạn có nhiều mục chỉ cần ánh xạ một số nguyên này sang một số nguyên khác, bạn có thể bị lãng phí tới 85%.

Bạn có thể tìm thấy thông tin về cách điều chỉnh xung quanh điều này trong bài viết Memcached cho các đối tượng nhỏ .


Nếu tôi đọc trang thống kê chính xác thì đây không phải là trường hợp. Hầu hết chất thải nằm trong một phiến với 480.0 Byte-chunk. Hãy để tôi kiểm tra Nếu tôi có thể hiển thị một số số liệu thống kê ...
Nanne

Oh, sau đó điều này là tốt và bình thường, không có gì phải lo lắng. Hiện tại chỉ có ít dữ liệu hơn. (Ví dụ, lưu ý rằng phiến đó chỉ được sử dụng 14%.)
David Schwartz

Nhưng làm thế nào là 75% lãng phí bình thường? Con số này bao gồm không gian chưa sử dụng? Tôi hy vọng rằng nó sẽ được tính là "miễn phí". Ngoài ra, chúng tôi thấy sự gia tăng lãng phí // giảm bộ nhớ đã sử dụng khi ngày trôi qua, trong khi trang web trở nên bận rộn hơn. Điều đó, và thực tế là chúng tôi có những vụ trục xuất, khiến tôi tự hỏi những gì có thể được thực hiện.
Nanne

Có ít tấm hơn có thể giúp tránh vấn đề quá nhiều bộ nhớ bị kẹt trong tấm sai. Ví dụ, -f 1.5 -I 2800có thể giúp đỡ.
David Schwartz

Trang con người không quá rõ ràng: -I 2800có nghĩa là 2800K, trái với mặc định 1M?
Nanne

-1

Tôi đã có vấn đề này và chuyển từ memcached sang redis (không lưu đĩa dựa trên đĩa). Tôi biết điều này có thể không thể nhưng bạn có thể thử nó như một tùy chọn và để mắt đến sự phân mảnh bộ nhớ. Bạn thậm chí có thể bật tính năng kiên trì để khắc phục sự cố "bộ nhớ cache cũ" khi khởi động lạ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.