Groupcache: masalah dengan batas atas batas memori

Dibuat pada 13 Apr 2016  ·  5Komentar  ·  Sumber: golang/groupcache

Hai,

Terima kasih untuk cache grup, kami menggunakannya dengan hampir sukses besar.

Satu hal yang ingin saya pahami lebih lanjut adalah bagaimana memperkirakan/mengetahui batas atas kebutuhan memori aplikasi yang fungsi utamanya hanya untuk melayani hal-hal dari cache grup.

Jadi kami memiliki cache grup yang berjalan 6GB vm, dan kecenderungan pertama kami adalah mengatur ukuran cache yang tersedia menjadi 5gb, meninggalkan 1gb gratis untuk os dan lainnya.

Segera ini macet di bawah beban produksi karena pembunuh OOM dipanggil. Jadi kami akhirnya menurunkan angka ini menjadi hanya di bawah 2GB sehingga memori yang digunakan proses tetap di bawah 6GB sebelum pembunuh OOM masuk.

Jadi langkah selanjutnya adalah membuat profil memori, dan lihatlah ukuran tumpukan tidak jauh melebihi 2GB yang telah kami konfigurasikan di cache grup. Tetapi prosesnya berakhir dengan menggunakan ram 4-6gb.

Jadi upaya terbaru adalah memanggil debug.FreeOSMemory() secara manual setiap beberapa menit, dan ketika ini dijalankan, tak lama setelah itu, jumlah memori yang dibutuhkan proses turun, banyak yang dikembalikan ke OS.

Namun, kami masih memiliki crash sesekali karena pembunuh OOM. Kami menambahkan swap SSD untuk menyangga kasus ini, tetapi setelah 48 jam tidak ada masalah, ada blip (peningkatan substansial) dalam lalu lintas ke mesin ini yang menyebabkan satu mesin tersebut membuat OOM terbunuh, yang kemudian menjadi bola salju ke beberapa mesin lain yang menyebabkan hal ini terjadi.

Jadi, untuk membuat ini berfungsi, kita bisa menjatuhkan pengaturan cache 2GB (alias parameter ke-2 di groupcache.NewGroup) bahkan lebih rendah dari 1GB, tetapi tampaknya agak konyol memiliki vm 6GB yang hanya dapat menggunakan 1gb untuk cache.

Apakah ini hanya kelemahan menggunakan pendekatan go untuk manajemen memori untuk caching?

Tidak yakin apakah itu penting, tetapi kasus penggunaan kami sangat mirip dengan dl.google.com. Kami melayani unduhan file berukuran sedang (50mb-1gb, di-cache dalam potongan 100MB), dan cache grup digunakan untuk mengarahkan api yang lebih lambat dan lebih mahal yang memiliki file yang perlu kami layani. Jadi wajar saja ketika menemukan ini sepertinya solusi yang bagus untuk masalah ini.

Kami akan sangat berterima kasih atas setiap kiat yang dapat Anda bagikan untuk mengelola jenis masalah ini. Saya terus berpikir ada sesuatu yang saya lewatkan.

Terima kasih untuk setiap wawasan yang dapat Anda bagikan.

  • scott

Komentar yang paling membantu

Hanya untuk menindaklanjuti, ini sangat membantu. Terima kasih lagi. +1 untuk menambahkan ini ke dokumen.

Semua 5 komentar

Ini terutama berasal dari pengaturan default GCPrecent ke 100%, yang berarti GC akan dipicu secara otomatis hanya ketika Anda telah mengalokasikan dua kali lipat jumlah sejak GC terakhir dijalankan.

Saya berada dalam situasi yang sama, dan berpikir bahwa untuk profil seperti Groupcache, akan lebih masuk akal untuk menyetelnya pada sekitar 10%. lihat https://golang.org/pkg/runtime/debug/#SetGCPercent

Terima kasih untuk balasan Anda. Saya akan mencoba ini segera dan melaporkan kembali! Benar-benar masuk akal secara konseptual.

Itu beberapa waktu yang lalu, tetapi IIRC sementara overhead lebih dari 10%, mungkin sekitar 20 - itu waras dan tidak memerlukan dua kali batas memori cache

@adg mungkin perlu disebutkan di README, sepertinya perangkap umum

Hanya untuk menindaklanjuti, ini sangat membantu. Terima kasih lagi. +1 untuk menambahkan ini ke dokumen.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

orcaman picture orcaman  ·  9Komentar

yml picture yml  ·  3Komentar

abennett picture abennett  ·  3Komentar

AlexanderChen1989 picture AlexanderChen1989  ·  6Komentar

juliusv picture juliusv  ·  41Komentar