Menyepakati performa: indexing dengan bulk dan translog tuning, refresh interval dan index sorting; optimasi search dengan caching, filter, dan routing; serta tuning resource JVM G1GC, disk I/O, dan thread pool.

Elasticsearch cepat bukan karena sihir — kecepatan adalah hasil dari serangkaian trade-off yang diatur dengan benar. Data yang masuk tanpa henti, pencarian yang harus menjawab dalam milidetik, dan resource yang terbatas menuntut kalian paham mana yang perlu di-tune dan mana yang biarkan default.
Episode 19 membahas tiga wilayah tuning: indexing performance (bulk, refresh interval, translog, replica saat indexing, index sorting), search performance (optimasi query, caching, filter, jumlah shard, routing), dan resource optimization (JVM G1GC, disk I/O, memory pressure, thread pool).
Aturan pertama indexing cepat: selalu pakai bulk API (episode 4). Jangan pernah mengirim dokumen satu per satu. Konfigurasikan ukuran batch yang tepat:
POST /produk/_bulk
{ "index": { "_id": "1" } }
{ "name": "produk 1", "price": 50000 }
{ "index": { "_id": "2" } }
{ "name": "produk 2", "price": 75000 }Bulk yang ideal berisi 1–10 ribu dokumen atau total 5–15 MB, lalu coba naikkan bertahap sambil memantau took. Ukuran optimal bergantung hardware — jangan menyalin angka dari tutorial tanpa mengukur sendiri.
Data yang diindeks baru terlihat setelah refresh (default 1 detik). Untuk beban indexing massal, refresh setiap detik berarti banyak pekerjaan sinkronisasi segment. Untuk saat ini naikkan interval agar indexing jauh lebih cepat:
PUT /produk/_settings{
"index.refresh_interval": "30s"
}Setelah loading selesai, kembalikan ke 1s (atau otomatis). Pengecualian: aplikasi yang butuh hasil search instan tidak boleh menaikkan interval ini sembarangan — ingat trade-off near-real-time di episode 2.
Translog (episode 2) menjamin keamanan tulis sebelum data tersegmentasi. Pengaturan durability punya dua mode:
{
"index.translog.durability": "async",
"index.translog.sync_interval": "5s"
}Mode request (default) mem-flush translog ke disk per request — paling aman, tapi lambat untuk load massal. Mode async mempercepat indexing dengan risiko kehilangan data beberapa detik terakhir jika node crash. Gunakan async hanya untuk indexing massal di mana data bisa di-re-index ulang; untuk data penting, tetap request.
Replica memperlambat indexing karena setiap tulis disalin. Untuk loading massal, set replica ke 0 saat load, lalu naikkan kembali setelah selesai:
{
"index.number_of_replicas": 0
}Setelah selesai, kembalikan ke 1: PUT /produk/_settings dengan {"index.number_of_replicas": 1}. Ini trik klasik yang memangkas waktu load besar secara signifikan.
Index sorting mengatur urutan penyimpanan dokumen di dalam segment. Jika pencarian kalian sering di-sort atau difilter oleh field tertentu — misalnya @timestamp — urutkan index berdasarkan field itu agar query rentang waktu jadi jauh lebih efisien:
{
"settings": {
"index.sort.field": "@timestamp",
"index.sort.order": "desc"
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" }
}
}
}Index sorting hanya bisa diatur saat pembuatan index — perhatikan sejak awal. Trade-off-nya: indexing sedikit lebih mahal, tapi range query dan top-N jauh lebih cepat.
Prinsip optimasi query:
_source filtering dan stored_fields.search_after, bukan from yang besar (episode 6).*foo) yang memaksa pemindaian istilah.| Cache | Menyimpan | Kunci pengaturan |
|---|---|---|
| Node query cache | Hasil filter/query pada segment | indices.queries.cache.size (default 10% heap) |
| Shard request cache | Hasil lengkap aggregation | index.requests.cache.enable |
| Field data cache | Struktur untuk sorting/aggregation | indices.fielddata.cache.size |
Request cache bekerja per shard dan batal jika ada dokumen baru — jadi efektif untuk data jarang berubah. Field data cache menahan struktur di memori; pastikan field yang di-aggregate bertipe keyword/numerik dan jarang berubah.
Jumlah shard yang tepat (10–50 GB per shard, episode 18) memengaruhi latency search — setiap shard menambah biaya komunikasi. Pre-filtering dengan routing membatasi pencarian ke subset shard:
GET /produk/_search?routing=fashionSaat aplikasi sudah tahu kategori target, routing menghemat waktu pencarian drastis.
G1GC adalah GC default di Elasticsearch 8.x — dirancang untuk heap besar dengan pause terkendali:
-Xms8g
-Xmx8g
-XX:+UseG1GC
-XX:G1HeapRegionSize=4m
-XX:MaxGCPauseMillis=500Pemantauan GC adalah sinyal paling penting: pause panjang dan promotion failed menandakan masalah. Episode 21 akan membahas metrik JVM secara detail.
Indexing dan merge adalah pekerjaan berat I/O. Pastikan: segment merge berjalan di background yang terjadwal (index.merge.scheduler.max_thread_count), dan jangan memaksa merge saat load indexing. SSD untuk tier hot (episode 18) adalah investasi yang terbayar.
Memory pressure mengukur beban heap terhadap kapasitas. Jika tekanan tinggi dan RejectedExecutionException sering muncul, solusinya bukan mengubah konfigurasi — tapi menambah node atau memperbaiki query/aggregation yang boros.
Warning
Tuning adalah proses iteratif dan terukur, bukan menyalin setting dari blog. Ubah satu variabel, ukur efeknya dengan benchmark sebelum/ sesudah, dan kembalikan jika tidak membantu. Konfigurasi yang tampak "tuning" bisa jadi beban jika diterapkan tanpa pemahaman beban kerja kalian.
Bulk yang dihapal tanpa pengukuran. Ukuran batch optimal bergantung hardware — ukur dengan took dan iterasi.
Refresh interval 1s di load massal. Perlambat dulu, kembalikan setelahnya.
Replica 1 saat load besar. Set 0 saat load, kembalikan setelah selesai.
from besar untuk pagination. Gunakan search_after.
Index sorting diterapkan terlambat. Harus dari awal — rancang di mapping pertama.
Di episode 19 kalian menguasai performance tuning: bulk indexing dengan batch terukur, refresh interval dan translog async untuk load massal, replica nol saat loading, index sorting; optimasi search dengan filter/caching/routing dan search_after; serta resource tuning G1GC, disk I/O, dan pemantauan memory pressure.
Inti yang harus dibawa pulang:
Performanya sudah optimal — tapi satu insiden disk rusak bisa menghapus semuanya. Di episode 20 kita bahas snapshot dan restore sebagai strategi backup: jenis repository (filesystem, S3, GCS, Azure), snapshot lifecycle management (SLM), snapshot penuh dan incremental, pemulihan index, partial restore, cross-cluster restore, dan perencanaan disaster recovery. Sampai jumpa!