Bagaimana Anda memperkirakan berapa banyak memori untuk dibeli?

10

Saya memiliki aplikasi server khusus yang berjalan pada Windows 2008 R2. Ini adalah Layanan Windows buatan rumah yang ditulis dalam .Net yang mendukung sejumlah terminal khusus. Saya memiliki mesin uji yang memiliki spesifikasi yang mirip dengan server langsung dan saya memiliki satu set simulator klien yang dapat saya gunakan untuk menghasilkan beban yang merupakan perkiraan wajar dari sistem nyata. Saya harus dapat mendukung 12.000 dari ini dan saat ini server kehabisan memori (Paging akan melalui atap).

Rencana saya adalah hanya memulai 100 simulator, mengukur penggunaan memori, kemudian mulai mengukur lebih dari 100 memori lagi dan mengulangi sampai paging mulai naik (Pada kenyataannya saya akan mengambil lebih dari tiga poin data.) Ini seharusnya memberi saya gambaran untuk jumlah memori tambahan yang diperlukan untuk 100 simulator dan memungkinkan saya untuk memproyeksikan berapa banyak memori yang dibutuhkan. Saya hanya perlu ide kasar +/- 30GB untuk menghindari membeli 2TB penuh (senilai $ 150.000) yang akan diambil server. Pertanyaan saya adalah apakah ini metode yang masuk akal untuk digunakan dan jika demikian, Penghitung Kinerja mana yang akan Anda monitor untuk memberikan jumlah memori yang sebenarnya digunakan?

Saya secara khusus berbicara tentang memori di sini sebagai perbedaan antara Working Set, Private Bytes, Committed, Shared, Virtual dan semua istilah memori lainnya membingungkan saya. Saya pikir saya dapat mengatur untuk memonitor CPU, IO dan Networking sendiri. Hal lain yang saya perhatikan adalah bahwa. Net Cache menyesuaikan penggunaan memorinya tergantung pada apa yang tersedia yang membuat sulit melihat tren.

Martin Brown
sumber
Saya akan sangat waspada memproyeksikan penggunaan memori berdasarkan 2 titik data yang begitu dekat. Saya akan memiliki keraguan serius bahwa penggunaan memori (dan I / O, dalam hal ini) akan skala secara linear. Mungkin, tapi saya menduga itu akan cenderung ke arah non-linear saat Anda pindah ke jumlah besar. Saya akan menguji dengan sejumlah titik data, berkembang dari kecil ke besar hingga kinerja menjadi bermasalah (paging, I / O saturation, dll) dan proyek dari sana. Jika mungkin untuk meningkatkan mesin secara bertahap dan terus mensimulasikan dengan nomor klien yang lebih besar, saya akan melakukannya sampai saya mendapatkan perasaan yang baik untuk bentuk kurva.
Evan Anderson
Anda juga perlu memberikan sedikit ide yang lebih baik tentang apa ini. Apakah ini web? aspx? php? Sesuatu yang tumbuh sendiri? Pekerjaan batch? Perilaku asp.net berbeda dari banyak ongkos yang berjalan pada sebuah kotak. Anda memerlukan ide dasar tentang apa yang digunakan sistem per pengguna - kira-kira. angka - dan kemudian sebuah amplop tua. Bagaimana Anda mendapatkan angka-angka itu tergantung pada cara kerja sistem Anda.
Ian Murphy
@Van. Saya selalu akan mengambil lebih dari dua titik data.
Martin Brown
@Ian: "beberapa ide dasar tentang apa yang digunakan sistem per pengguna" adalah apa yang saya coba cari tahu. Jika saya tahu ini, saya tidak perlu mengajukan pertanyaan. Saya telah memperbarui pertanyaan untuk mencoba membahas poin Anda yang lain.
Martin Brown

Jawaban:

8

Secara jujur? Aku TIDAK .
Saat menentukan server yang akan melihat segala jenis beban kerja nyata, saya menjejalkan RAM sebanyak yang saya mampu secara wajar (sistem lebih cenderung menghasilkan RAM yang dibatasi daripada CPU atau Disk yang dibatasi - satu-satunya hambatan yang dijamin lainnya adalah sisi depan bis).

Jika Anda ingin mengetahui berapa banyak RAM aplikasi Anda dapat menggunakan tes beban dasar seperti yang Anda usulkan adalah awal yang baik, tetapi jika Anda sudah memiliki sistem ini dalam produksi (sepertinya Anda lakukan) dan sistem produksi Anda menukar Anda tugas lebih mudah: Cari tahu berapa banyak ruang swap yang Anda gunakan -> Tambahkan setidaknya 2x lebih banyak RAM (bulatkan agar sesuai dengan kendala ukuran DIMM sistem Anda).

Jika Anda melakukan tes beban untuk mendapatkan angka kasar dan memperkirakan dari sana, ingatlah untuk memperhitungkan beberapa hal:

  1. Kurva memori mungkin akan menjadi dua segmen yang berbeda
    (peningkatan tajam awal sebagai kerangka kerja / shared library di-cache, kemudian kurva sedikit lebih curam karena setiap kode baru aplikasi yang tidak dapat dibagikan dimasukkan ke dalam memori)

  2. Anda masih memerlukan RAM gratis untuk disk dan caching perpustakaan bersama, dan untuk OS.
    (Ini harus setidaknya beberapa pertunjukan atas apa yang dibutuhkan aplikasi Anda)

  3. SEMUA perangkat lunak bocor memori (setidaknya semua perangkat lunak praktis tidak), jadi perhatikan itu dalam pengujian Anda dan pastikan Anda memiliki ruang untuk menangani kebocoran.

  4. Beban Anda mungkin akan meningkat selama masa pakai server. Rencanakan dengan tepat.
    (Jika Anda tidak memiliki angka perencanaan kapasitas yang baik, gandakan beban kerja hari ini dan rencanakan untuk mengatasinya).

  5. Membeli terlalu banyak RAM hari ini lebih murah daripada memiliki lingkungan Anda jatuh besok.

    • Konsekuensi Pertama: Jika Anda membeli server yang sedikit lebih besar daripada yang Anda butuhkan, Anda adalah admin yang memimpin yang membuat perusahaan tetap berjalan. Sebagian besar Anda akan diabaikan dan tidak dihargai.
    • Konsekuensi Kedua: Jika ukuran mesin Anda di bawah dan ada masalah, Anda adalah badut tidak kompeten yang tidak dapat mengantisipasi pertumbuhan 500%, dan semua orang membenci Anda.
voretaq7
sumber
Saya menyetujui akibat wajarnya.
mfinni
3
@mfinni Ini lucu karena itu benar !
voretaq7
Terima kasih untuk itu. Meskipun kami memiliki sistem ini hidup, saat ini mendukung uji coba yang sangat kecil yang berarti saya tidak bisa mendapatkan angka yang bagus dari itu.
Martin Brown
0

Terima kasih, pembaruan setidaknya memberi petunjuk kepada semua orang. Bahwa Anda merenungkan memori 2TB berarti Anda bermain di stadion baseball yang berbeda dengan pengaturan biasa. Sistem besar. benci memikirkan berapa banyak panas yang akan padam.

Mengingat bahwa ini merupakan proses server internal dan bahwa Anda kehabisan memori (Anda tidak mengatakan pada tingkat apa Anda mulai paging) tapi saya ingin menghilangkan kemungkinan bahwa proses server mengkonsumsi jumlah memori yang lebih besar sebelum pergi lebih lanjut. Jika ini terjadi tidak ada bedanya dengan apa yang Anda lakukan, sistem akan berhenti pada titik tertentu.

Saya tidak tahu ada alat generik yang dapat Anda gunakan untuk memberi Anda lebih dari sekadar gambaran umum tentang apa yang terjadi ... apa yang datang dengan windows. Proses layanan itu sendiri adalah kotak hitam dan tim pengembang Anda perlu menyediakan alat pemantauan.

Kembali cepat dari perhitungan amplop:

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

Ini tidak akan keluar dari kisaran set kerja .net exe yang normal.

Apakah layanan memiliki beberapa utas? Jika mereka meluncurkan utas untuk setiap koneksi, ada baiknya melihat bagaimana mereka melakukan ini. ProcExp.exe dari microsoft adalah cara mudah untuk melihat apakah Anda memiliki banyak utas dan apa yang dikonsumsi oleh utas tersebut. Ia tidak tahu tentang .net tetapi akan memberi Anda penghitung win32.

Bisakah Anda menunjukkan berapa banyak memori dan berapa banyak koneksi yang Anda miliki ketika melakukan pengujian sebelum mulai paging?

Jadi, bagaimana cara menetapkan jika proses server memiliki masalah kebocoran memori? Itu bisa mengakumulasi lebih banyak memori dengan setiap sesi terhubung, atau bisa juga mengakumulasi memori dan tidak membebaskannya.

Apa yang dapat Anda lakukan adalah - memilih sejumlah sesi yang tidak memicu paging dan mensimulasikan jumlah koneksi tersebut. - Jalankan simulasi lebih dari beberapa jam dan gunakan perfmon untuk menonton penghitung memori dasar. - Ulangi tes ini dengan sesi yang terhubung sebentar dan lepaskan.

Idenya adalah untuk melihat apakah layanan ini mengkonsumsi lebih banyak dan lebih banyak memori dengan setiap sesi, atau jika sesi terbuka memicu penggunaan memori yang semakin meningkat.

Ian Murphy
sumber