Linux 6.9+ çekirdeğinde sunulan EPIOCSPARAMS per-epoll busy polling, SO_BUSY_POLL ve klasik donanım kesmelerinin (interrupts) TCP/UDP soket P99 kuyruk gecikmesini, context switch maliyetini ve CPU tüketimini hesaplayın.
Soket okumasinda paketi beklerken CPU donus suresi (50 µs endustri standardidir).
| Model | Medyan (P50) | Kuyruk (P99) | CPU Yuku | Context Switch | Verimlilik |
|---|---|---|---|---|---|
Linux 6.9+ Per-epoll Busy Poll (EPIOCSPARAMS)Onerilen | 4.2 µs | 8.5 µs | %39.5 | 17.000/sn | Orta |
Soket Bazli SO_BUSY_POLL | 5.1 µs | 11.8 µs | %50.6 | 31.875/sn | Orta |
Kuresel net.core.busy_poll (sysctl) | 6.2 µs | 14.5 µs | %67.5 | 53.125/sn | Yuksek Enerji Tuketimi |
Klasik Donanim Kesmesi (Interrupts) | 18 µs | 42 µs | %26 | 212.500/sn | Mukemmel |
Linux 6.9+ EPIOCSPARAMS ioctl veya sysctl busy polling entegrasyonu.
// Linux 6.9+ epoll EPIOCSPARAMS Per-epoll Context Busy Polling
#include <sys/epoll.h>
#include <sys/ioctl.h>
struct epoll_params {
uint32_t busy_poll_usecs; // Orn: 50 mikrosaniye
uint16_t busy_poll_budget; // Bir defada taranacak paket sayisi (orn: 64)
uint8_t prefer_busy_poll;
uint8_t pad;
};
int enable_epoll_busy_poll(int epoll_fd) {
struct epoll_params params = {
.busy_poll_usecs = 50,
.busy_poll_budget = 64,
.prefer_busy_poll = 1
};
// Tum epoll_wait() dongusunde kesmesiz busy polling aktif edilir:
return ioctl(epoll_fd, EPIOCSPARAMS, ¶ms);
}Geleneksel Linux ağ yığınında bir ağ kartına (NIC) paket ulaştığında kart bir donanım kesmesi (hardirq) üretir. Çekirdek çalışan iş parçacığını durdurarak NAPI (New API) softirq kuyruğuna geçer ve ardından uyuyan kullanıcı süreci (örneğin epoll_wait bekleyen bir web sunucusu veya veritabanı motoru) Linux zamanlayıcısı (CFS/EEVDF) tarafından uyandırılır.
Bu süreç her paket veya paket öbeğinde 15 ila 45 mikrosaniye arasında işlemci bağlam değişimi (context switch), L1/L2 önbellek kirlenmesi (cache thrashing) ve zamanlama kuyruğu gecikmesi oluşturur. Yüksek frekanslı alım-satım (HFT), gerçek zamanlı oyun ve mikroservis iletişiminde bu dalgalanmalar P99 kuyruk gecikmesini kabul edilemez seviyelere çıkarır.
Geleneksel net.core.busy_poll sysctl parametresi tüm sistemdeki soketleri sürekli spin atıp yoklamaya zorladığı için işlemcileri gereksiz yere yüzde 100 yüke sokarak enerji tüketimini ve ısınmayı fırlatıyordu.
Linux 6.9 ile tanıtılan EPIOCSPARAMS ioctl mekanizması, busy polling davranışını doğrudan ilgili epoll dosya tanıtıcısına (epoll_fd) bağlar. Yalnızca ultra düşük gecikme gerektiren kritik iş parçacıkları soket halkasını (ring buffer) doğrudan yoklar; trafik kesildiğinde sistem otomatik olarak derin uykuya dönerek CPU israfını engeller. Sonuç olarak P99 gecikmesi 8.5 mikrosaniyenin altına inerken yüzbinlerce gereksiz context switch elenir.