2010-06-11 28 views
19

Linux /proc/meminfo hiển thị số lượng thống kê sử dụng bộ nhớ.Làm thế nào để đo lường đáng tin cậy bộ nhớ có sẵn trong Linux?

MemTotal:  4040732 kB 
MemFree:   23160 kB 
Buffers:  163340 kB 
Cached:  3707080 kB 
SwapCached:   0 kB 
Active:  1129324 kB 
Inactive:  2762912 kB 

Có một chút trùng lặp giữa chúng. Ví dụ, theo như tôi hiểu, có thể có bộ nhớ cache trang hoạt động (thuộc về "lưu trữ" và "hoạt động") và bộ nhớ cache trang không hoạt động ("không hoạt động" + "lưu trữ").

Điều tôi muốn làm là đo bộ nhớ "miễn phí", nhưng theo cách nó bao gồm các trang được sử dụng có khả năng bị giảm mà không ảnh hưởng đáng kể đến hiệu suất của toàn bộ hệ thống.

Lúc đầu, tôi có xu hướng sử dụng "miễn phí" + "không hoạt động", nhưng tiện ích "miễn phí" của Linux sử dụng "miễn phí" + "được lưu trong bộ nhớ cache". cách tiếp cận là.

Khi hạt nhân hết bộ nhớ, mức độ ưu tiên của các trang sẽ giảm và số liệu thích hợp hơn để đo lường bộ nhớ khả dụng là gì?

+1

Ngoài ra, hãy kiểm tra 'Committed_AS', đây là kích thước thực mà hạt nhân đã thực sự _promised_ cho các quá trình. Dường như bạn đang cố gắng hơn để dự đoán điều gì sẽ xảy ra nếu bạn phân bổ/khóa/sử dụng xx byte, với mức sử dụng bộ nhớ hiện tại? –

+0

@Tim Post, vâng tôi thậm chí không bắt đầu đưa quá nhiều vào hình ảnh. Tôi đang cố gắng để có được một số đó sẽ dự đoán khi những điều xấu bắt đầu xảy ra nếu bộ nhớ hơn được sử dụng. –

Trả lời

2

Tôi muốn nói rằng thật khó để đo lường trang nào, khi bị bỏ, sẽ làm cho hệ thống có "tác động đáng kể đến hiệu năng hệ thống tổng thể". Các trang được sử dụng bởi các quy trình người dùng sẽ là (Tổng số) - (Miễn phí + Cached + Paged). Thuật ngữ thứ 2 là tất cả bộ nhớ mà hạt nhân có thể giải phóng nếu cần. Tuy nhiên, việc giải phóng các trang bộ nhớ đang được sử dụng cho bộ nhớ cache và các trang sẽ có tác động đáng kể đến hiệu năng hệ thống tổng thể.

Nếu tôi định dùng heuristic, tôi muốn nói rằng bạn nên lấy giá trị "Không hoạt động" là "Tổng dung lượng bộ nhớ đệm hoặc bộ đệm trang, tính bằng kilobyte, miễn phí và có sẵn. là bộ nhớ chưa được sử dụng gần đây và có thể được khai hoang cho các mục đích khác. " Nếu bạn thấy rằng bạn thực hiện điều đó và hệ thống tiếp tục hoạt động tốt, bạn có thể ước tính một số phần trăm "Đang hoạt động" để đoán là vì hệ thống có thể đã sử dụng một số trang gần đây nhưng sẽ không sử dụng lại chúng. Bạn biết nhiều về hệ thống hơn tôi. Nếu hệ thống được dành riêng cho bất kỳ thứ gì bạn sắp làm, thì các trang và tệp được lưu trong bộ nhớ Hoạt động có thể được sử dụng sớm sẽ phụ thuộc vào việc hệ thống đã được sử dụng gần đây cho một cái gì khác.

8

Kể từ những gì “bộ nhớ có sẵn” một cách chính xác có nghĩa là phụ thuộc vào mục đích của bạn, và mục đích của bạn là để tránh những tình huống oom:

Check-out how Qt Extended (previously Qtopia) anticipates OOM situations.

Có hai sự kiện:

  • (MemFree + Bộ đệm + Bộ nhớ đệm)/MemTotal < treshold (trong /proc/meminfo)
  • Các trang chính> treshold (pgmajfault in /proc/vmstat Tôi nghĩ)

Đầu tiên là cảnh báo sớm rằng bộ nhớ thấp và kích hoạt giám sát thường xuyên hơn của các thiết lập trang. Các tín hiệu thứ hai trashing, mà giết chết hiệu năng hệ thống và là một gợi ý tốt kẻ giết người OOM sẽ chạy.

+0

+1 Thuật toán tốt để ngăn chặn OOM – SeanDowney

3

Lúc đầu, tôi thấy câu hỏi của bạn dễ dàng, như trong kết quả thực hành từ free trong cột '+ bộ đệm/bộ nhớ cache' là cột tôi sử dụng và nó thường hoạt động.

Nhưng một trong những tình huống mà nó không hoạt động là khi bạn đã đọc nặng đến cùng một khối. Ví dụ.đọc cùng 1 gb_file hơn và hơn:

while true; do cat 1gb_file >/dev/null; done 

Nếu hệ thống của bạn có> 1 GB bộ nhớ cache thì thao tác này sẽ chạy nhanh. Nhưng nếu bạn bắt đầu sử dụng một số bộ nhớ cache cho một cái gì đó khác nó sẽ đập vỡ hiệu suất của hệ thống.

Vì vậy, khi bạn đánh giá các giải pháp của mình, hãy thử ở trên và xem liệu giải pháp có tính đến giải pháp đó hay không.

2

tôi sử dụng như sau:

FREE_KB = MemFree + Buffers + Cached 

FREE_KB=$(($(echo `sed -n '2p;3p;4p' < /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /+/g"))) 


USED_KB = MemTotal - MemFree - Buffers - Cached 

USED_KB=$(($(echo `head -n4 /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /-/g"))) 
+0

Dường như tôi/proc/meminfo trả về byte hoặc kb có thể phụ thuộc vào hệ thống. Đối với tôi, mã trên xuất hiện để trả về byte, YMMV. – russellpierce

+0

Bạn sử dụng hạt nhân nào? Trong chức năng Linux hiện tại meminfo_proc_show chỉ trả về kB. – Const

2

Từ linux-3.14 có MemAvailable số liệu mới trong/proc/meminfo.

Và kiểm tra dòng '-/+ bộ đệm/bộ nhớ cache:' ở đầu ra của tiện ích miễn phí.

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