Làm cách nào tôi có thể tìm ra tổng bộ nhớ vật lý (RAM) của hộp linux phù hợp để được phân tích cú pháp bởi tập lệnh shell?


123

Tôi đang gõ một tập lệnh shell để tìm ra tổng bộ nhớ vật lý trong một số hộp linux của RHEL.

Trước hết tôi muốn nhấn mạnh rằng tôi quan tâm đến toàn bộ bộ nhớ vật lý được nhận ra bởi kernel, không chỉ bộ nhớ khả dụng . Do đó, xin vui lòng, tránh các câu trả lời gợi ý đọc / Proc / meminfo hoặc sử dụng các lệnh miễn phí , hàng đầu hoặc sar - Trong tất cả các trường hợp này, giá trị " tổng bộ nhớ " của chúng có nghĩa là " bộ nhớ khả dụng ".

Ý nghĩ đầu tiên là đọc các thông điệp kernel boot:

Memory: 61861540k/63438844k available (2577k kernel code, 1042516k reserved, 1305k data, 212k init)

Nhưng trong một số hộp linux, do sử dụng phần mềm PowerPath của EMC2 và các thông báo khởi động tràn ngập của nó khi khởi động kernel, thông báo kernel khởi động hữu ích đó không có sẵn, ngay cả trong tệp / var / log / dmesg .

Tùy chọn thứ hai là lệnh dmidecode (Tôi được cảnh báo chống lại sự không phù hợp có thể có của RAM được nhận dạng và RAM thực do những hạn chế của một số cấu trúc và cấu trúc cũ hơn). Tùy chọn --memory đơn giản hóa tập lệnh nhưng tôi nhận ra rằng các bản phát hành cũ hơn của lệnh đó không có tùy chọn --memory .

Cơ hội cuối cùng của tôi là lệnh getconf . Nó báo cáo kích thước trang bộ nhớ, nhưng không phải là tổng số trang vật lý - biến hệ thống _PHYS_PAGES dường như là các trang vật lý có sẵn, không phải là tổng số trang vật lý.

# getconf -a | grep PAGES
PAGESIZE 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Câu hỏi của tôi: Có cách nào khác để có được tổng dung lượng bộ nhớ vật lý, phù hợp để được phân tích cú pháp bởi tập lệnh shell?


3
Điều này nên được di chuyển sang linux & unix
Kolob Canyon

Câu trả lời:


56

Nếu bạn quan tâm đến RAM vật lý, hãy sử dụng lệnh dmidecode. Nó cung cấp cho bạn nhiều thông tin hơn thế, nhưng tùy thuộc vào trường hợp sử dụng của bạn, bạn cũng có thể muốn biết liệu 8G trong hệ thống đến từ gậy 2x4GB hay gậy 4x2GB.


19
Tôi cần điều này gần đây và có một lệnh đơn giản để có được tổng kích thước bộ nhớ của tất cả các mô-đun bộ nhớ trên một hệ thống: dmidecode -t 17 | grep "Kích thước. * MB" | awk '{s + = $ 2} END {in s / 1024}'
Jonesinator

6
Khác với các câu trả lời khác, dmidecode yêu cầu quyền root .
chus

1
Nó mang lại cho tôi lỗi này # dmidecode 3.0 / sys / firmware / dmi / frames / smbios_entry_point: Quyền bị từ chối Quét / dev / mem cho điểm vào. / dev / mem: Quyền bị từ chối
VVB

128

Bạn đã thử cat /proc/meminfochưa Sau đó bạn có thể awk hoặc grep ra những gì bạn muốn, MemTotal ví dụ

awk '/MemTotal/ {print $2}' /proc/meminfo

hoặc là

cat /proc/meminfo | grep MemTotal

8
Nhưng MemTotal không phải là toàn bộ bộ nhớ vật lý - vui lòng xem trang man cho Proc (5)
Chris Stratton

2
@ChrisStratton: bạn có thể rõ ràng hơn không? Đối với hầu hết các ý định và mục đích thực tế, câu trả lời này có thể là đủ.
Dan Dascalescu

13
awk '/MemTotal/ {print $2}' /proc/meminfo Càng ít ống càng tốt.
masta

3
Thay thế được đánh giá cao: Tránh awk, khi bạn có thể. Regex / PCRE là một ngôn ngữ phù hợp với mô hình phổ quát hơn nhiều (nghĩa là bạn cũng có thể sử dụng nó trong Python hoặc Perl). Nếu bạn học awk, tất cả những gì bạn đã là awk. Nếu bạn nghiêng grep + PCRE mặt khác ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek

5
@GabrielBurkholder cũng có một quan điểm ngược lại: awkđược chuẩn hóa bởi POSIX nhưng grepcác tùy chọn -o-Pkhông! Ví dụ của bạn sẽ hoạt động tốt với GNU grep(nhưng GNU vẫn nói rằng việc triển khai PCRE là thử nghiệm) nhưng có lẽ nó sẽ không hoạt động với các triển khai khác.
pabouk

48

cat /proc/meminfo | grep MemTotalhoặc miễn phí cung cấp cho bạn dung lượng RAM chính xác mà máy chủ của bạn có. Đây không phải là "bộ nhớ khả dụng".

Tôi đoán vấn đề của bạn xuất hiện khi bạn có VM và bạn muốn tính toàn bộ lượng bộ nhớ được lưu trữ bởi nhà cung cấp dịch vụ lưu trữ nhưng bạn sẽ phải đăng nhập vào bộ ảo hóa trong trường hợp đó.

cat /proc/meminfo | grep MemTotal

tương đương với

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'

5
Trên hộp vật lý của tôi có cat /proc/meminfo | grep MemTotalcác báo cáo bộ nhớ 4GB MemTotal: 3957032 kB, nó hơi thiếu 4GB. OP (và tôi) đang tìm kiếm thứ gì đó sẽ báo cáo 4GB.
TvE

1
Cách trực tiếp hơn để làm điều này chỉ làgrep MemTotal /proc/meminfo
Dan Passaro

3
@TvE 3957032 kBchỉ bị dán nhãn sai. Nó nên được dán nhãn kiB, như được chỉ ra trong bài viết này . Điều đó có nghĩa là nó thực sự đang báo cáo 4.052.000.768 byte, lớn hơn một chút so với 4 GB. Điều này là do thực tế là / Proc / meminfo triển khai trước ký hiệu kiB.
Jeff G

4
@JeffG Tôi nghĩ bạn đã bỏ lỡ điểm mà ToolmakerSteve đang thực hiện. Giá trị mong đợi là 4GiB, không phải 4GB và TvE chỉ đơn giản là trích dẫn sai giá trị. ToolmakerSteve chính xác rằng "4 GB" RAM nên được hiểu là "4 GiB" trong bình luận của TvE, và do đó, đó là giá trị mà chúng ta đang so sánh. Bạn đúng rằng giá trị lớn hơn 4GB, giống như nó cũng lớn hơn 2GB và 2GiB và dưới 6GB và 6GiB, nhưng điều quan trọng ở đây là so sánh với 4GiB, vậy ai quan tâm đến việc so sánh với các biện pháp khác như thế nào? Vì vậy, có, tuyên bố của bạn là chính xác, nhưng nó cũng không liên quan.
Tim

1
@Tim Tôi chỉ cung cấp thông tin thực sự chính xác, với tài liệu hỗ trợ, đã trả lời câu hỏi được hỏi. Cho rằng phải mất nhiều hơn một tìm kiếm tầm thường để tìm, tôi nghĩ rằng thực tế là /proc/meminfocác báo cáo số trong kiB là một phần cực kỳ quan trọng của cuộc thảo luận này, bất kể @TvE có ý định hỏi một câu hỏi khác không.
Jeff G

19

Thêm 2 mục cuối cùng /proc/meminfo, chúng cung cấp cho bạn bộ nhớ chính xác hiện diện trên máy chủ.

Thí dụ:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.


3
Câu trả lời tốt nhất ở đây, ngoài việc sử dụng dmidecode, yêu cầu root. Nhưng DirectMap không phải lúc nào cũng chính xác. Tôi có một máy chủ với 4GB và nó nói: `DirectMap4k: 110200 kB DirectMap2M: 3993600 kB` Đó là 4007 MB, không phải
4096 MB

LƯU Ý: Ngay cả khi HĐH của TvE đang báo cáo theo đơn vị 1024 byte, tổng số 4103800 x 1024 của anh ta vẫn thiếu 4 GiB (sẽ là 4194304 x 1024).
ToolmakerSteve

Ngoài ra, không có sẵn trên tất cả các phiên bản của Linux. Hộp Centos5 của tôi (vâng, tôi biết) không báo cáo điều này.
Tom Quarendon

Đối với bản ghi, những điều này chỉ có mặt trên x86. Lý do điều này hoạt động là vì các mục này đếm số lượng bộ nhớ được biểu thị bằng các trang 4k, 2M, 1G trong TLB, phải bao gồm tất cả bộ nhớ mà kernel có thể truy cập .
kevmitch

1
CẬP NHẬT: Tổng này thay đổi một chút khi tôi di chuyển giữa các phiên bản kernel khác nhau (linux-3.18.28, linux-4.13-rc6) trên cùng một máy.
kevmitch

17

Một lệnh hữu ích nữa:
vmstat -s | grep memory
đầu ra mẫu trên máy của tôi là:

  2050060 K total memory
  1092992 K used memory
   743072 K active memory
   177084 K inactive memory
   957068 K free memory
   385388 K buffer memory

một lệnh hữu ích khác để lấy thông tin bộ nhớ là:
free
đầu ra mẫu là:

             total       used       free     shared    buffers     cached
Mem:       2050060    1093324     956736        108     385392     386812
-/+ buffers/cache:     321120    1728940
Swap:      2095100       2732    2092368

Một quan sát ở đây là, lệnh cũng freecung cấp thông tin về không gian hoán đổi.
Liên kết sau có thể hữu ích cho bạn:
http://www.linuxnix.com/find-ram-details-in-linuxunix/


1
Đây là một giải pháp đơn giản tuyệt vời, nếu bạn muốn đầu ra của mình bằng Megabyte dễ nhìn hơnvmstat -s -S M | grep ' memory'
Oliver Dungey

17
free -h | awk '/Mem\:/ { print $2 }' 

Điều này sẽ cung cấp cho bạn tổng bộ nhớ trong hệ thống của bạn ở định dạng có thể đọc được và tự động chia tỷ lệ thành đơn vị thích hợp (ví dụ: byte, KB, MB hoặc GB).


Chỉ cần những gì tôi đang tìm kiếm!
Tomas Gonzalez

10
dmidecode -t 17 | grep  Size:

Thêm tất cả các giá trị trên được hiển thị sau "Kích thước:" sẽ cho tổng kích thước vật lý chính xác của tất cả các thanh RAM trong máy chủ.


2

Tổng bộ nhớ trực tuyến

Tính tổng bộ nhớ trực tuyến bằng sys-fs.

totalmem=0;
for mem in /sys/devices/system/memory/memory*; do
  [[ "$(cat ${mem}/online)" == "1" ]] \
    && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes)))));
done

#one-line code
totalmem=0; for mem in /sys/devices/system/memory/memory*; do [[ "$(cat ${mem}/online)" == "1" ]] && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes))))); done

echo ${totalmem} bytes
echo $((totalmem/1024**3)) GB

Ví dụ đầu ra cho hệ thống 4 GB:

4294967296 bytes
4 GB

Giải trình

/ sys / thiết bị / hệ thống / bộ nhớ / block_size_bytes

Số byte trong một khối bộ nhớ (giá trị hex). Sử dụng 0x trước giá trị đảm bảo rằng nó được xử lý đúng trong quá trình tính toán.

/ sys / thiết bị / hệ thống / bộ nhớ / bộ nhớ *

Lặp lại tất cả các khối bộ nhớ khả dụng để xác minh chúng đang trực tuyến và thêm kích thước khối được tính vào Totalmem nếu có.

[["$ (mèo $ {mem} / trực tuyến)" == "1"]] &&

Bạn có thể thay đổi hoặc loại bỏ điều này nếu bạn thích trạng thái bộ nhớ khác.


Tôi sẽ kiểm tra giải pháp của bạn ngay khi tôi có thể.
Jdamian

bash tip: trong mã của bạn, bạn không cần sử dụng ký tự gạch chéo ( \) để tiếp tục trong dòng tiếp theo - thực sự, bạn có thể sử dụng &&ở cuối dòng cho mục đích đó.
Jdamian

1

Tổng bộ nhớ trong Mb:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
echo $((x/1024))

hoặc là:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))

0

Đây là những cách:

1. / Proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Bạn có thể viết mã hoặc tập lệnh để phân tích cú pháp.

2. Sử dụng sysconf bằng cách sử dụng các macro bên dưới

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. Bằng cách sử dụng cuộc gọi hệ thống sysinfo

int sysinfo (struct sysinfo * thông tin);

cấu trúc sysinfo {.

   .

   unsigned long totalram;  /*Total memory size to use */

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

cat / proc / meminfo công trình đối với tôi trên hệ thống nhúng của tôi
webbertiger

-7

Tôi tìm thấy htopmột công cụ hữu ích.

sudo apt-get cài đặt htop

và sau đó

miễn phí

sẽ cung cấp thông tin bạn cần.

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.