Mengapa Metrik "Memori Digunakan" Berbeza Antara Go pprof dan Statistik Docker
Konteks
Dalam aplikasi Go yang dijalankan Dalam bekas docker, arahan stats docker melaporkan penggunaan memori yang meningkat secara linear. Walau bagaimanapun, menggunakan pprof HTTP untuk memantau aplikasi yang sedang berjalan, nilai runtime.MemStats.sys kekal malar. Percanggahan ini menimbulkan persoalan tentang kemungkinan kebocoran memori.
Cgroups dan Metrik Memori
Statistik Docker mendapatkan semula statistik penggunaan memori daripada cgroup, yang mengoptimumkan akses memori untuk mengelakkan perkongsian palsu cacheline. Akibatnya, metrik usage_in_bytes dalam cgroup merangkumi kedua-dua Cache Halaman dan RES, yang merangkumi Fail I/O dalam bekas.
Pemulihan Memori
Apabila ingatan bekas penggunaan mencapai had maksimumnya, ia menuntut semula memori yang tidak digunakan dan bukannya menamatkan proses. Ini menerangkan sebab pprof melaporkan nilai masa jalan yang berterusan.MemStats.sys, manakala statistik docker menunjukkan penggunaan memori yang meningkat secara linear.
Pengesahan
Untuk mengesahkan tingkah laku ini, tambahkan had memori kepada bekas menggunakan sama ada arahan docker run atau fail docker-compose.yml. Perhatikan bahawa apabila had dicapai, bekas akan menuntut semula memori dan mengekalkan penggunaannya di bawah had, seperti yang ditunjukkan dalam cgroups di /sys/fs/cgroup/memory/docker//.
Kesimpulan
Perbezaan dalam penggunaan memori yang dilaporkan oleh pprof dan statistik docker timbul daripada kemasukan memori Fail I/O dalam statistik docker dan penambakan memori机制 yang dilakukan oleh cgroup apabila had ingatan dikenakan. Dengan memahami faktor ini, pembangun boleh memperoleh gambaran yang lebih tepat tentang penggunaan memori bekas mereka.
Atas ialah kandungan terperinci Mengapakah Statistik Go pprof dan Docker Menunjukkan Metrik Penggunaan Memori yang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!