Saya memiliki server yang menjalankan Windows Server 2008 R2 x64 dengan 4GB RAM yang menampung sekitar 2-3 juta file, yang sebagian besar adalah file gambar.
Lebih dari satu minggu, saya perhatikan bahwa aplikasi pada server melambat menjadi merangkak karena paging yang berlebihan ke disk karena memori rendah, yang memiliki efek knock-on ke semua layanan yang saat ini berjalan di atasnya, menyebabkan utama masalah kinerja.
Setelah diselidiki di Task Manager, saya perhatikan bahwa hampir semua 4GB sedang digunakan tetapi ketika Anda melihat di tab Processes, jumlah semua penggunaan memori di sana tidak bertambah dan paling banyak hanya 1,5GB yang seharusnya digunakan.
Menggunakan Google untuk menemukan solusi, tampaknya sebagian besar RAM digunakan dalam "Metafile" yang merupakan cache informasi NTFS untuk file pada sistem file sehingga sistem tidak perlu meminta MFT untuk informasi lagi. Cache ini tidak pernah dihapus atau ditandai sebagai "cache" di Task Manager atau sebagai "Siaga" di RamMap Sysinternal.
Ada saran untuk menginstal perbaikan terbaru KB979149 tetapi setelah mencoba menginstalnya, dikatakan "Pembaruan ini tidak berlaku untuk komputer Anda".
Satu-satunya perbaikan sementara yang sejauh ini saya temukan adalah:
- Gunakan RAMmap dari Sysinternals ke "Empty System Working Set" setiap 1-3 hari yang menandai cache sebagai "standby" dan "cache" di Task Manager sehingga RAM dapat digunakan oleh aplikasi lain.
- Nyalakan ulang mesin, yang tidak diinginkan karena server ini melayani situs web publik.
Saat ini saya harus melakukan 2. perbaikan setiap beberapa hari untuk mencegahnya mencapai level bottleneck.
Sebelum: (800 MB RAM digunakan - aplikasi lain tidak dapat menggunakan RAM ini)
Setelah: (800 MB RAM ditandai sebagai cache - tersedia untuk aplikasi lain)
Jadi pertanyaan saya kepada Anda semua adalah: Apakah ada metode di luar sana untuk membatasi penggunaan RAM dari metafile ini?
Jawaban:
Metode terbaik untuk menangani masalah ini adalah dengan menggunakan
SetSystemFileCacheSize
API sebagai MS KB976618memerintahkandigunakan untuk menginstruksikan .Jangan menghapus cache secara berkala
Menggunakan
SetSystemFileCacheSize
fungsi daripada membersihkan cache secara berkala meningkatkan kinerja dan stabilitas. Menghapus cache secara berkala akan menghasilkan metafile yang terlalu banyak dan info lainnya dihapus dari memori, dan Windows harus membaca kembali informasi yang diperlukan kembali ke dalam RAM dari HDD. Ini menciptakan penurunan kinerja yang tiba-tiba dan parah selama beberapa detik setiap kali Anda membersihkan cache, diikuti oleh kinerja yang baik yang perlahan-lahan menurun saat memori dipenuhi dengan data metafile.Menggunakan
SetSystemFileCacheSize
fungsi ini menetapkan minimum dan maksimum yang akan menghasilkan Windows menandai data metafile lama yang berlebih sebagai memori siaga yang dapat digunakan atau dibuang oleh fungsi cache yang normal sesuai dengan tuntutan sumber daya saat ini dan prioritas cache yang normal. Ini juga memungkinkan lebih banyak data metafile daripada maksimum memori aktif yang Anda atur, berada di memori sebagai data siaga jika Windows tidak menggunakan memori untuk hal lain, sambil mempertahankan banyak memori yang tersedia. Ini adalah situasi yang ideal menjaga karakteristik kinerja sistem baik setiap saat.Program Pihak Ketiga Tidak Didukung oleh MS
Jika Anda seperti saya dan tidak ingin menjalankan biner dari pihak ketiga yang tidak dikenal di server produksi Anda, Anda ingin alat MS resmi atau beberapa kode yang dapat Anda periksa sebelum berjalan di server tersebut. Alat DynCache untuk 2008 R2 secara praktis tidak mungkin diperoleh dari M $ tanpa membayar untuk kasus dukungan dan terus terang, berdasarkan kode untuk 2008, tampaknya terlalu membengkak untuk tugas karena Windows sudah memiliki logika bawaan yang diperlukan untuk ukuran secara dinamis cache — itu hanya perlu tahu maksimum yang sesuai untuk sistem Anda.
Solusi untuk semua hal di atas
Saya menulis naskah Powershell yang bekerja pada mesin 64 bit. Anda harus menjalankannya sebagai administrator dengan hak yang lebih tinggi. Anda harus dapat menjalankannya, seperti pada x64 windows Vista / Server 2008 hingga dan termasuk 10 / Server 2012 R2 dengan jumlah RAM berapa pun. Anda tidak perlu menginstal perangkat lunak tambahan apa pun, dan akibatnya menjaga server / workstation Anda sepenuhnya didukung oleh MS.
Anda harus menjalankan skrip ini di setiap boot dengan hak istimewa yang ditinggikan untuk pengaturan menjadi permanen. Penjadwal Tugas Windows dapat melakukan ini untuk Anda. Jika instalasi Windows berada di dalam mesin virtual dan Anda mengubah jumlah RAM yang dialokasikan untuk VM itu, Anda juga harus menjalankannya setelah perubahan.
Anda dapat menjalankan skrip ini kapan saja pada sistem yang sedang berjalan bahkan saat digunakan dalam produksi tanpa harus me-reboot sistem atau mematikan layanan apa pun.
Ada garis di dekat bagian atas yang mengatakan
$MaxPercent = 12.5
bahwa set set kerja maksimum baru (memori aktif) menjadi 12,5% dari total RAM fisik. Windows akan secara dinamis mengukur jumlah data metafile dalam memori aktif berdasarkan permintaan sistem, jadi Anda tidak perlu menyesuaikan secara maksimal ini secara dinamis.Ini tidak akan memperbaiki masalah apa pun yang Anda miliki dengan cache file yang dipetakan menjadi terlalu besar.
Saya juga membuat
GetSystemFileCacheSize
skrip Powershell dan mempostingnya di StackOverflow .Sunting: Saya juga harus menunjukkan bahwa Anda tidak boleh menjalankan salah satu dari kedua skrip ini dari instance Powershell yang sama lebih dari sekali, atau Anda akan menerima kesalahan bahwa
Add-Type
panggilan telah dilakukan.Sunting:
SetSystemFileCacheSize
skrip yang diperbarui ke versi 1.1 yang menghitung nilai cache maks yang sesuai untuk Anda dan memiliki tata letak keluaran status yang lebih bagus.Sunting: Sekarang saya telah memutakhirkan laptop Windows 7 saya, saya dapat memberi tahu Anda bahwa skrip berjalan dengan sukses di Windows 10, meskipun saya belum menguji apakah masih diperlukan. Tetapi sistem saya masih stabil bahkan ketika memindahkan file HDD mesin virtual.
sumber
Saya tidak mengklaim sebagai ahli tentang cara kerja internal memori atau caching disk di OS Windows, tetapi saya memiliki dua pengamatan:
Jika OS tidak men-cache data dalam memori itu harus membacanya dari disk, yang merupakan media penyimpanan lambat secara eksponensial dari memori, sehingga masalah kinerja yang Anda lihat sekarang hampir pasti akan lebih buruk.
Anda mencoba menyelesaikan masalah dengan mengobati gejala masalah alih-alih penyebab masalahnya. Penyebab masalahnya hampir pasti adalah kurangnya RAM fisik yang cukup dan saran saya adalah untuk mengatasinya.
Selain itu, sementara cache mungkin menggunakan 1.5GB RAM saya akan bertanya-tanya apa penggunaan memori untuk proses dan layanan lain dan mungkin solusinya untuk menyelidiki penggunaan itu untuk masalah potensial.
sumber
Bagi orang-orang yang memberikan solusi yang jelas tetapi tidak efektif dengan hanya menambahkan lebih banyak RAM, Anda jelas belum pernah berurusan dengan masalah ini secara langsung.
Seperti yang dinyatakan oleh poster sebelumnya, tidak masalah berapa banyak RAM yang Anda lemparkan pada masalah ... semuanya akan terisi. Saya menjalankan alat Atlassian yang diatur pada server aplikasi kami yang dimigrasikan dari 32 bit (2003) ke 64 bit (2008). Segera jelas bahwa ada kerugian kinerja.
Saat melihat task manager, hampir semua memori habis; meskipun proses yang sedang berjalan tidak mencerminkan hal ini. Ketika kami menambah memori dari 8 GB menjadi 16 GB, masalahnya juga menghabiskan memori tambahan.
Satu-satunya cara untuk mengatasi masalah ini adalah me-restart server, yang menurunkan penggunaan memori sama dengan proses (sekitar 3,5 GB). Ini mulai mendaki lagi dalam satu atau dua hari.
Saya tahu ini adalah bug / fitur Microsoft baru dan senang menemukan artikel ini. Saya suka bagaimana Microsoft meninggalkan detail yang sangat penting ini untuk diketahui oleh pengguna. Saya mengunduh RamMap, yang menurut Anda akan menjadi utilitas asli, dan sekarang saya dapat melihat penggunaan Metafile. Kami akan mengatur cache untuk dihapus setiap beberapa hari dan mudah-mudahan ini akan menyelesaikan masalah.
Sangat menarik bahwa saya hanya melihat masalah ini pada satu dari beberapa server kami yang dimigrasi, jadi saya bertanya-tanya apakah metafile hanya diumpankan dari jenis aplikasi tertentu.
sumber
Masalah ini dapat diatasi dengan cepat dan gratis menggunakan alat SysInternals CacheSet. Cukup atur set kerja maksimum ke nilai yang sesuai kurang dari jumlah RAM sistem, dan terapkan.
sumber
Maaf untuk menjadi begitu langsung, tetapi bagaimana dengan Anda meningkatkan server ke jumlah ram yang sedikit lebih tinggi dari apa yang dimiliki workstation hari ini? 16GB memroy sangat murah. Lebih murah daripada setengah hari dari waktu Anda.
sumber
Berikut ini tautan untuk mengunduh alat Microsoft DynCache - tidak perlu membuat tiket atau membayar. http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258
(permintaan maaf - hanya memperhatikan sekarang bahwa ini bukan untuk versi R2)
Masalah yang diketahui untuk melanjutkan pertumbuhan cache dijelaskan di sini di blog Microsoft: http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx
[perbarui] perbaikan yang berfungsi untuk Windows Server 2008 R2.
Saya menemukan kode sampel C # pada Codeplex, dengan cepat membuat proyek konsol C # dengan Visual Studio dan dikompilasi, berfungsi.
Catatan, Anda harus menambahkan referensi ke Microsoft.AnalysisServices.AdomdClient yang dapat ditemukan di sini:
dan komentar metode ClearAllCaches () dengan (dalam kasus saya) referensi yang tidak diperlukan untuk XMLaDiscover. Buang ini ke dalam TaskScheduler.
sumber
Anda bisa mendapatkan alat DynCache dari MS yang akan memungkinkan untuk membatasi penggunaan RAM dengan metafile.
Klik di sini untuk mendapatkan alat dari MS .
sumber