Ubuntu Linux: Memproses pertukaran memori dan penggunaan memori

14

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
David Halter
sumber
Saya harus menunjukkan bahwa "1043.84" tidak jauh dari "1178", yang merupakan angka yang akan Anda dapatkan dengan perhitungan yang Anda lakukan.
cjc
Saya benar-benar memiliki pertanyaan yang sama di unix.stackexchange (+1). Patrick meniup pikiran saya di sana juga: P-- unix.stackexchange.com/questions/34795/...
GoldenNewby

Jawaban:

10

Sistem memori virtual linux tidak begitu sederhana. Anda tidak bisa menambahkan semua kolom RSS dan mendapatkan nilai yang dilaporkan usedoleh free. 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-writesehingga kedua proses tersebut benar-benar menggunakan memori yang sama. Hanya ketika salah satu proses memodifikasi memori yang akan benar-benar diduplikasi. Jadi ini akan menyebabkan freejumlahnya lebih kecil dari topjumlah RSS.

  • Nilai RSS tidak termasuk memori bersama. Karena memori bersama tidak dimiliki oleh satu proses apa pun, toptidak termasuk dalam RSS. Jadi ini akan menyebabkan freejumlahnya menjadi lebih besar dari topjumlah RSS.

Patrick
sumber
Oh terima kasih! Saya selalu berpikir, bahwa -m bebas menunjukkan jumlah memori bersama aktual dari seluruh sistem. Tetapi seperti yang ditunjukkan "man ps": "Kolom memori bersama harus diabaikan; itu sudah usang."
David Halter
Maaf, saya tidak dapat menerima jawaban ini, karena tidak menjawab masalah swap, tapi terima kasih!
David Halter
@ Davidvid Apa masalah swap? Informasi yang saya berikan berlaku untuk semua memori, termasuk swap.
Patrick
memori bersama tidak terlalu besar, biasanya? Setidaknya itulah yang saya lihat di task manager. Tetapi swap saya cukup banyak digunakan: 1035 MB; Jumlah PS adalah 1 GB dan jumlah swap + rss> 2 GB. Saya ingin melihat berapa banyak memori yang digunakan oleh suatu proses, bukan hanya rss. Yang lebih menarik adalah berapa banyak memori yang ditukar dengan suatu proses.
David Halter
1
@ Davidvidal jika Anda ingin melihat berapa banyak memori yang digunakan proses (termasuk dibagi), kemudian lihat kolom 'VSZ'.
Patrick
1

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.

datn
sumber
1

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/ .

David Halter
sumber