Apakah penggunaan memcache akan mengurangi memori instance saya?

Saat ini saya mengalami kesalahan memori lunak pada aplikasi Google App Engine saya karena penggunaan memori yang tinggi. Sejumlah objek besar meningkatkan penggunaan memori.

Saya pikir mungkin jika saya mengatur dan mengingatnya dari memcache mungkin itu dapat mengurangi penggunaan memori secara keseluruhan. Membaca dokumen, tampaknya hal ini tidak terjadi, dan manfaat memcache adalah mengurangi pertanyaan HRD.

Apakah memcache berdampak positif atau negatif pada keseluruhan memori?

Sunting: Saya tahu saya dapat meningkatkan kelas instance ke F2 tetapi saya mencoba melihat apakah saya dapat tetap menggunakan kelas yang paling murah sambil mengurangi memori.


person user1961    schedule 22.04.2015    source sumber


Jawaban (1)


Memindahkan objek ke dan dari Memcache tidak akan berdampak pada memori Anda kecuali Anda menghancurkan objek tersebut di kode Java atau koleksi kosong Anda.

Masalah yang lebih besar adalah entitas memcache dibatasi hingga 1 MB, dan memcache tidak dijamin. Batasan pertama berarti Anda tidak dapat memasukkan objek yang sangat besar ke dalam Memcache.

Batasan kedua berarti Anda tidak dapat dengan mudah mengganti, misalnya, HashMap dengan memcache - tidak mungkin untuk mengetahui apakah getValue() mengembalikan null karena suatu objek tidak ada atau karena objek tersebut dikeluarkan dari memcache. Jadi, Anda harus melakukan panggilan tambahan setiap kali ke penyimpanan data untuk melihat apakah suatu objek benar-benar tidak ada.

person Andrei Volgin    schedule 22.04.2015
comment
Hal ini secara umum benar, saya dapat melihat kasus di mana memcache dapat membantu. Jika kode menggunakan banyak memori untuk menghitung hasil yang kecil, mungkin hasilnya dapat di-cache sehingga mengurangi kebutuhan untuk menghitungnya dan mengurangi penggunaan memori. Jika pertanyaan mengenai skenarionya tidak terlalu kabur, maka akan lebih mudah untuk memberikan alternatif - person Zig Mandel; 22.04.2015
comment
Saya tidak yakin bagaimana caching objek kecil (hasil) akan mengurangi penggunaan memori. Biasanya, Anda memerlukan banyak memori ketika Anda harus membaca banyak data ke dalam memori dan Anda tidak dapat membuangnya sampai akhir. Saya setuju bahwa ada banyak cara untuk mengurangi penggunaan memori, terutama jika melibatkan loop dan koleksi. - person Andrei Volgin; 22.04.2015
comment
Terima kasih keduanya. Skenario saya adalah saya memiliki banyak permintaan untuk membaca gumpalan yang sama tanpa mengubahnya. Memuatnya berulang kali di banyak permintaan tampaknya mendorong penggunaan memori lebih dari 128MB - person user1961; 23.04.2015
comment
Ulangi karena Anda menghemat penghitungan ulang nilai dari sumber yang mungkin membutuhkan banyak memori. OP sebaiknya mempertimbangkan untuk menyimpan objek dalam memori global (dengan pertimbangan yang tepat untuk permintaan paralel ke instance yang sama) jika Anda memiliki banyak permintaan simultan dan membuat salinannya. - person Zig Mandel; 23.04.2015
comment
Sepertinya ada kebocoran memori dalam implementasi Anda. Memuat blob yang sama berkali-kali seharusnya tidak berdampak pada memori Anda melebihi jumlah maksimum permintaan paralel, dan penggunaan Memcache kemungkinan besar akan membantu dalam skenario Anda - bukan dengan memori, tetapi untuk mempercepat waktu respons. Periksa apakah Anda menutup pembaca saat membaca blob dan pertimbangkan untuk menggunakan variabel statis global untuk memastikan bahwa Anda hanya memiliki satu salinan di memori instans. - person Andrei Volgin; 23.04.2015
comment
Terima kasih teman-teman - Saya sekarang berasumsi ada kebocoran memori. Saya akan mulai mencari solusi profil memori di Google. Saya juga akan berusaha memasukkannya ke dalam memcache. - person user1961; 23.04.2015
comment
Pasti ada kebocoran memori - Saya telah memuat halaman yang baru saja mencetak 'runtime.memory_usage().current()' dan setiap penyegaran nilai ini meningkat. - person user1961; 23.04.2015
comment
@ user1961 re: membaca gumpalan tunggal dari memcache. Itu tergantung pada ukuran kunci dan kecepatan pengambilan yang Anda rencanakan, tapi saya pikir seseorang harus menyebutkannya sebelum Anda mengalami masalah penskalaan: mendistribusikan beban ke seluruh keyspace memcache Anda. Periksa ini untuk detail selengkapnya: cloud.google.com/ pengembang/artikel/ - person PrecariousJimi; 23.04.2015