Mengapa polling tidak diganti dengan epoll?

8

Level-triggered epollsangat mirip dengan poll. Mengapa tidak pollhanya pembungkus untuk epollsistem yang mendukung yang terakhir?

EDIT: Maksud saya, apakah ada hambatan teknis terhadap keputusan tersebut? Menerapkan pollsebagai epollakan secara dramatis meningkatkan kinerja banyak aplikasi jaringan. Seharusnya ada beberapa masalah teknis yang saya gagal perhatikan.

Nicht Verstehen
sumber
5
Ini adalah panggilan sistem. Jika Anda tidak tahu apa yang dia bicarakan, mungkin Anda harus mencarinya, tetapi pertanyaannya valid.
drrlvn
2
Keduanya adalah syscalls untuk menunggu aktivitas apa pun di set deskriptor file. Epoll khusus untuk Linux 2.6+. Saya menambahkan tautan ke halaman manual.
Saya tahu mereka itu apa. Tetapi ada banyak sistem linux / unix like yang memiliki polling, dan pertanyaannya tidak dapat dijawab tanpa spesifik untuk versi apa.
bmargulies
Menerapkan pollsebagai pembungkus epollakan menjadi sangat kompleks dan tidak efisien. Anda harus menyiapkan deskriptor epoll baru dan mengkonfigurasinya setiap kali atau Anda harus melakukan perbandingan yang menyakitkan dari polling saat ini dengan yang sudah dikaitkan dengan deskriptor epoll. Huek!
David Schwartz

Jawaban:

2

jajak pendapat jauh lebih sederhana untuk kasus-kasus mudah; mungkin sama efisiennya untuk sejumlah kecil deskriptor file. Penelepon tidak perlu khawatir tentang menjaga FD polling dan menambahkan / menghapus FD, mereka hanya dapat menambahkan semua yang mereka inginkan pada setiap panggilan untuk polling.

Perasaan saya adalah bahwa mereka gratis, meskipun polling BISA diterapkan sebagai pembungkus untuk epoll, mungkin seharusnya tidak.

epoll dapat (hampir) diimplementasikan sebagai pembungkus untuk polling, tetapi itu akan mengalahkan argumen efisiensinya.

MarkR
sumber
1
Itu adalah jawaban yang paling mungkin. Saya mengujinya dan epoll benar-benar 10 kali lebih lambat dari polling untuk 1 deskriptor file dari file lokal (550 us per 1000 poling dan 5420 us per 1000 epolls (buat + ctl + tunggu + tutup)). epoll_wait hanya 2 kali lebih lambat dari polling.
1

Semantik poll()dan epollberbeda. Jika poll()memberi tahu Anda bahwa deskriptor dapat dibaca, maka Anda melakukan beberapa pembacaan tetapi tidak membaca semua byte yang tersedia, dan kemudian meneruskan deskriptor itu poll()lagi, itu akan segera bangun. AFAIK yang sama tidak benar epoll.

Perhatikan juga bahwa epolldeskriptor adalah sumber daya terbatas. Halaman manual berbicara tentang epoll_create()kondisi kegagalan yang tidak terjadi pada AFAIK poll().

Meskipun saya tidak yakin dengan semua detail implementasi, dari sini kita dapat mengatakan bahwa tidak masuk akal untuk membuat poll()wrapper epoll. Programmer harus menyadari poin-poin ini, dan kode yang ada ditulis dengan asumsi poll()memungkinkan akan rusak.


sumber
1
1. Rasa default epoll (Tingkat-dipicu) bertindak seperti jajak pendapat (lihat bagian Deskripsi dari halaman manual untuk epoll (7)). 2. Polling pada dasarnya adalah epoll_create + epoll_ctl + epoll + wait + close. Jadi jumlah deskriptor epoll yang digunakan dalam jajak pendapat imajiner ini dibatasi oleh jumlah utas yang melakukan jajak pendapat secara bersamaan. Jadi mungkin ada beberapa teknik untuk menyesuaikan max_user_inances untuk mencerminkan jumlah utas maksimal. 3. Saya memposting pertanyaan ini karena penasaran tentang apa asumsi-asumsi itu.
1

Oke, 7 tahun kemudian saya memiliki jawaban yang lebih meyakinkan berdasarkan artikel ini oleh Evan Klitzke.

Pertama, alasan saya mengajukan pertanyaan di tempat pertama adalah keunggulan kinerja yang sering disebutkan epolldibandingkan dengan poll/ select. Kata yang epolllebih asimtotis lebih efisien (O (1)) daripada poll(O ( N )).

Apa yang tidak diketahui secara luas adalah bahwa hanya edge-triggered epoll yang benar-benar O (1), sementara level-trggered epoll memiliki asimptotik yang sama dengan O ( N ). Memang, rasa yang dipicu level harus memeriksa daftar fds yang ditonton setiap kali dipanggil untuk menemukan yang berpotensi memiliki lebih banyak data yang tertunda. Varietas yang dipicu edge dapat mengandalkan sinyal sebagai respons terhadap byte baru yang muncul dalam fd.

Akan menarik untuk mencari tahu, bagaimana tepatnya sebuah thread yang dilanjutkan menemukan mana yang membangunkannya, tetapi tentu saja mungkin bahwa datum ini dilewati selama bangun yang dipicu oleh epoll.

Jelas, poll/ selecttidak dapat menggunakan ujung-dipicu epoll sebagai semantik yang berbeda. Seperti yang kita lihat, penerapan dengan level-triggered epoll tidak akan membawa manfaat kinerja asimptotik. Dan mungkin, juga berdampak negatif jika faktor konstan atau suku konstan tinggi (karena tampaknya didasarkan pada patokan kasar yang saya lakukan dan kutip dalam komentar lain).

Untuk informasi lebih lanjut, silakan baca Pemblokiran I / O, Nonblocking I / O, Dan Epoll .

Nicht Verstehen
sumber