NIC Ring Buffer & IRQ Affinity Calculator
if (isNaN(cpus) || cpus < 1 || isNaN(coalesceUs) || coalesceUs < 1) {
div.innerHTML = '
';
return;
}
// Ring buffer sizing: ceil(link_speed_bps * coalesce_delay_s / (8 * frame_size))
// Frame size heuristic by profile
const frameSizes = { bulk: 9000, rpc: 1500, pps: 64 };
const frameSize = frameSizes[profile];
const speedBps = speedGbps * 1e9;
const coalesceS = coalesceUs / 1e6;
const rawRing = Math.ceil((speedBps * coalesceS) / (8 * frameSize));
// Round up to nearest power of 2 (common NIC constraint)
let ringSize = 1;
while (ringSize < rawRing) ringSize *= 2;
ringSize = Math.min(ringSize, 4096); // max typical ring size
// RSS queues: min(cpus, speed-based cap, 64)
const speedQueues = speedGbps <= 1 ? 4 : speedGbps <= 10 ? 8 : speedGbps <= 25 ? 16 : 32;
const rssQueues = Math.min(cpus, speedQueues, 64);
// CPU affinity: prefer first N CPUs, skip CPU 0 if NUMA/irqbalance concern
const affinityCpus = rssQueues <= 4 ? `1-${rssQueues}` : `0-${rssQueues - 1}`;
div.innerHTML = `
`;
window._lastCmds = `# Set ring buffer (${iface})\nethtool -G ${iface} rx ${ringSize} tx ${ringSize}\n\n# Set RSS queue count\nethtool -L ${iface} combined ${rssQueues}\n\n# Set interrupt coalescing\nethtool -C ${iface} rx-usecs ${coalesceUs} tx-usecs ${coalesceUs}`;
}
function copyBlock() {
if (!window._lastCmds) return;
navigator.clipboard.writeText(window._lastCmds).catch(() => {
const ta = document.createElement('textarea');
ta.value = window._lastCmds; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); ta.remove();
});
}
Results
Invalid input.
Recommended Settings
${ringSize}
Ring buffer size (RX & TX)
${rssQueues}
RSS queues
${coalesceUs} μs
Interrupt coalescing
${speedGbps} Gbps
Link speed
Calculation: ceil(${speedGbps}Gbps × ${coalesceUs}μs / (8 × ${frameSize}B)) = ${rawRing} → rounded up to ${ringSize} (power of 2)
# Set ring buffer (${iface})
ethtool -G ${iface} rx ${ringSize} tx ${ringSize}
# Set RSS queue count
ethtool -L ${iface} combined ${rssQueues}
# Set interrupt coalescing
ethtool -C ${iface} rx-usecs ${coalesceUs} tx-usecs ${coalesceUs}
# Pin IRQs to CPUs ${affinityCpus} (run after ethtool -L)
# Find IRQ numbers: grep ${iface} /proc/interrupts | awk '{print $1}' | tr -d ':'
# Then: echo ${affinityCpus} > /proc/irq/<N>/smp_affinity_list
# Or use irqbalance with policy hint:
IRQBALANCE_ARGS="--policyscript=/etc/irqbalance/policy.sh" systemctl restart irqbalance