htop báo cáo sử dụng bộ nhớ cao hơn nhiều so với miễn phí hoặc hàng đầu


8

Ba kết quả đầu ra sau đây được thực hiện đồng thời:

hàng đầu:

top - 02:54:36 up 2 days, 13:50,  3 users,  load average: 0.05, 0.05, 0.09
Tasks: 181 total,   1 running, 179 sleeping,   0 stopped,   1 zombie
%Cpu(s):  2.5 us,  0.8 sy,  0.0 ni, 96.6 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  16158632 total, 11234480 used,  4924152 free,      844 buffers
KiB Swap: 16777212 total,        0 used, 16777212 free, 10640832 cached

miễn phí -h:

             total       used       free     shared    buffers     cached
Mem:           15G        10G       4.7G         0B       844K        10G
-/+ buffers/cache:       578M        14G
Swap:          15G         0B        15G

đỉnh: đỉnh

miễn phí và hàng đầu dường như đồng ý. Trong đầu có 11234480 KiB được sử dụng, trừ 10640832 KiB được lưu trong bộ nhớ cache mang lại cho 579,7 MiB, khá gần với những báo cáo miễn phí trong bộ đệm +/- được sử dụng.

Tuy nhiên, htop đang báo cáo 1836 (MiB) được sử dụng, không phải ở đây cũng như không có gì xa như tôi có thể thấy. Sự khác biệt này đến từ đâu? Htop rõ ràng không bao gồm dữ liệu được lưu trong bộ nhớ cache, nhưng nó vẫn báo cáo nhiều hơn ba lần mức sử dụng bộ nhớ miễn phí hoặc hàng đầu.

Tôi biết rằng có nhiều câu hỏi tương tự, nhưng tôi không bắt gặp một câu hỏi nào giải thích cho sự khác biệt này (sự nhầm lẫn thường dường như chỉ có / không có bộ đệm đếm).

Chỉnh sửa: Tôi nên đề cập rằng tôi đang chạy openSUSE và tôi thấy cùng một loại khác biệt trong cả hai phiên bản 12.2 và 12.3 RC1.

Edit2: Phiên bản bao gồm của htop là 1.0.1. Tôi cũng đã biên dịch phiên bản 1.0.2 từ nguồn và cũng thấy sự khác biệt tương tự.


chỉ đoán ở đây nhưng có lẽ nó tăng thêm bộ nhớ được chia sẻ giữa các tiến trình?
foo

Câu trả lời:


10

Một bài viết lại hoàn chỉnh của bài viết trước của tôi. Có một chút tò mò và kiểm tra thêm.

Nói tóm lại: lý do cho sự khác biệt là openSUSE sử dụng phiên bản vá đầumiễn phí có thêm một số giá trị bổ sung cho 'bộ nhớ cache' .


A) Phiên bản tiêu chuẩn

hàng đầu, miễn phí, htop , ...:

Việc sử dụng được tính bằng cách đọc dữ liệu từ /proc/meminfo :

Ví dụ:

#free:
Row   Column  | Corresponding /proc/meminfo entry
-----|--------|----------------------------------
Mem:

      total   : MemTotal
      used    : MemTotal - MemFree
      free    : MemFree
      shared  : MemShared
      buffers : Buffers
      cached  : Cached
-----|--------|----------------------------------
-/+ buffers/cache:

      used    : (MemTotal - MemFree) - (Buffers + Cached)
      free    :  MemFree             + (Buffers + Cached)

#htop:
    Used U*   : ((MemTotal - MemFree) - (Buffers + Cached)) / 1024

* Tôi đang sử dụng tên Used Ucho bộ nhớ được sử dụng bởi Chế độ người dùng. Aka Được sử dụng trừ (Bộ đệm + Bộ đệm) .

Vì vậy, trong thực tế tính toán tương tự được sử dụng.

htop hiển thị như sau trong đồng hồ bộ nhớ:

[Used U % of total | Buffers % of total | Cached % of total ] UsedU MB

(MB thực sự là MiB.)


B) Phiên bản vá

Cơ sở cho freetoptrên Debian, Fedora, openSuseProcps-ng . Tuy nhiên, mỗi hương vị thêm các bản vá của riêng họ có thể, hoặc migh không trở thành một phần của dự án chính.

Trong openSUSE, chúng tôi tìm thấy các bổ sung khác nhau cho gói hàng đầu / miễn phí (Procps). Những cái cần chú ý ở đây là một số giá trị bổ sung được sử dụng để thể hiện giá trị bộ đệm. (Tôi không bao gồm những điều này trong bài viết trước của mình vì hệ thống của tôi sử dụng một gói "sạch".)

B.1) Bổ sung

Trong / Proc / meminfo, chúng ta có Slab là bộ đệm cấu trúc dữ liệu trong kernel. Là một danh mục phụ, chúng tôi thấy SReclaimable là một phần của Slab có thể được thu hồi để sử dụng khác cho cả Kernel và User Mode.

Hơn nữa, chúng ta có SwapCached , bộ nhớ đã bị tráo đổi, được hoán đổi nhưng cũng nằm trong tệp hoán đổi. Vì vậy, nếu một người cần trao đổi nó một lần nữa, điều này đã được thực hiện.

Cuối cùng, có NFS_Un Ổn định là các trang được gửi đến máy chủ nhưng chưa được cam kết lưu trữ ổn định.

Các giá trị sau được thêm vào cachetrong phiên bản vá openSUSE:

SReclaimable
SwapCached
NFS_Unstable

(Ngoài ra, có một số kiểm tra rằng tổng số phải lớn hơn miễn phí, được sử dụng phải lớn hơn bộ đệm + bộ đệm, v.v.)

B.2) Kết quả

Nhìn vào miễn phí , kết quả là các giá trị sau là như nhau : total, used, free and buffers.

Sau đây được thay đổi : cached and "+/- buffers".

used    = MemTotal - MemFree

old:
    cached         : Cached
    +-/buffers-used: used - (Buffers + Cached)
    +/-buffers-free: free + (Buffers + Cached)

patched:
    cached         : Cached + SReclaimable + SwapCached + NFS_Unstable
    +/-buffers-used: used - (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)
    +/-buffers-free: free + (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)

Các bổ sung tương tự được thực hiện để đầu .

htop là không thay đổi và do đó chỉ phù hợp với các phiên bản cũ hơn / hoặc chưa vá của top / free.


Đoạn mã thứ hai không hoạt động (ống thứ hai có grep -A12 ... không trả về bất cứ thứ gì). Nhưng ngay bây giờ memo1 (tức là htop) hiển thị bộ nhớ là "[...] 2087/15779MB" trong khi miễn phí -m hiển thị 825 dưới +/- bộ đệm / bộ đệm. Tôi sẽ cập nhật câu hỏi của tôi với HĐH, v.v.
Quantumboredom

Vâng, snipet thứ hai là một hack xấu (cố gắng phân tích đầu ra của ncurses là buồn cười nhất). Nó hoạt động ở đây, nhưng tôi không ngạc nhiên khi nó không hoạt động ở nơi khác.
Runium
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.