NIC Ring Buffer & IRQ Affinity Calculator

if (isNaN(cpus) || cpus < 1 || isNaN(coalesceUs) || coalesceUs < 1) { div.innerHTML = '
Results
Invalid input.
'; 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 = `
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
`; 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(); }); }