Bad Epoll (CVE-2026-46242) merusak event loop Linux sehingga proses polling socket database tersendat dan query menjadi lambat. Segera setelah gejala muncul, periksa log kernel/epoll dan ukur latensi antara query agar bisa membedakan masalah database biasa dari efek epoll. Artikel ini menyajikan pendekatan langsung untuk mendeteksi, menganalisis, dan meredam keterlambatan akibat Bad Epoll sambil menjaga koneksi database tetap responsif.

1. Mengenali tanda Bad Epoll memengaruhi koneksi database

1.1. Cek log epoll dan kernel

Mulai dengan log sistem: dmesg cenderung menunjukkan peringatan tentang epoll jika event loop bermasalah. Cari baris seperti "epoll_wait() hung" atau timeout panjang. Catat juga timestamp yang bertepatan dengan lonjakan latensi query.

1.2. Gunakan strace dan ss untuk memeriksa polling socket

Pasang strace pada proses backend yang mengalami keterlambatan untuk melihat panggilan epoll_wait:

strace -f -p $(pidof backend-service) -e trace=epoll_wait

Jika epoll terus-menerus menunggu lebih lama dari ekspektasi, berarti event loop tidak menerima event socket baru meski koneksi aktif. Kombinasikan dengan ss -tpo state established untuk memastikan banyak socket database dalam status ESTABLISHED namun tidak menerima data.

2. Mengukur latensi antar query dan melaporkan bottleneck

2.1. Tambahkan metrik observability

Monitor metrik berikut: rata-rata latensi query, time-to-next-row, backlog I/O, serta jumlah percobaan keterlambatan epoll_wait lebih dari ambang tertentu. Gunakan histogram latency di Prometheus untuk memetakan apakah lonjakan latensi sesuai dengan window waktu Bad Epoll.

2.2. Ukur interval query langsung di database

Tambahkan logging di lapisan aplikasi yang mencatat timestamp setiap SQL sebelum dan sesudah dijalankan. Jika jeda antar query meningkat tiba-tiba dan klien tidak memunculkan beban baru, kemungkinan besar epoll menahan polling. Catat juga apakah latensi tetap tinggi setelah query selesai—ini menandakan event loop menyimpan socket.

3. Langkah praktis menanggapi query lambat akibat epoll

3.1. Verifikasi EXPLAIN dan indeks yang digunakan

Jalankan EXPLAIN ANALYZE pada query yang paling sering gagal atau lambat. Pastikan optimizer tidak memilih full table scan saat indices tersedia. Contoh:

EXPLAIN ANALYZE SELECT a.* FROM orders a WHERE a.status = 'NEW' AND a.created_at > now() - interval '1 day';

Jika traversal indeks sudah optimal namun latensi tetap tinggi, artinya bottleneck datang dari luar database (epoll), bukan dari executor SQL.

3.2. Gunakan pagination atau batching untuk mengurangi jumlah iterasi query

Koneksi yang terus menerus menunggu event epoll lebih lama jika harus memuat banyak row sekaligus. Terapkan pagination dan batasi row per iterasi dengan LIMIT dan ORDER BY yang memanfaatkan indeks. Ini menjaga setiap iterasi lebih ringan dan mengurangi waktu menunggu epoll untuk men-trigger readiness baru.

3.3. Terapkan timeout dan connection pooling adaptif

Set timeout respons yang konservatif di pooling, misalnya 500 ms, lalu monitor apakah timeout tersebut terpicu saat Bad Epoll muncul. Bila iya, kurangi concurrency pool hingga event loop kembali stabil. Connection pooling adaptif dapat menunda pembuatan koneksi baru jika epoll_wait menunjukkan delay signifikan.

4. Observability spesifik dan debugging lanjutan

Gunakan tools seperti perf atau bpftrace untuk memprofil event loop epoll. Kapan epoll_wait menahan socket database paling lama? Kombinasikan dengan log DB (pg_stat_activity pada PostgreSQL) untuk melihat status query; jika statusnya idle in transaction namun latensi berlanjut, epoll mungkin tidak mengirim notifikasi readiness.

Catat juga metrik seperti queue length pada acceptor, jumlah sistem call epoll_wait yang timeout, serta jumlah interrupt per detik. Bila jumlah timeout naik bersamaan dengan spike latensi, itu indikator Bad Epoll.

5. Mitigasi dan kapan rollback patch OS diperlukan

Mitigasi segera dapat mencakup:

  • Memperketat timeout database dan kurangi concurrency agar epoll tidak menumpuk event.
  • Menggunakan fallback polling (misalnya menggunakan poll atau sistem scheduler alternatif) jika kernel tidak men-trigger epoll.
  • Meningkatkan logging untuk memicu alert ketika latency > threshold berulang.

Rollback patch OS sebaiknya diprioritaskan jika:

  • Semua langkah mitigasi tidak menurunkan latensi dan epoll_wait masih timeout panjang.
  • Database dan aplikasi sudah teruji (EXPLAIN, indeks, pooling) namun event loop tetap tertahan.
  • Vendor kernel merekomendasikan versi tertentu yang terbukti stabil kembali.

Catat rollback sebagai langkah terakhir dan siapkan rencana fallback untuk memperbarui kembali setelah patch resmi tersedia.

Kesimpulan

Bad Epoll dapat memperlambat koneksi dan iterasi SQL secara substansial. Dengan memeriksa log, mengukur latensi antar query, memverifikasi EXPLAIN, memastikan indeks optimal, dan menerapkan timeout/connection pooling adaptif, kita bisa membatasi dampaknya sampai patch OS stabil. Pantau metrik observability secara fokus dan jadwalkan rollback hanya saat mitigasi lain gagal mengembalikan latensi normal.