한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Buku Putih Lag Game › L10 Memori

Fragmentasi memori Heap fragmentation

ID penyebab mem-fragment · Penanggung jawab utama Pengembangan server (Tim Pengembang Game)

Buka kartu interaktif dengan gambar dan simulasi →

Jika alokasi dan pembebasan yang berulang memecah ruang kosong menjadi potongan kecil, proses menahan memori jauh lebih banyak daripada yang benar-benar dipakai.

Mengapa Banyak thread mengalokasikan dan membebaskan memori berukuran beragam dalam waktu lama → Akibatnya Ruang kosong tersebar dalam potongan kecil sehingga tidak bisa dikembalikan ke OS, dan penggunaan memori terus naik seperti kebocoran → Di layar Makin lama menyala, makin lambat karena swap atau kehabisan memori, lalu dihentikan paksa

Gejala
Slow motion, Disconnect
Faktor
Stall
Siapa yang mengalami
Seluruh server
Kapan
Makin lama menyala
Penanggung jawab
Penanggung jawab utama Pengembangan server (Tim Pengembang Game)
Tugas Tim Pengembang Game
Gunakan memory pool per ukuran dan allocator yang tahan fragmentasi (jemalloc, mimalloc, dan lainnya).
Di grafik
Naik perlahan · Memori proses (RSS)
Yang diperiksa
Jalankan dua server dengan build yang sama; pada salah satunya saja, kurangi jumlah arena glibc dengan environment variable MALLOC_ARENA_MAX atau ganti ke allocator lain seperti jemalloc, lalu bandingkan RSS di pidstat -r selama beberapa hari
Cocok jika
Jumlah pemain dan objek kurang lebih sama, tetapi hanya server yang diubah yang kenaikan RSS-nya berhenti atau turun drastis
Tidak cocok jika
RSS tetap naik dengan cara yang sama walaupun allocator diganti: mengarah ke memori yang tidak dibebaskan (mem-leak)
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Pelajari lebih lanjut
Polanya sama dengan kebocoran, tetapi analisis heap tidak menemukan titik kebocorannya. Allocator default Linux (glibc) sangat rentan pada server dengan banyak thread, sehingga mengganti allocator saja kadang sudah menurunkan penggunaan memori secara drastis.

Sumber

  1. mallopt(3) — Linux manual page Linux man-pages
    glibc malloc membuat arena hingga kelipatan jumlah CPU untuk mengurangi perebutan di antara thread, dan makin banyak arena, makin besar penggunaan memori (dibatasi dengan M_ARENA_MAX, bisa juga diatur lewat environment variable MALLOC_ARENA_MAX)
  2. jemalloc memory allocator jemalloc
    Implementasi malloc serbaguna yang mengutamakan penghindaran fragmentasi dan skalabilitas konkurensi
  3. pidstat(1) — Linux manual page sysstat
    -r: RSS per proses (memori yang benar-benar ada di RAM)

Lihat juga

Lapisan yang sama: L10 Memori

Penyebab di lapisan lain dengan gejala yang sama (Slow motion)

Lihat kartu interaktif dengan gambar dan simulasi