RAM miễn phí biến mất - Rò rỉ bộ nhớ?


11

Trên hệ thống khởi động mới, freebáo cáo khoảng 1,5G RAM đã sử dụng (RAM 8G hoàn toàn, Ubuntu 12.04 với máy tính để bàn lightdm và plasma, một cửa sổ konsole bắt đầu). Có các ứng dụng đang chạy tôi sử dụng, nó vẫn tiêu thụ không quá 2G. Tuy nhiên, khi hệ thống hoạt động được vài ngày, ngày càng nhiều RAM miễn phí của tôi biến mất - mà không hiển thị trong danh sách các ứng dụng đã sử dụng: trong khi smem --pie=namebáo cáo sử dụng ít hơn 20% (và có sẵn 80%), mọi thứ khác nói khác nhau free -mví dụ báo cáo về ngày 7:

             total       used       free     shared    buffers     cached
Mem:          7459       7013        446          0        178        997
-/+ buffers/cache:       5836       1623
Swap:         9536        296       9240

(vì vậy bạn có thể thấy, đó không phải là bộ đệm hoặc bộ đệm). Hôm nay, điều này cuối cùng đã kết thúc với việc hệ thống bị sập hoàn toàn: trình quản lý windows đã biến mất, các ứng dụng "treo lơ lửng" (không khung) - và một cửa sổ bật lên thông báo cho tôi về "quá nhiều tệp đang mở". Báo cáo nhật ký hệ thống:

kernel: [856738.020829] VFS: file-max limit 752838 reached

Vì vậy, tôi đã đóng những ứng dụng mà tôi có thể đóng và giết X bằng cách sử dụng Ctrl-Alt-backspace. X đã cố gắng trở lại sau đó với failafeX, nhưng không thể làm như vậy vì nó không thể phát hiện ra cấu hình của nó nữa. Vì vậy, tôi đã chuyển sang một bảng điều khiển bằng Ctrl-Alt-F2, nắm bắt tất cả thông tin tôi có thể nghĩ đến (vmstat, miễn phí, smem proc/meminfo, lsof, ps aux) và cuối cùng được khởi động lại. X lại xuất hiện với failafeX; lần này tôi bảo nó "phục hồi từ cấu hình đã sao lưu", sau đó chuyển sang giao diện điều khiển và sử dụng thành công startxđể đưa ra môi trường đồ họa.

Tôi không có manh mối thực sự về nguyên nhân gây ra vấn đề này - mặc dù nó phải làm với chính X hoặc với một số quy trình người dùng chạy trên X - như sau khi giết X, free -mđầu ra trông như thế này:

             total       used       free     shared    buffers     cached
Mem:          7459       2677       4781          0         62        419
-/+ buffers/cache:       2195       5263
Swap:         9536         59       9477

(~ 3,5 GB được giải phóng) - để so sánh với đầu ra sau khi bắt đầu mới:

             total       used       free     shared    buffers     cached
Mem:          7459       1483       5975          0         63        730
-/+ buffers/cache:        689       6769
Swap:         9536          0       9536

Hai đầu ra hữu ích hơn được cung cấp bởi memstat -u. Một thời gian ngắn trước khi gặp sự cố:

User     Count     Swap      USS      PSS      RSS
mail         1        0      200      207      616
whoopsie     1      764      740      817     2300
colord       1     3200      836      894     2156
root        62    70404   352996   382260   569920
izzy        80   177508  1465416  1519266  1851840

Sau khi giết X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      184      188      356
izzy         1     1400      708      739     1080
whoopsie     1      848      668      826     1772
colord       1     3204      804      888     1728
root        62    54876   131708   149950   267860

Và sau khi khởi động lại, quay lại X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      212      217      628
whoopsie     1        0     1536     1880     5096
colord       1        0     3740     4217     7936
root        54        0   148668   180911   345132
izzy        47        0   370928   437562   915056

Sử dụng hệ thống tệp trong một tuần Sử dụng kernel / CPU trong một tuần

Chỉnh sửa: Chỉ cần thêm hai biểu đồ từ hệ thống giám sát của tôi. Thú vị để xem: mọi lúc khi có "bước nhảy" trong mức tiêu thụ bộ nhớ, CPU cũng đạt đỉnh. Chỉ cần tìm thấy điều này ngay bây giờ - và nó nhắc tôi về một chỉ báo khác chỉ vào chính X: Thường khi quay trở lại máy của tôi và mở khóa màn hình, tôi đã tìm thấy một cái gì đó làm việc nặng trên CPU của mình. Kiểm tra với top, nó luôn luôn là /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none.

Vì vậy, sau lời giải thích dài này, cuối cùng câu hỏi của tôi:

  1. Điều gì có thể là nguyên nhân có thể?
  2. Làm thế nào tôi có thể xác định tốt hơn các quy trình / ứng dụng liên quan?
  3. Những bước nào có thể được thực hiện để tránh hành vi này - không khởi động lại máy trong tất cả X ngày?

Tôi đã chạy 8.04 (Hardy) khoảng 5 năm trên máy cũ của mình, chưa bao giờ gặp phải lỗi như vậy (luôn luôn hơn 100 ngày thời gian hoạt động, trước khi khởi động lại ví dụ như cập nhật kernel). Đây là một máy hoàn toàn mới với bản cài đặt mới 12.04 . Trong trường hợp có vấn đề, một số thông số kỹ thuật:

AMD A4-3400 APU với Đồ họa HD Radeon (tm), sử dụng trình điều khiển ati / radeon mã nguồn mở (vì vậy không cài đặt fglrx), RAM 8GB, WDC WD1002FAEX-0 hdd (1TB), bo mạch chính Asus F1A75-V Evo. Ubuntu 12.04 64-bit với KDE4 / Plasma. Các ứng dụng thường mở ít nhiều vĩnh viễn bao gồm Evolution, Firefox, konsole (với Midnight Commander chạy bên trong, khoảng 4 tab) và LibreOffice - cộng với thỉnh thoảng Calibre, Gimp và Moneyplex (phần mềm ngân hàng tôi đã sử dụng gần 20 năm nay, trong một phiên bản đã làm tốt trên Hardy).

Chỉnh sửa: Hôm nay tôi tìm thấy một trong những "kẻ ác": máy tính để bàn plasma KDE4s. Sử dụng bộ nhớ là một lần nữa lên đến 5GB, khi tôi đã làm một killall plasma-desktop && plasma-desktop. Điều này giải phóng RAM 1,3 GB! psnói:

                             RSS    SIZE   VSZ
plasma usage before restart  120988 526472 1300816
plasma usage after restart   92352  495972 1263632

Vậy những chiếc 1.3GB đó đã ở đâu? Sự khác biệt giữa các giá trị đó, nếu được thêm vào, lên tới 96MB - không phải 1,3 GB.

Và đây chỉ có thể là một phần, vì vẫn còn 3,7 GB đang được sử dụng (nên dưới 2 GB). Tôi đã theo dõi điều này trong 6 ngày qua bằng cách sử dụng một số công cụ: bộ nhớ đã sử dụng (không nói về bộ đệm và bộ đệm) tăng chậm nhưng đều đặn. Ngay cả khi tôi không ở bàn làm việc để chạy bất cứ thứ gì ...

Để theo dõi các quy trình với các tệp đang mở, tôi hiện đang sử dụng 1 lớp lót sau (tôi thích shell và đặc biệt là bash) để có được top 5:

echo "$(for pid in $(ls -a /proc|egrep '^([0-9])*$'|sort -n 2>/dev/null); do \
if [ -e /proc/$pid/fd ]; then FHC=$(ls -l /proc/$pid/fd|wc -l); \
if [ $FHC -gt 0 ]; then PNAME="$(cat /proc/$pid/comm)"; \
echo "$FHC files opened by $pid ($PNAME)"; fi; fi; done)"|sort -r -n|head -n5

Lệnh ở đây trong 4 dòng để dễ đọc hơn. Chưa có gì nhiều từ đó - ngoại trừ việc Skype không thích kết nối Internet bị hỏng. Mỗi lần ngắt kết nối làm tăng nhẹ các tệp đang mở của nó, nhưng không có gì đáng kể. Mặt khác, có vẻ như plasma cũng chịu trách nhiệm cho điều đó:

Sử dụng VFS (2 ngày)

Xem thả tập tin xử lý ở cuối? Đó là khởi động lại plasma.


sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'xóa ram thêm không? Bạn có thể xem các tệp đang mở của các chương trình bằng cách sử dụnglsof
Savvas Radevic

Ngoài ra, bạn đã thử chuyển đổi trình quản lý máy tính để bàn? ví dụ: lxde (hay máy tính để bàn) Cuối cùng, bạn có chắc chắn đầu ra vào đĩa là tốt? Bạn đã kiểm tra dữ liệu SMART của đĩa và tốc độ sao chép tệp từ / vào đĩa bằng đĩa cd trực tiếp chưa?
Savvas Radevic

Kiểm tra điều này để kiểm tra xem bạn có bị rò rỉ không Cách phát hiện rò rỉ bộ nhớ
Mitch

@medigeek: Như tôi đã chỉ ra, cache và bộ đệm không phải là vấn đề. Xem đầu ra của free. Chuyển sang một DE khác tôi thực tế đã xem xét; nếu KDE3.5 đã có sẵn, tôi đã không kết thúc với Plasma. Điều này chỉ có thể là tạm thời để xem Plasma có liên quan.
Izzy

@Mitch: Tôi hiểu rằng memprof sẽ được sử dụng để chống lại một quá trình đã biết (mà tôi chưa bị cô lập). Chắc chắn nó có thể được sử dụng trên toàn hệ thống? Hơn nữa, như lỗi "quá nhiều tệp mở" cho thấy, đối với tôi, có vẻ như một số quy trình đang mở rất nhiều xử lý tệp, không bao giờ phát hành chúng. Không chắc chắn nếu điều đó sẽ bị bắt bởi memprof. Bây giờ tôi đã thiết lập một kịch bản để nắm bắt các quy trình top 5 bằng cách mở các tệp - hy vọng điều này sẽ biến thành kịch bản xấu.
Izzy

Câu trả lời:


6
  1. Số lượng lớn các tệp đang mở là một đầu mối tốt cho thấy có gì đó không ổn. Tôi đoán sẽ là một số daemon hệ thống KDE.

  2. Mở một giao diện điều khiển và chạy "đầu". Sau đó, sử dụng <và> để thay đổi cột sắp xếp thành VIRT hoặc RES và xem chương trình nào đang sử dụng nhiều bộ nhớ nhất. Rò rỉ bộ nhớ sẽ hiển thị dưới dạng sử dụng bộ nhớ ảo bị thổi phồng ồ ạt, vì một khi con trỏ đến bộ nhớ bị rò rỉ sẽ không được sử dụng và sẽ bị tráo đổi. Cũng chạy "lsof" và tìm kiếm một quy trình có nhiều tệp đang mở, vì đây dường như thực sự là một rò rỉ mô tả tệp.

  3. Theo dõi chương trình và báo cáo lỗi.


Tôi đã cố gắng tận dụng top / htop cho việc này. Rắc rối là, nó không cho thấy kết quả nào đối với bộ nhớ RESident (như được mô tả ở trên, chỉ một phần nhỏ của bộ nhớ được sử dụng có thể được kết nối với các ứng dụng đang chạy). Và đối với bộ nhớ VIRTual, thật khó để diễn giải (ngay cả sau khi khởi động, bộ nhớ ảo đã sử dụng tổng số tiền lên tới 3TB ở đây - một kích thước mà ngay cả ổ cứng của tôi cũng không thể xử lý). Vì vậy, hiện tại, ví dụ Evolution sử dụng VIRT 1.9GB, theo bộ nhớ, trong khi bộ nhớ tổng thể sử dụng tổng cộng lên tới 1,2GB (không bao gồm bộ đệm và bộ đệm). Và vâng, ý định đầu tiên của tôi là theo dõi chương trình, vì vậy tôi có thể báo lỗi ...
Izzy

Chỉ cần thêm 2 imss từ hệ thống giám sát của tôi. Có vẻ như "cú nhảy" luôn xảy ra vào cùng một thời điểm trong ngày (mặc dù chỉ có 1 ngoại lệ). Thật không may, các imss không có dấu thời gian để kiểm tra với cron. Btw: có cách nào để theo dõi quá trình nào có bao nhiêu tệp được mở không?
Izzy

1
Dự đoán của bạn là một trong những tốt. Mặc dù không phải là daemon, nhưng nó chủ yếu là một thành phần KDE: plasma-desktop (xem ở trên). Điều thú vị về nó: Tôi chỉ cần tìm ra, và đăng nó ở đây - và 10 phút sau trên nhật báo của tôi apt-get update && apt-get upgradecó một bản cập nhật cho máy tính để bàn plasma; Những kẻ đó rất nhanh X) Bây giờ tôi chỉ xem một lúc để xem vấn đề đã được giải quyết chưa, trước khi tôi tuyên bố như vậy. Cho đến nay, mọi thứ có vẻ khá hứa hẹn.
Izzy

Vẫn có vẻ ổn định. Mặc dù lsofcũng không topchỉ cho tôi "quá trình tà ác", nhưng suy đoán của bạn liên quan đến daemon KDE đã chỉ cho tôi theo hướng của kẻ gây rối. Vì vậy, cảm ơn bạn một lần nữa - thời gian hoạt động của máy của tôi bây giờ là khoảng 14 ngày và mọi thứ vẫn ổn định, mặc dù tôi thậm chí còn chạy các thứ như VirtualBox, biên dịch, v.v. Vì vậy, tôi xem xét điều này đã được giải quyết và đánh dấu trận đấu gần nhất :)
Izzy

0

Tôi nghĩ rằng đó là hành vi hệ thống bình thường. Nhiều khả năng mọi thứ đều ổn.

Bạn có thể đọc bài báo tuyệt vời này (linux ăn ram của tôi) để hiểu, cách linux quản lý ram của bạn và tại sao không cần phải lo lắng:

http://www.linuxHRyram.com/


4
Ồ - tôi chưa bao giờ nghe nói rằng đó là "hành vi hệ thống bình thường" nếu hệ thống gặp sự cố sau 7 ngày với lỗi "quá nhiều tệp đang mở". Tôi đang chạy Linux khoảng 15 năm nay, chưa bao giờ có điều này. Và vâng, tôi hoàn toàn hiểu cách Linux sử dụng "RAM miễn phí" (sử dụng nó để lưu vào bộ đệm, v.v.) Như đã chỉ ra ở trên: bộ đệm và bộ đệm không phải là vấn đề ở đây. Tôi không nói về việc RAM được sử dụng vì những lý do chính đáng - Linux sẽ không bao giờ dính vào bộ đệm cho giá của việc hoán đổi.
Izzy
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.