EPOLLEXCLUSIVE Membatasi Wakeup Antar-instance epoll

EPOLLEXCLUSIVE mengubah distribusi event ketika beberapa instance epoll mendaftarkan file description target yang sama. Tanpa flag ini, sebuah event readiness dapat membangunkan waiter yang terkait dengan setiap instance epoll yang berminat. Dengan registrasi eksklusif, Linux dapat membatasi fan-out tersebut dan mengurangi wakeup yang redundan.

Flag ini tidak membuat delivery menjadi single-consumer, tidak menetapkan kepemilikan target, dan tidak menggantikan koordinasi pada level aplikasi. Kontraknya lebih sempit: di antara instance epoll yang mendaftarkan target dengan EPOLLEXCLUSIVE, satu atau lebih instance menerima event untuk sebuah wakeup, bukan mewajibkan semuanya menerima event tersebut.

Eksklusivitas berlaku antar-instance epoll

Flag diberikan saat target ditambahkan ke interest list epoll:

struct epoll_event ev = {
    .events = EPOLLIN | EPOLLEXCLUSIVE,
    .data.fd = listen_fd,
};

if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ev) == -1) {
    perror("epoll_ctl");
}

Susunan ini relevan ketika instance epoll yang terpisah memantau target yang sama, misalnya worker yang masing-masing memiliki event loop untuk listening socket bersama. Properti eksklusif melekat pada registrasi antara sebuah instance epoll dan target tersebut.

Kasus ini berbeda dari beberapa thread yang menunggu pada satu file descriptor epoll bersama. EPOLLEXCLUSIVE mengatur distribusi wakeup antar-registrasi pada beberapa instance epoll, bukan aturan eksklusi generik seperti mutex di sekitar epoll_wait().

Satu atau lebih registrasi eksklusif dapat menerima event

Nama flag ini dapat memberi kesan jaminan yang lebih kuat daripada kontrak antarmukanya. Dokumentasi Linux menyatakan bahwa satu atau lebih instance epoll eksklusif menerima event ketika wakeup terjadi.

Karena itu, kode tidak dapat menganggap flag ini sebagai jaminan bahwa tepat satu worker berjalan untuk setiap transisi readiness. Scheduling, status readiness, beberapa event, serta semantik I/O target tetap berpengaruh. Jaminan yang relevan adalah fan-out yang lebih terbatas dibanding perilaku default, saat semua instance epoll yang terpasang dapat menerima event.

Pada listening socket, worker yang terbangun tetap harus menjalankan accept() dan menangani race normal. Worker lain dapat lebih dahulu mengambil pekerjaan yang tersedia, atau beberapa koneksi mungkin sudah berada dalam antrean. Pemilihan wakeup eksklusif tidak mencadangkan sebuah koneksi untuk waiter tertentu.

Registrasi non-eksklusif tetap berada di luar pembatasan

Satu target dapat berada di beberapa instance epoll dengan campuran registrasi eksklusif dan biasa. Dalam konfigurasi tersebut, event dikirim ke semua instance epoll yang tidak meminta EPOLLEXCLUSIVE, ditambah setidaknya satu instance eksklusif.

Batas ini penting saat migrasi dilakukan secara bertahap. Menambahkan flag hanya pada sebagian worker tidak menekan wakeup untuk observer yang mempertahankan registrasi biasa. Monitoring, diagnostik, atau event loop lama masih dapat mempertahankan perilaku notifikasi yang lebih luas ketika kelompok worker lain memakai mode eksklusif.

Hasilnya bukan eksklusivitas global untuk file description. Ini adalah aturan delivery yang diterapkan pada subset registrasi yang memintanya.

Mode ditetapkan pada EPOLL_CTL_ADD

EPOLLEXCLUSIVE hanya dapat diberikan bersama EPOLL_CTL_ADD. Penggunaannya dengan EPOLL_CTL_MOD gagal dengan EINVAL. Setelah pasangan epoll-target ditambahkan memakai flag ini, EPOLL_CTL_MOD berikutnya untuk pasangan tersebut juga gagal.

Dengan demikian, mode eksklusif merupakan properti saat registrasi, bukan mask yang dapat diaktifkan atau dinonaktifkan langsung. Perubahan susunan memerlukan penghapusan registrasi lalu penambahan kembali dengan mode yang diinginkan, beserta koordinasi yang diperlukan saat interest list aktif diubah.

Bit event yang dapat dipasangkan juga dibatasi. Linux mengizinkan EPOLLIN, EPOLLOUT, EPOLLWAKEUP, dan EPOLLET bersama EPOLLEXCLUSIVE. EPOLLERR dan EPOLLHUP dilaporkan saat berlaku tanpa perlu diminta. Kombinasi yang tidak didukung menghasilkan EINVAL.

File descriptor epoll juga tidak dapat menjadi target registrasi eksklusif. Menentukan EPOLLEXCLUSIVE ketika target sendiri merujuk ke sebuah instance epoll akan gagal.

Wakeup yang lebih sedikit tidak menentukan kepemilikan pekerjaan

Biaya thundering herd muncul ketika banyak waiter terbangun untuk pekerjaan yang hanya dapat dikonsumsi oleh jumlah yang lebih kecil. EPOLLEXCLUSIVE memindahkan sebagian penyaringan tersebut ke jalur wakeup epoll di kernel, sehingga wakeup yang tidak diperlukan dapat berkurang pada desain yang sesuai.

Optimasi itu berhenti pada notifikasi. Flag ini tidak melakukan serialisasi read, accept, write, atau transisi state pada target. Flag ini juga tidak menentukan fairness antar-instance epoll eksklusif dan tidak mengubah readiness menjadi antrean penugasan worker.

Aplikasi tetap memerlukan loop I/O yang dapat menghadapi race readiness dan hasil sementara. Pada operasi edge-triggered, kewajiban normal untuk menguras pekerjaan sesuai semantik edge-triggered juga tetap berlaku. Flag eksklusif mengubah instance epoll mana yang dibangunkan; model readiness target tidak berubah.

Batas praktisnya jelas: EPOLLEXCLUSIVE adalah kontrol distribusi wakeup untuk target bersama di beberapa instance epoll. Mekanisme ini dapat mengurangi herd behavior tanpa mengubah epoll menjadi work scheduler atau primitive dispatch single-consumer.