Tại sao Linux báo cáo bộ nhớ Free miễn phí lạ lùng?


44

Đây là một câu hỏi kinh điển về cách hệ điều hành Unix báo cáo việc sử dụng bộ nhớ.
Câu hỏi tương tự:

Tôi có máy chủ sản xuất đang chạy Debian 6.0.6 Bóp

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Mỗi ngày cron thực thi kịch bản sao lưu là root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Mọi thứ hoạt động hoàn hảo, nhưng tôi nhận thấy rằng biểu đồ bộ nhớ của Munin cho thấy bộ đệmbộ đệm tăng sau khi sao lưu.

Sau đó, tôi chỉ cần tải về các tập tin sao lưu và xóa chúng. Sau khi xóa biểu đồ bộ nhớ của Munin trả lại bộ đệmbộ đệm về trạng thái trước khi sao lưu.

Dưới đây là biểu đồ Munin:

Hình ảnh lưu trữ bên ngoài là một liên kết chết.


3
Xin chúc mừng, câu hỏi này đã được phong thánh (nó giống như một thứ 6 ngày nay hỏi về điều này, và nó sẽ xảy ra để có ví dụ thú vị nhất và đẹp nhất :-)
voretaq7

Câu trả lời:


27

Đây là "vấn đề" tương tự như từ Máy chủ từ chối sử dụng phân vùng trao đổi và một vài câu hỏi tương tự khác trên trang web này. ( Sử dụng bộ nhớ cao trên máy chủ Linux , Sử dụng bộ nhớ trong LINUX , Máy chủ web sắp hết bộ nhớ , v.v.)

Hãy chú ý đến thực tế là mức tiêu thụ bộ nhớ là từ bộ đệm . Điều này có nghĩa là nó giữ một tập tin trong bộ nhớ. Bộ nhớ đệm là bộ nhớ "miễn phí". Thay vì để trống khối bộ nhớ, HĐH của bạn sẽ giữ các tệp đã đọc gần đây trong không gian đó. Nếu một ứng dụng cần bộ nhớ đó, nó sẽ được ứng dụng sử dụng. Cho đến lúc đó, nó có cơ hội cứu bạn khỏi phải đọc lại tệp từ đĩa nếu nó thường xuyên được tham chiếu.

Theo biểu đồ này, mức tiêu thụ bộ nhớ hiệu quả của bạn hoàn toàn không thay đổi trong toàn bộ thời gian của biểu đồ.


Có thể hướng dẫn máy chủ không lưu trữ các tệp này? Tôi đoán tôi nên chạy sync; echo 3 > /proc/sys/vm/drop_cachessau khi sao lưu?

13
@ stan31337 Vâng, điều đó là có thể, không bạn không nên làm điều đó. Có tập tin này trong bộ nhớ chi phí bạn không có gì. Nếu bạn xóa tất cả bộ nhớ cache của mình, mọi tệp được lưu trong bộ nhớ cache và phải đọc lại từ đĩa sẽ làm chậm hệ thống của bạn. Hãy để nó làm những gì nó được thiết kế để làm.
Jeff Ferland

2
@ stan31337 Khi bạn xóa tệp sao lưu của mình, HĐH sẽ tự động loại bỏ nó khỏi bộ đệm (đó là lý do tại sao bộ nhớ trống của bạn lại nhảy sau khi bạn xóa nó) - Linux đủ thông minh để biết rằng một tệp không mở và không thể được truy cập từ cây hệ thống tập tin sẽ không bao giờ được truy cập lại. Giống như Jeff nói rằng bạn chắc chắn không muốn xóa toàn bộ bộ đệm FS của mình (hệ thống sẽ phải đọc lại và lưu lại dữ liệu đó từ đĩa, điều này thực sự sẽ khiến máy chủ của bạn chậm hơn một lúc)
voretaq7

61

Bạn đang gặp vấn đề về Linux Ate My Ram .

Đừng hoảng sợ.

Đây không phải là vấn đề.

Hệ thống của bạn đang hoạt động như thiết kế.

Vấn đề không phải là hệ điều hành của bạn - vấn đề là sự hiểu biết của bạn về bộ nhớ "miễn phí" là gì.


Các hệ thống Unix sử dụng bộ nhớ cho nhiều hơn là chỉ chạy các chương trình. Bộ nhớ có thể được sử dụng cho:

  • Chạy chương trình (hoạt động / sử dụng)
  • Dữ liệu đệm trong quá cảnh (bộ đệm)
  • Bộ nhớ đệm dữ liệu gần đây được đọc từ / ghi vào đĩa (bộ đệm)
  • Hoàn toàn không có gì (miễn phí)

Phần tiếp theo là một chuyến tham quan ngắn (và phần lớn chưa hoàn thành) về cách các hệ thống Unix hiện đại báo cáo việc sử dụng RAM.

Bộ nhớ trống (định nghĩa hệ điều hành) là gì?

Khi một hệ thống Unix báo cáo RAM là Miễn phí, điều đó có nghĩa là "Tôi không sử dụng RAM này cho bất cứ điều gì". RAM
miễn phí thực sự vô giá trị - Nó không làm cho hệ thống của bạn nhanh hơn, nó chỉ ngồi đó là "miễn phí" trong trường hợp có thứ gì đó cần. Rằng một cái gì đó có thể là bất kỳ trong ba mục khác tôi đã đề cập ở trên.

Bộ nhớ cache và bộ đệm là gì?

Bộ nhớ cache và bộ đệm là RAM hệ điều hành đang sử dụng để làm cho hệ thống của bạn nhanh hơn.
Bộ nhớ này không cần thiết để chạy các chương trình ngay bây giờ , vì vậy HĐH của bạn đang sử dụng nó để lưu trữ dữ liệu mà nó cần thường xuyên - ví dụ thư viện C (cần khá nhiều chương trình bạn chạy) hầu như luôn được giữ trong cachebộ nhớ, vì vậy hệ thống không phải vào đĩa để tìm hướng dẫn cần in "Hello World" trên màn hình.
Nó thực sự phức tạp hơn thế nhiều - có bộ nhớ dùng chung , bộ nhớ có dây , v.v. - nhưng với mục đích của chúng tôi, lời giải thích đơn giản này là đầy đủ.

Bộ nhớ hoạt động là gì?

Bộ nhớ hoạt động là một phần của chúng tôi hiểu là bộ nhớ "đã sử dụng" - RAM mà các ứng dụng đang sử dụng cho bất cứ thứ gì chúng làm - sắp xếp bảng tính, phục vụ trang web, chỉnh sửa đồ họa, v.v.
Bộ nhớ "Hoạt động" gần đây đã "hoạt động" - - chương trình tuyên bố rằng nó đã sử dụng nội dung của nó (đọc hoặc viết) và nó không được coi là một ứng cử viên tốt để trao đổi.

Bộ nhớ không hoạt động là gì?

Giống như Bộ nhớ hoạt động, Bộ nhớ không hoạt động là RAM mà các ứng dụng đang sử dụng cho bất cứ điều gì chúng làm. Sự khác biệt là bộ nhớ này đã không được truy cập trong một thời gian, vì vậy nếu đẩy mạnh hệ điều hành nghĩ rằng nó có thể được trao đổi vào đĩa và (với một chút may mắn) chương trình tuyên bố rằng nó sẽ không yêu cầu lại vì vậy nó sẽ không bao giờ để ý

Bộ nhớ "Được sử dụng" là gì (định nghĩa CON NGƯỜI)

Những gì bạn và tôi nghĩ về bộ nhớ "Được sử dụng" về cơ bản là tổng của bộ nhớ Hoạt động và Không hoạt động. Tất cả các RAM hiện được yêu cầu bởi các ứng dụng cho việc sử dụng của họ.
Miễn là bạn có nhiều RAM được cài đặt hơn tổng bộ nhớ Hoạt động và Không hoạt động (cộng với giới hạn an toàn tốt là 512-1024 MB trên cùng), bạn đang ở một vị trí ổn: Hệ điều hành của bạn có thể sẽ không đạt được hiệu suất trao đổi và giết chết .

Bộ nhớ "Miễn phí" (định nghĩa CON NGƯỜI) là gì?

Những gì bạn và tôi nghĩ về bộ nhớ "miễn phí" là bộ nhớ có sẵn để chạy các chương trình.
Điều này hơi phức tạp hơn so với con số "Miễn phí" trong các báo cáo hệ điều hành của bạn. Khi một chương trình yêu cầu RAM, hệ điều hành sẽ cố gắng lấy RAM đó theo cách ít gây gián đoạn nhất có thể:

  • Nếu có sẵn Bộ nhớ trống (ngồi xung quanh không làm gì) thì RAM sẽ được phân bổ.
  • Nếu không có bộ nhớ trống, hệ điều hành sẽ hủy bỏ không gian Bộ đệm và Bộ đệm: Các nội dung ít được truy cập gần đây nhất / ít thường xuyên nhất trong nhóm bộ đệm sẽ bị loại bỏ và RAM được cung cấp cho chương trình.
  • Nếu không có Bộ đệm / Bộ nhớ cache để hủy bộ đệm, bộ trao đổi sẽ xem xét bộ nhớ không hoạt động và chọn các khu vực mà nó cho rằng ít có khả năng được truy cập nhất. Dữ liệu đó sẽ được phân trang để trao đổi (đĩa) và RAM mới được giải phóng được cung cấp cho chương trình.
  • Nếu tất cả RAM không hoạt động đã bị tráo đổi, bộ trao đổi sẽ bắt đầu đưa Active RAM vào đĩa.
    (Đây là về nơi thực hiện thường đi đến những con chó: Mỗi khi một chương trình được lần lượt của nó trên CPU của nó bit hoán đổi ra cần phải được đưa trở lại vào RAM, có nghĩa là bộ nhớ kích hoạt một số chương trình khác phải được tháo ra - các doanh thu cao trong trao đổi được gọi là đập )
  • Nếu hệ thống đã hoán đổi mọi thứ có thể (và lấp đầy phân vùng trao đổi) hoặc nếu bạn đang chạy một hệ thống không có phân vùng trao đổi, điều tồi tệ sẽ xảy ra. Tại thời điểm này, một trong hai điều sẽ xảy ra:
    • malloc()sẽ thất bại. Đây là hành vi tuân thủ POSIX - hệ điều hành sẽ thông báo cho chương trình yêu cầu RAM rằng nó không thể đáp ứng yêu cầu.
      Chương trình có thể yêu cầu ít RAM hơn hoặc nếu không thể thực hiện với một phần bộ nhớ nhỏ hơn, nó có thể dọn sạch và thoát ra. (Nếu chương trình được viết xấu, nó sẽ bị sập.)
    • Nếu bạn đang sử dụng hộp Linux, OOM-Killer có thể lái xe theo kiểu băng đảng - bằng cách giết người, kết thúc các quá trình khác để cố gắng giải phóng đủ RAM để đáp ứng yêu cầu.
      Trong trường hợp bạn không thể nói theo mô tả của tôi ở đây và câu trả lời của tôi cho câu hỏi được liên kết, tôi nghĩ đây là một cách khủng khiếp để giải quyết vấn đề.

Tại sao RAM miễn phí tăng khi bạn xóa tệp?

Trong ví dụ từ câu hỏi ở đây, bạn nhận thấy rằng có thể "Giải phóng" RAM bằng cách xóa tệp sao lưu - giải thích cho điều đó khá đơn giản: Vì không có gì sử dụng tệp đó (không xử lý tệp mở) và không thể truy cập được từ đó hệ thống tập tin (không liên kết) hệ điều hành biết rằng sẽ không có ai truy cập lại dữ liệu đó và nó sẽ xóa dữ liệu khỏi bộ đệm của hệ thống tập tin.
Điều này làm cho hệ điều hành báo cáo Bộ nhớ trống nhiều hơn, nhưng không ảnh hưởng đến hiệu năng hệ thống.


Bây giờ nó hoàn toàn rõ ràng đối với tôi ... Trải nghiệm Linux của tôi có khoảng 2 tháng, tất cả bắt đầu với máy chủ Debian này. Một tháng trước, tôi đã cài đặt Gentoo trên máy tính xách tay gia đình của mình và rất ngạc nhiên về hiệu suất của nó, nó đã thay đổi hoàn toàn từ người dùng Windows sang người dùng Linux ngay cả trên máy tính làm việc của tôi. Thật tuyệt khi học Linux với Gentoo, và vẫn còn rất nhiều điều phải học.

@ stan31337 Bạn không phải là người duy nhất không rõ ràng - điều này đặc biệt khó khăn với những người đến từ nền tảng Windows bởi vì trừ khi bạn đi sâu vào nó, Windows không báo cáo việc sử dụng bộ nhớ với mức độ chi tiết này - chỉ là "Được sử dụng" (bởi các chương trình ) và "Miễn phí" (dành cho các chương trình thực hiện). Người dùng Mac dễ dàng hơn một chút vì Activity Monitor về cơ bản là phiên bản đồ họa topvà báo cáo RAM miễn phí / có dây / hoạt động / không hoạt động.
voretaq7

Tôi đã từng làm việc với Process Explorer trên Windows, nó có rất nhiều thứ Bộ nhớ để hiển thị, nhưng hầu hết chúng đều không rõ ràng với tôi, rằng tôi thực sự đã không nhìn vào chúng ...

2
Ngoài ra, cần lưu ý rằng mặc dù Windows thường không hiển thị chi tiết đến vậy nhưng nó có thiết lập rất giống nhau.
Joachim Sauer

Bạn biết đấy, ngay cả trong Windows, bộ nhớ đọc cũng khó hiểu. Đây là điều mà các nhà sản xuất hệ điều hành có thể muốn nhấn mạnh hơn, hay đúng hơn là thứ mà người dùng nên quan tâm ít hơn so với hiện tại.
gparent

2

Một cái gì đó khác để kiểm tra nếu thất bại ở trên:

Kiểm tra việc sử dụng bộ nhớ cache Slab ( Slab:, SReclaimable:SUnreclaim:trong /proc/meminfo). Đây là bộ đệm của cấu trúc dữ liệu trong nhân và tách biệt với bộ đệm trang được báo cáo bởi free.

Nếu bộ đệm của bộ đệm có thể chịu được đối với một phần lớn "bộ nhớ bị thiếu" của bạn, hãy kiểm tra /proc/slabinfoxem nó đã biến mất ở đâu. Nếu đó là răng hoặc inodes, bạn có thể sử dụng sync ; echo 2 > /proc/sys/vm/drop_cachesđể loại bỏ chúng.

Bạn cũng có thể sử dụng slabtopcông cụ để hiển thị mức sử dụng hiện tại của bộ đệm Slab ở định dạng thân thiện. csẽ sắp xếp danh sách theo kích thước bộ đệm hiện tại.

Từ: https://stackoverflow.com/a/5467207

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.