Mengonfigurasi memori database untuk tier Anda
Nilai buffer spesifik untuk PostgreSQL dan MySQL untuk VDS-1…VDS-6, dan aturan untuk mendistribusikan memori antara database, aplikasi, dan sistem.
Diperbarui 23 Agustus 2026
Pengaturan database bawaan dirancang agar bisa berjalan di mana saja, bukan untuk berjalan cepat. Pada VDS-3 dengan memori 8 GB, PostgreSQL bawaan hanya memakai 128 MB untuk cache — artinya hampir semua data dibaca dari disk, padahal seharusnya bisa dibaca dari memori.
Aturan alokasi
Bagi memori tier kira-kira seperti ini:
- proses sistem dan layanan — 10–15%;
- aplikasi (PHP-FPM, Node, gunicorn) — sesuai jumlah worker;
- database — sisanya, tapi tidak lebih dari 60–70% total memori.
Jangan pernah memberikan seluruh memori ke database: sistem akan masuk ke swap, dan NVMe tidak akan menolong Anda — latensi akan naik puluhan kali lipat.
Berapa yang sedang terpakai saat ini:
free -h
ps -eo pmem,rss,comm --sort=-rss | head
Grafik memori untuk satu jam, satu hari, satu minggu, dan satu bulan tersedia di "Overview" panel /hosting/vds/m/<id> — grafik tersebut menunjukkan puncak yang sebenarnya, bukan kondisi saat ini.
PostgreSQL
/etc/postgresql/17/main/postgresql.conf:
| Tier | shared_buffers | effective_cache_size | work_mem | maintenance_work_mem | max_connections |
|---|---|---|---|---|---|
| VDS-1 (2 GB) | 384MB | 1GB | 8MB | 96MB | 40 |
| VDS-2 (4 GB) | 1GB | 2GB | 12MB | 256MB | 60 |
| VDS-3 (8 GB) | 2GB | 5GB | 16MB | 512MB | 100 |
| VDS-4 (16 GB) | 4GB | 10GB | 24MB | 1GB | 150 |
| VDS-5 (24 GB) | 6GB | 16GB | 32MB | 2GB | 200 |
| VDS-6 (32 GB) | 8GB | 22GB | 48MB | 2GB | 250 |
Ditambah pengaturan umum untuk NVMe:
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem dialokasikan per operasi pengurutan, bukan per koneksi: seratus kueri paralel dengan pengurutan kompleks akan mengalikannya hingga ratusan kali. Jangan mengaturnya terlalu tinggi.
Cara menerapkan: systemctl restart postgresql (mengubah shared_buffers memang memerlukan restart).
MySQL dan MariaDB
| Tier | innodb_buffer_pool_size | innodb_log_file_size | max_connections |
|---|---|---|---|
| VDS-1 | 512M | 128M | 60 |
| VDS-2 | 1G | 256M | 100 |
| VDS-3 | 3G | 512M | 150 |
| VDS-4 | 8G | 1G | 200 |
| VDS-5 | 12G | 1G | 250 |
| VDS-6 | 18G | 2G | 300 |
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 2000
Buffer pool adalah parameter utama: jika muat untuk kumpulan data kerja, disk hampir tidak dibaca.
Memeriksa hasilnya
SELECT sum(blks_hit)*100/sum(blks_hit+blks_read) FROM pg_stat_database;
Untuk MySQL, periksa SHOW ENGINE INNODB STATUS dan rasio Innodb_buffer_pool_reads terhadap Innodb_buffer_pool_read_requests. Cache hit rate di bawah 95% berarti database kekurangan memori.
Kesalahan umum
| Gejala | Penyebab |
|---|---|
| Database tidak mau start setelah diubah | Memori yang diminta melebihi yang tersedia — periksa journal |
| Proses dibunuh oleh OOM | Database, aplikasi, dan sistem secara bersamaan melebihi memori tier |
| Jadi lebih lambat setelah "optimasi" | work_mem diatur terlalu tinggi, mesin sedang swap |
| Disk terus-menerus dibaca | Buffer terlalu kecil, kumpulan data kerja tidak muat |
Jika setelah menyetel memori Anda masih menemui hambatan, masalahnya bukan pada konfigurasi melainkan pada jumlah data. Anda hanya bisa upgrade paket, dengan pembayaran prorata untuk sisa hari masa berbayar; downgrade tidak tersedia, jadi pilih tier berikutnya dengan cermat.