Theo dõi xuống thiếu bộ nhớ sử dụng bộ nhớ trong linux trong linux


10

Trên kernel Arch 3.6.7 x86_64 tôi đang cố gắng tính đến việc sử dụng bộ nhớ của hệ thống, mà tôi càng nhìn vào nó, dường như càng có một lỗ hổng (trong kế toán của bộ nhớ đã sử dụng, không phải là lỗ hổng cách sử dụng).

Đây là một hệ thống mới khởi động. Không chạy nhiều ngoài systemd và sshd để giữ cho nó đơn giản

$ ps aux | sort -n -k6
...
root       316  0.0  0.0   7884   812 tty1     Ss+  14:37   0:00 /sbin/agetty --noclear tty1 38400
matt       682  0.0  0.0  24528   820 pts/0    S+   15:09   0:00 sort -n -k6
dbus       309  0.0  0.0  17280  1284 ?        Ss   14:37   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
matt       681  0.0  0.0  10808  1364 pts/0    R+   15:09   0:00 ps aux
root       308  0.0  0.0  26060  1516 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-logind
root       148  0.0  0.0  25972  1692 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-udevd
matt       451  0.0  0.0  78180  2008 ?        S    14:37   0:00 sshd: matt@pts/0
root       288  0.0  0.0  39612  2708 ?        Ss   14:37   0:00 /usr/sbin/sshd -D
matt       452  0.0  0.0  16452  3248 pts/0    Ss   14:37   0:00 -bash
root         1  0.0  0.0  32572  3268 ?        Ss   14:37   0:00 /sbin/init
root       299  0.0  0.0  69352  3604 ?        Ss   14:37   0:00 /usr/sbin/syslog-ng -F
root       449  0.0  0.0  78040  3800 ?        Ss   14:37   0:00 sshd: matt [priv]
root       161  0.0  0.0 358384  9656 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-journald

Thông báo thông tin bộ nhớ chi tiết nhất mà tôi có thể tìm thấy là này từ năm 2007 mà dường như đã dẫn đến việc bổ sung các lĩnh vực PSS để hạt nhân nói chung chiếm một quá trình nhưng mã python của họ là dành cho kernel cũ và tiếc là một số / proc / k * file đã biến mất kể từ đó. Tài liệu / Proc / meminfo cũng hữu ích nhưng cũng già đi một chút.

Vì vậy, một minh chứng cho những gì tôi đang nhìn thấy.

# cat /proc/meminfo
MemTotal:       16345780 kB
MemFree:        16129940 kB
Buffers:           10360 kB
Cached:            48444 kB
SwapCached:            0 kB
Active:            24108 kB
Inactive:          46724 kB
Active(anon):      12104 kB
Inactive(anon):     3616 kB
Active(file):      12004 kB
Inactive(file):    43108 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         11996 kB
Mapped:            16372 kB
Shmem:              3696 kB
Slab:              25092 kB
SReclaimable:      11716 kB
SUnreclaim:        13376 kB
KernelStack:         928 kB
PageTables:         2428 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172888 kB
Committed_AS:      34304 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      372788 kB
VmallocChunk:   34359362043 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

Nếu chúng ta thêm sử dụng:

MemTotal - MemFree - Buffers - Cached = Used
16345780 - 16129940 - 10360 - 48444 = 157036

Tất cả Hoạt động * / Không hoạt động * dường như là các bộ đếm được áp dụng trên một số trang (không phải tất cả) vì vậy có thể sao chép những gì được tính ở nơi khác.

Active + Inactive = Used
46724  + 24108    = 70832 (not quite)

Commited_AS ở đây dường như theo dõi sát với tổng số không gian chia sẻ bộ nhớ riêng tư / chia sẻ bộ nhớ từ / Proc / * / smaps. đưa PSS vào tài khoản cũng xếp hàng. (Không quan tâm, tôi nhận được một Cam kết_AS lớn hơn rất nhiều trên một debian 32 bit 2.6.32-5-686)

AnonPages + Mapped + Commited_AS = Userspace?
11996     + 16372  + 34304       = 62672

Slab là nội tuyến với / Proc / slabinfo

Slab +  Shmem + KernelStack + PageTables = Kernelspace?
25092 + 3696  + 928         + 2428       = 32144

Userspace? + Kernelspace? = Used?
62672      + 32144        = 94816

Vì vậy, ngắn ~ 63M. Tôi nhận ra rằng hạt nhân và tất cả các mô-đun được tải đang thiếu một số MB. Tấm có vẻ bao phủ rất nhiều, vì vậy nếu có bất kỳ mất tích, tôi không chắc chắn nếu điều đó sẽ tương đương với ~ 60Mb?

63 gần giống với con số Active + Inactive nhưng điều đó không đúng.

Vậy có ai biết công thức kỳ diệu không ?? Mặt khác, nếu hình tôi đang nhìn là đúng thì các vùng màu xám trong phân bổ bộ nhớ mà tôi có thể chọc vào là gì?

Nó xuất hiện linux ăn ram của tôi! Mặc dù một phần nhỏ hơn bình thường bị buộc tội =)

chỉnh sửa Commited_AS là một dự đoán từ hạt nhân của bộ nhớ cần bao nhiêu để chiếm 99,9% những gì nó đã cam kết, do đó không phải là một số được phân bổ thực sự. AnonPages + Mapped là một thành phần của nó, do đó để lại một lỗ lớn hơn, khoảng 100MB bây giờ.

User + Kernel
28368 + 32144 = 60512 != 157036

AnonPages và Mapped chủ yếu theo dõi với thông tin anon / ánh xạ từ / Proc / [0-9] * / smaps wgen dùng PSS / Shared vào tài khoản.

Các khu vực dành riêng dường như vừa vặn với khối đã lấy hết bộ nhớ:

Tổng freebộ nhớ là 16345032Kb
Tổng bộ nhớ hệ thống là 16777216Kb
PCI 'lỗ' - lspci -v 266520K = 16510696K Số lượng
dự trữ - dmesg 92793K = 16417903K

edit2 Tôi nhận thấy việc sử dụng bộ nhớ bổ sung này không có trên máy ảo đang chạy bên trong hộp ban đầu /proc/meminfo. Vì vậy, tôi bắt đầu chọc ngoáy xem có gì khác biệt giữa hai người. Cuối cùng nhận thấy rằng sự gia tăng tổng bộ nhớ vật lý có sẵn trùng khớp với sự gia tăng của bộ nhớ đã sử dụng.

phys 16GB used>144508     vm>50692      user>21500      kern>26428      u+ktot>47928
vm   64MB used>24612      vm>31140      user>14956      kern>14440      u+ktot>29396
vm  256MB used>26316      vm>35260      user>14752      kern>14780      u+ktot>29532
vm    1GB used>33644      vm>35224      user>14936      kern>14772      u+ktot>29708
vm    2GB used>41592      vm>35048      user>14736      kern>15056      u+ktot>29792
vm    4GB used>57820      vm>35232      user>14780      kern>14952      u+ktot>29732
vm    8GB used>82932      vm>36912      user>15700      kern>15388      u+ktot>31088
vm   12GB used>110072     vm>35248      user>14812      kern>15624      u+ktot>30436
vm   15GB used>122012     vm>35424      user>14832      kern>15824      u+ktot>30656

Tính ra là ~ 8Mb được phân bổ cho mỗi 1 GB bộ nhớ. Có thể là bản đồ bộ nhớ trong kernel ... nhưng tôi nghĩ rằng nó sẽ chỉ phát triển khi bộ nhớ được cấp phát chứ không phải là thiết lập khi khởi động.

Sẽ rất thú vị để xem nếu có ai có quyền truy cập vào bất kỳ máy bigmem nào nếu xu hướng tiếp tục?


psnằm bởi thiết kế. Đừng sử dụng nó cho kế toán bộ nhớ.
bahamat

2
chúc mừng, nhưng đây không phải là kiểm đếm ps. Đó là cách sử dụng tổng thể trong /proc/meminfo. Kế toán quy trình duy nhất là thông qua các smaps chiếm tài khoản cho bộ nhớ chung và riêng nhưng chỉ để so sánh với các giá trị AnonPages / Mapped từ meminfo.
Matt


do đó tài liệu tham khảo trong bài viết của tôi về linux thực sự ăn ram của tôi =)
Matt

Câu trả lời:


3

"Bộ nhớ được sử dụng bởi một quá trình" không phảimột khái niệm cắt rõ ràng trong các hệ điều hành hiện đại. Những gì có thể được đo là kích thước của không gian địa chỉ của quá trình (SIZE) và kích thước cài đặt thường trú (RSS, có bao nhiêu trang trong không gian địa chỉ hiện đang trong bộ nhớ). Một phần của RSS được chia sẻ (hầu hết các quy trình trong bộ nhớ đều chia sẻ một bản sao của glibc và do đó, đối với các loại thư viện chia sẻ khác; đọc-ghi dữ liệu với cha mẹ). Mặt khác, bộ nhớ được sử dụng cho quá trình bởi kernel không được tính, như bảng trang, bộ đệm kernel và ngăn xếp kernel. Trong bức tranh tổng thể, bạn phải tính đến bộ nhớ dành riêng cho card đồ họa, việc sử dụng kernel và các "lỗ hổng" dành riêng cho DOS và các hệ thống tiền sử khác (không nhiều,

Cách duy nhất để có được một bức tranh tổng thể là những gì kernel báo cáo như vậy. Cộng các số có chồng chéo không xác định và bỏ sót không xác định là một bài tập hay trong số học, không có gì hơn.


1
'bộ nhớ cho mỗi quá trình' không rõ ràng nhưng tôi không thể hiểu tại sao điều đó sẽ ảnh hưởng đến việc theo dõi việc sử dụng chung? Đối với kernel, tổng số PageTables, Slab, KernelStack và các bộ đếm mem không xử lý khác được báo cáo trong / Proc / meminfo và bao gồm trong những gì tôi đang cố gắng giải thích (quá trình mem dường như cũng ở đó). Ngoài các bộ đếm tổng thể mà tôi đã xem xét trên mỗi quá trình đánh vào anon / ánh xạ, bộ nhớ chia sẻ / riêng tư để có ý tưởng về nơi bộ nhớ quy trình có thể được tính trong / Proc / meminfo. Tôi đang nhắm đến tập hợp các số VM cộng với vật lý, mà tôi rõ ràng có một lỗ hổng.
Matt

1
Về cơ bản pslà không có khả năng kế toán chính xác cho bộ nhớ. Vì vậy, không sử dụng nó. Những psbáo cáo nào sẽ chỉ đúng nếu quá trình đó là người duy nhất chạy trên hệ thống (không thể thực hiện được). Để biết thêm về lý do tại sao bạn không làm điều đó với việc psđọc tại đây: Tìm hiểu cách sử dụng bộ nhớ trên Linux
bahamat
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.