Bagaimana menjelaskan penggunaan memori pada Windows Server di luar daftar proses yang sedang berjalan

9

Saya memiliki Windows 2003 Server berjalan agak lambat di mana biaya komit dan penggunaan file halaman berdetak dan naik sampai akhirnya saya reboot. Untuk memperbaikinya, saya perlu mencari tahu apa yang menghabiskan semua memori, dan di sinilah misteri besarnya.

Statistik terkini dari Task Manager:

Physical Memory (K): 2096400
Commit Charge (K):   5364848
Page file usage:     5.11 GB

Baik, jadi mari kita tarik SysInternals Process Explorer dan periksa ukuran set yang berfungsi dari semua yang berjalan. Penyebab terbesar adalah contoh Tomcat menggunakan 121.980K WS, 481.284K Ukuran VM. Tidak ada yang mendekati menjelaskan biaya komit 5 GB.

Langkah selanjutnya: SysInternals pslist : pslist -m, berpisah output dengan kolom dan kolom menghitung jumlah untuk 61 proses yang dilaporkan.

SUM (Working Set)  : 681,484 K
SUM (Private Bytes): 593,424 K

Apakah saya salah paham secara mendasar tentang apa yang dilaporkan oleh alat? Saya selalu berada di bawah kesan bahwa OS akan benar-benar melakukan memori jauh lebih sedikit daripada jumlah penuh memori virtual yang dipetakan oleh suatu proses, dengan asumsi bahwa itu tidak akan benar-benar pernah menggunakan sebanyak itu, dan bahwa melihat VM di sini adalah ikan herring merah.

jpdaigle
sumber
1
Pembaruan: Ya, sistem ini adalah paging, dan saya sering mendapatkan peringatan "Kehabisan memori virtual". Setiap kali saya mendapatkan peringatan, saya memeriksa statistik memori dan tidak ada proses yang tampaknya sangat nakal, tetapi stat Memory, Commited Bytes selalu lebih dari 5 GB.
jpdaigle

Jawaban:

1

JP, saya yakin komentar Anda bahwa ini adalah server uji build / unit otomatis yang menjalankan kode kurang stabil mengatakan itu semua. Dugaan saya adalah bahwa server ini perlu di-reboot berulang kali karena kode yang tidak stabil berjalan di atasnya mungkin memiliki kebocoran memori yang memberi Anda gejala yang Anda lihat. Kebocoran memori tidak akan didaftar pada pohon proses proses yang sedang berjalan karena mereka adalah memori yang diambil oleh proses yang tidak lagi ada, dan masih dialokasikan, meskipun proses yang terkait dengannya sudah lama hilang.

Dapatkan jendela perawatan yang sering untuk memungkinkan Anda me-reboot mesin ini secara otomatis, mungkin setiap malam, beberapa kali seminggu, atau setiap minggu tergantung pada kecepatan di mana perilaku ini mulai menunjukkan masalah kinerja.

Kami memiliki server Oracle Application Server di Windoze beberapa waktu lalu yang perlu di-reboot dua kali sehari. Kami mengusir para pengguna saat makan siang, dan di tengah malam setiap hari. Itu beberapa tahun yang lalu, dengan kode produksi yang seharusnya stabil dari Oracle.

Kevin K.
sumber
2

Maaf hanya menyisipkan beberapa tautan - tetapi kami telah menggunakan beberapa teknik untuk menemukan kebocoran memori, menggunakan logparser dan PowerShell, jadi saya akan berbagi.

http://blogs.msdn.com/debuggingtoolbox/archive/2008/08/22/powershell-script-chart-and-statistics-from-top-20-objects-leaking.aspx

(Situs Debugger-Mu Tidak Diragukan lagi sangat bagus): http://blogs.msdn.com/carloc/archive/2007/09/14/something-you-need-to-know-before-start-debugging.aspx

Saya juga akan memberikan tautan ke wawasan Mark Russinovich yang sangat baik untuk Penggunaan Memori di Windows:

http://blogs.technet.com/markrussinovich/search.aspx?q=memory&p=1

Pendek membuka kasus Microsoft yang sebenarnya, situs Tim Kinerja memiliki banyak info bagus, juga: http://blogs.technet.com/askperf/Default.aspx?p=2

mctsonic
sumber
1

Alat utama untuk membantu mendiagnosis ini adalah perfmon. Penghitung yang akan saya lihat (untuk memulai) adalah:

Memory, Committed Bytes, ini adalah ukuran dari permintaan untuk memori virtual.
Process, Working Set, _Total virtual memory dalam "aktif" menggunakan
Paging File,% pagefile dalam penggunaan
Memory, Pages / Sec (ini bukan merupakan indikator dari memori rendah) , meskipun semua orang tampaknya menganggapnya demikian)
Memori, Output Halaman / Sec berapa banyak halaman memori virtual ditulis ke pagefile untuk membebaskan frame halaman RAM untuk keperluan lain setiap detik

Memori, Memori Cache Bytes
, Memori Bytes Non
Paged Pool, Pool Bytes
Memory, Kode Sistem Total Bytes
Memory, Sistem Driver Total Bytes

ketika jumlah ini mendekati 2GB Anda akan memiliki masalah kinerja biasanya karena arsitektur 32 bit

Memory, Available MBytes - ini mengukur berapa banyak RAM yang tersedia untuk memenuhi permintaan akan memori virtual (baik alokasi baru, atau untuk mengembalikan halaman dari pagefile).

Lihat juga http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm

Jim B
sumber
Tautan menarik. Di server ini, saya melihat Total Proses Bekerja Set pada 640MB, tetapi "Memory, Committed Bytes" adalah 5.4GB. Tidak ada penghitung lain yang Anda sebutkan sangat tinggi. Saya sering mendapatkan peringatan "Kehabisan memori virtual", itulah sebabnya saya sedang menyelidiki. Menambahkan komentar ke OP.
jpdaigle
1

Berapa lama server telah berjalan sejak reboot terakhir? Ini adalah fakta kehidupan yang disayangkan bahwa Windows memiliki kebocoran memori. yaitu Memori yang dialokasikan tidak selalu dilepaskan kembali ke sistem. Gejala-gejalanya persis seperti yang Anda lihat. Jika Anda belum melakukannya saya sarankan me-reboot setidaknya sekali seminggu. Banyak pusat data yang me-reboot Windows setiap hari, karena hal itu sangat mengurangi panggilan dukungan. Tentu saja itu jauh lebih mudah dilakukan ketika Anda menggunakan cluster karena tidak ada down time.

John Gardeniers
sumber
0

Dikatakan bahwa ada sysadmin di suatu tempat yang benar-benar memahami statistik memori Windows, tetapi saya belum pernah bertemu mereka.

Namun biasanya tidak terlalu sulit untuk menemukan proses pelanggaran. Coba gunakan Perfmon untuk melihat berbagai proses penghitung seperti gagang atau Halaman kesalahan / detik.

JR

Pikiran lebih lanjut: apakah Anda yakin memori Anda sebenarnya rendah. Kuncinya adalah apakah Anda mendapatkan paging. Jika tidak ada paging, Anda tidak kekurangan memori. Menggunakan PerfMon lihat di penghitung Memory - Pages / sec.

John Rennie
sumber
Saya tidak melihat sesuatu yang jelas dalam proses yang berjalan. Apakah ada cara yang memungkinkan memori untuk tidak dapat digunakan kembali oleh OS setelah proses keluar? Ini adalah server uji coba build / unit otomatis, jadi tentu saja proses crash setiap saat, karena selalu menjalankan build berdarah yang dibangun secara otomatis dari SVN.
jpdaigle
Lihat hasil edit saya untuk beberapa pemikiran lebih lanjut
John Rennie
0

Ingat bahwa set kerja adalah sedikit memori yang sebenarnya diwakili oleh memori fisik NYATA. Anda juga memiliki biaya memori virtual, dan Windows melakukan pembagian halaman kode, beberapa potongan MFC akan dibagikan di antara banyak dan banyak proses tanpa menduplikasi penggunaan memori. Ditambah lagi Anda memiliki keinginan Windows yang tak henti-hentinya untuk menyimpan cache sistem file sebesar mungkin (saya pernah melihatnya menggelembung hingga 800MB pada laptop 2.5GB sebelumnya).

Manajemen memori Windows sangat kuat. Namun begitu Windows mulai paging, segalanya menjadi jelek, dan Anda SELALU harus meninggalkan ruang untuk cache sistem file - selalu selalu selalu. Saya secara rutin harus mematikan dan memulai kembali Firefox ketika 80+ tab saya mendorong konsumsi memorinya hingga 1.2gb / 1.2+ gb.

Windows juga mengaburkan garis sedikit, antara halaman yang ada di cache, dan halaman yang terdaftar sebagai memori / set kerja.

Chris K
sumber