Ubuntu saya memakan lebih banyak memori daripada yang ditunjukkan oleh pengelola tugas:
sudo ps -e --format rss | awk 'BEGIN{c=0} {c+=$1} END{print c/1024}'
2750.29
free -m
total used free shared buffers cached
Mem: 3860 2765 1094 0 3 300
-/+ buffers/cache: 2461 1398
Swap: 2729 2374 354
Itu aneh. Adakah yang bisa menjelaskan perbedaan ini?
Tetapi yang lebih penting: Saya ingin tahu berapa banyak memori yang benar-benar digunakan oleh suatu proses. Saya tidak ingin tahu ukuran memori virtual, tetapi memori resident plus swap dari suatu proses.
Saya juga telah mencoba untuk output format param "sz" dari 'ps', tetapi jumlah ini adalah tinggi (16000 MB) (param 'size' memberikan 36700 MB). Apakah ada opsi lain?
Saya benar-benar ingin menggunakan ini, untuk menentukan program / proses mana yang memakan banyak memori (dan swap), untuk mematikannya, karena memori itu berharga :-) Ini benar-benar tidak masuk akal, jadi saya bertanya di sini.
Output dari / proc / meminfo:
MemTotal: 3952812 kB
MemFree: 1119192 kB
Buffers: 2676 kB
Cached: 290068 kB
SwapCached: 160980 kB
Active: 1805396 kB
Inactive: 731680 kB
Active(anon): 1745820 kB
Inactive(anon): 689184 kB
Active(file): 59576 kB
Inactive(file): 42496 kB
Unevictable: 148 kB
Mlocked: 148 kB
SwapTotal: 2795272 kB
SwapFree: 390900 kB
Dirty: 1984 kB
Writeback: 0 kB
AnonPages: 2085472 kB
Mapped: 67432 kB
Shmem: 190676 kB
Slab: 88012 kB
SReclaimable: 42704 kB
SUnreclaim: 45308 kB
KernelStack: 5496 kB
PageTables: 87860 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 4771676 kB
Committed_AS: 9522364 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 374404 kB
VmallocChunk: 34359330144 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 61440 kB
DirectMap2M: 4030464 kB
Jawaban:
Sistem memori virtual linux tidak begitu sederhana. Anda tidak bisa menambahkan semua kolom RSS dan mendapatkan nilai yang dilaporkan
used
olehfree
. Ada banyak alasan untuk ini, tetapi saya akan menemukan beberapa alasan terbesar.Ketika sebuah proses bercabang, baik orang tua dan anak akan ditampilkan dengan RSS yang sama. Namun linux mempekerjakan
copy-on-write
sehingga kedua proses tersebut benar-benar menggunakan memori yang sama. Hanya ketika salah satu proses memodifikasi memori yang akan benar-benar diduplikasi. Jadi ini akan menyebabkanfree
jumlahnya lebih kecil daritop
jumlah RSS.Nilai RSS tidak termasuk memori bersama. Karena memori bersama tidak dimiliki oleh satu proses apa pun,
top
tidak termasuk dalam RSS. Jadi ini akan menyebabkanfree
jumlahnya menjadi lebih besar daritop
jumlah RSS.sumber
Saya pikir Anda lebih baik mempercayai output "bebas" sejauh penggunaan total memori Anda, dan mempercayai "ps" untuk ide umum tentang berapa banyak memori yang digunakan oleh satu proses.
Hanya karena jumlah nilai "ps" RSS tidak sama dengan "gratis" tidak menghentikan Anda dari menyortir proses Anda dengan RSS dan mengevaluasi yang terbesar untuk pembunuhan.
Yang sedang berkata, jika semua usaha Anda hanya dalam pelayanan memastikan mesin dapat hibernasi, menciptakan lebih banyak swap (dalam bentuk file pada disk, jika perlu) mungkin merupakan jalan yang lebih mudah untuk diambil.
sumber
Saya akhirnya mendapat jawaban untuk pertanyaan saya. Ada sebuah program bernama smem (di Ubuntu / Debian
apt install smem
) yang memungkinkan Anda mendaftar swap dan menggunakan memori secara terpisah.Beberapa cara berbeda dari listing swap dapat ditemukan di sini: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ .
sumber