{"id":21057,"date":"2026-08-27T11:49:04","date_gmt":"2026-08-27T09:49:04","guid":{"rendered":"https:\/\/webhosting.de\/receive-side-scaling-rss-10g-25g-linux-server-optimierung-bitrate\/"},"modified":"2026-08-27T11:49:04","modified_gmt":"2026-08-27T09:49:04","slug":"receive-side-scaling-rss-10-g-25-g-linux-server-optimering-bithastighet","status":"publish","type":"post","link":"https:\/\/webhosting.de\/sv\/receive-side-scaling-rss-10g-25g-linux-server-optimierung-bitrate\/","title":{"rendered":"Receive Side Scaling vid 10 och 25 Gbit\/s: Prestandajustering f\u00f6r moderna Linux-servern\u00e4tverk"},"content":{"rendered":"<p><strong>Receive Side Scaling<\/strong> f\u00f6rdelar n\u00e4tverkstrafiken p\u00e5 ett m\u00e5linriktat s\u00e4tt \u00f6ver flera k\u00e4rnor via 10- och 25-Gbit\/s-l\u00e4nkar, s\u00e5 att Linux-servrar kan hantera h\u00f6ga genomstr\u00f6mningshastigheter med l\u00e5g latens. Jag visar p\u00e5 ett praktiskt s\u00e4tt hur jag aktiverar RSS, som <strong>Ledtr\u00e5dar<\/strong> p\u00e5 Cores mapp och p\u00e5 s\u00e5 s\u00e4tt undviker flaskhalsar vid avbrott och cachetr\u00e4ffar.<\/p>\n\n<h2>Centrala punkter<\/h2>\n\n<p>Jag sammanfattar kortfattat de viktigaste punkterna s\u00e5 att du snabbt kan planera n\u00e4sta steg.<\/p>\n<ul>\n  <li><strong>Lastf\u00f6rdelning<\/strong>: Paketen f\u00f6rdelas \u00f6ver flera k\u00f6er till flera k\u00e4rnor.<\/li>\n  <li><strong>Cache-plats<\/strong>: Ett fl\u00f6de f\u00f6rblir konsekvent i samma k\u00f6.<\/li>\n  <li><strong>Hashning<\/strong>: 4-tupel-hash f\u00f6rdelar fl\u00f6den j\u00e4mnt \u00f6ver k\u00f6erna.<\/li>\n  <li><strong>affinitet<\/strong>: M\u00e5lriktad IRQ-mappning minskar latensen.<\/li>\n  <li><strong>Skalning<\/strong>: Fr\u00e5n 10\/25 Gbit\/s garanterar RSS h\u00f6g genomstr\u00f6mning.<\/li>\n<\/ul>\n<p>Dessa punkter h\u00e4nger samman och utg\u00f6r grunden f\u00f6r <strong>Prestanda<\/strong> om verkliga arbetsbelastningar. Jag prioriterar f\u00f6rst att fastst\u00e4lla r\u00e4tt antal k\u00f6er, sedan <strong>CPU<\/strong>-Affinitet. D\u00e4refter kontrollerar jag hash-parametrar och finjusteringar.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/servernetzwerk-performance-2947.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Vad Receive Side Scaling g\u00f6r<\/h2>\n\n<p>RSS delar upp paketmottagningen i flera <strong>Mottagningsk\u00f6er<\/strong>, som jag tilldelar specifika CPU-k\u00e4rnor f\u00f6r att ingen enskild k\u00e4rna ska bli en flaskhals. Detta minskar kraftiga interrupt-toppar och j\u00e4mnar ut bearbetningen via SoftIRQ:er, vilket minskar latenstoppar och \u00f6kar genomstr\u00f6mningen. Varje k\u00f6 utl\u00f6ser egna avbrott, som jag kopplar fast till specifika k\u00e4rnor f\u00f6r att h\u00e5lla datav\u00e4garna konsistenta. Denna konsistens fr\u00e4mjar <strong>Cache<\/strong>-Lokalitet, eftersom ett fl\u00f6de alltid m\u00f6ter samma k\u00e4rna. Just detta samspel bidrar direkt till m\u00e4tbar effektivitet vid h\u00f6ga PPS-hastigheter.<\/p>\n\n<h2>S\u00e5 fungerar RSS rent tekniskt<\/h2>\n\n<p>NIC skapar utifr\u00e5n k\u00e4ll- och m\u00e5l-IP samt k\u00e4ll- och m\u00e5lport en <strong>Hash<\/strong> och anv\u00e4nder den som index f\u00f6r Indirection-tabellen, som pekar p\u00e5 k\u00f6er. P\u00e5 detta s\u00e4tt hamnar paket fr\u00e5n ett fl\u00f6de alltid i samma k\u00f6 och f\u00f6rblir d\u00e4rmed bundna till samma k\u00e4rna. Olika fl\u00f6den f\u00f6rdelas j\u00e4mnt, f\u00f6rutsatt att hashnycklar och protokollf\u00e4lt \u00e4r korrekt konfigurerade. Arbetet hamnar d\u00e4rmed n\u00e4ra <strong>H\u00e5rdvara<\/strong>, vilket inneb\u00e4r att k\u00e4rnan beh\u00f6ver balansera mindre och att overheaden minskar. Det \u00e4r precis vad jag vill uppn\u00e5 f\u00f6r att h\u00e5lla paketbehandlingen per k\u00e4rna l\u00e5g vid 10G\/25G.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linuxnetzwerke_tuning4683.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Varf\u00f6r RSS fr\u00e5n 10 och 25 Gbit\/s \u00e4r viktigt<\/h2>\n\n<p>Vid 1 Gbit\/s \u00e4r det ofta en enda <strong>K\u00e4rnan<\/strong> paketbelastningen, men fr\u00e5n 10 Gbit\/s v\u00e4nds balansen snabbt. Sm\u00e5 paket f\u00e5r PPS-v\u00e4rdet att stiga, vilket g\u00f6r att en k\u00e4rna snabbt n\u00e5r 100 procent belastning och paketf\u00f6rluster uppst\u00e5r. Just d\u00e5 fungerar RSS som en multiplikator f\u00f6r anv\u00e4ndbar bandbredd. Jag f\u00f6rdelar belastningen \u00f6ver flera <strong>K\u00e4rnor<\/strong>, minskar kontextbyten och h\u00e5ller latenskurvorna mer stabila. Resultatet: den faktiska genomstr\u00f6mningen n\u00e4rmar sig f\u00f6rst l\u00e4nkhastigheten med en ren RSS.<\/p>\n\n<h2>Konfigurera RSS p\u00e5 Linux-servern<\/h2>\n\n<p>I Linux hanterar jag RSS fr\u00e4mst via <strong>ethtool<\/strong>, drivrutinsinst\u00e4llningar och sysfs, s\u00e5 att n\u00e4tverkskortets funktioner verkligen utnyttjas. F\u00f6rst l\u00e4ser jag av det maximala antalet RX-kanaler, sedan st\u00e4ller jag in ett antal k\u00f6er som passar CPU:n. D\u00e4refter kontrollerar jag RSS-hash f\u00f6r TCP\/UDP och valfritt f\u00f6r VLAN eller tunneling, s\u00e5 att belastningsprofilerna f\u00f6rblir j\u00e4mnt f\u00f6rdelade. F\u00f6r att hantera grundbruset i avbrottsf\u00f6rdelningen hj\u00e4lper mig <a href=\"https:\/\/webhosting.de\/sv\/konfigurera-irq-balans-i-linux-pa-en-server\/\">IRQ-balansering<\/a>, \u00e4ven om jag helst l\u00e4gger in kritiska k\u00f6er manuellt. S\u00e5 h\u00e4r kopplar jag <strong>Ledtr\u00e5dar<\/strong> anpassas noggrant till v\u00e4rddatorns topologi och f\u00f6rhindrar st\u00f6rande f\u00f6rflyttningar.<\/p>\n\n<h2>Indirection-Table, RSS-Key och finjustering av hash: specifika kommandon<\/h2>\n\n<p>Jag kontrollerar f\u00f6rst den aktuella f\u00f6rdelningen och nyckeln f\u00f6r n\u00e4tverkskortet:<\/p>\n<pre><code>ethtool -x eth0 # Visa indirektionstabell (RX-k\u00f6er) och RSS-nyckel\nethtool -n eth0 rx-flow-hash tcp4\nethtool -n eth0 rx-flow-hash udp4\n<\/code><\/pre>\n<p>F\u00f6r en ren och j\u00e4mn f\u00f6rdelning st\u00e4ller jag in Indirection-Table p\u00e5 det \u00f6nskade antalet k\u00f6er. Vid 16 k\u00f6er v\u00e4ljer jag en j\u00e4mn f\u00f6rdelning:<\/p>\n<pre><code>ethtool -X eth0 equal 16  # F\u00f6rdelning j\u00e4mnt \u00f6ver 16 k\u00f6er\n<\/code><\/pre>\n<p>Om det beh\u00f6vs anpassar jag hash-f\u00e4lten. F\u00f6r TCP4 med 4-tupel (s=src-ip, d=dst-ip, f=src-port, n=dst-port):<\/p>\n<pre><code>ethtool -N eth0 rx-flow-hash tcp4 sdfn\nethtool -N eth0 rx-flow-hash udp4 sdfn\nethtool -N eth0 rx-flow-hash tcp6 sdfn\nethtool -N eth0 rx-flow-hash udp6 sdfn\n<\/code><\/pre>\n<p>Vissa drivrutiner till\u00e5ter \u00e4ven att man anger en egen RSS-nyckel (t.ex. f\u00f6r b\u00e4ttre spridning i s\u00e4rskilda fall):<\/p>\n<pre><code>ethtool -X eth0 hkey   # endast om drivrutinen\/n\u00e4tverkskortet st\u00f6der det\n<\/code><\/pre>\n\n<h2>St\u00e4lla in CPU-affinitet och NUMA korrekt<\/h2>\n\n<p>Jag kartl\u00e4gger varje RX-k\u00f6 med hj\u00e4lp av <strong>IRQ-affinitet<\/strong> till dedikerade k\u00e4rnor och ta h\u00e4nsyn till NUMA s\u00e5 att data endast passerar kort genom minneskontrollern. Om n\u00e4tverkskortet k\u00f6rs p\u00e5 nod 0 kopplar jag \u00e4ven huvudk\u00f6erna till k\u00e4rnor p\u00e5 nod 0 och placerar arbetsbelastningarna i n\u00e4rheten. Denna n\u00e4rhet minskar fj\u00e4rr\u00e5tkomst och s\u00e4nker minneslatensen avsev\u00e4rt. Det \u00e4r anv\u00e4ndbart att ha en profil f\u00f6r produktiva k\u00f6er samt separata k\u00e4rnor f\u00f6r hanterings- och avlastningsuppgifter. Den som vill f\u00f6rdjupa sig ytterligare hittar tips f\u00f6r finjustering under <a href=\"https:\/\/webhosting.de\/sv\/server-irq-affinity-multicore-naetverksoptimering-prestanda\/\">IRQ-affinitet<\/a>, vad g\u00e4ller planeringen per <strong>K\u00e4rna<\/strong> f\u00f6renklad.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linux-server-network-tuning-2478.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>IRQ-affinitet \u2013 en handbok: fr\u00e5n IRQ:er till stabil k\u00e4rnbindning<\/h2>\n\n<p>Jag tar f\u00f6rst reda p\u00e5 vilka IRQ:er som h\u00f6r till RX-k\u00f6erna och kopplar sedan fast dem:<\/p>\n<pre><code>grep -E \"eth0.*Rx\" \/proc\/interrupts\ncat \/sys\/class\/net\/eth0\/device\/numa_node\n<\/code><\/pre>\n<p>Jag g\u00f6r tilldelningen via <code>smp_affinity_list<\/code>, s\u00e5 att jag slipper r\u00e4kna ut hexmasker. Exempel: RX-k\u00f6er 0\u20137 p\u00e5 k\u00e4rnorna 2\u20139:<\/p>\n<pre><code># Exempel: Tilldela IRQ:er till k\u00e4rnorna 2\u20139 (en rad per IRQ)\necho 2  &gt; \/proc\/irq\/\/smp_affinity_list\necho 3  &gt; \/proc\/irq\/\/smp_affinity_list\necho 4  &gt; \/proc\/irq\/\/smp_affinity_list\n...\necho 9  &gt; \/proc\/irq\/\/smp_affinity_list\n<\/code><\/pre>\n<p>Viktigt: MSI-X m\u00e5ste vara aktiverat f\u00f6r att varje k\u00f6 ska ha egna avbrott. Om jag anv\u00e4nder manuell pinning sp\u00e4rrar jag <code>irqbalans<\/code> f\u00f6r dessa IRQ:er (t.ex. via en svartlista) eller inaktivera tj\u00e4nsten specifikt p\u00e5 v\u00e4rddatorer med statisk layout. Jag kontrollerar dessutom NUMA med <code>lscpu<\/code> och PCIe-tilldelningen, s\u00e5 att jag inte skapar v\u00e4gar mellan noder.<\/p>\n\n<h2>Hash-konfiguration och protokoll<\/h2>\n\n<p>Jag definierar hash-f\u00e4lten s\u00e5 att \u00e4kta <strong>Trafik<\/strong>-Sprid m\u00f6nstren j\u00e4mnt ist\u00e4llet f\u00f6r att de hamnar i endast ett f\u00e5tal k\u00f6er. F\u00f6r TCP\/UDP anv\u00e4nder jag 4-tupeln, f\u00f6r IPv6 p\u00e5 liknande s\u00e4tt, medan jag vid VXLAN eller GRE tar h\u00e4nsyn till ytterligare f\u00e4lt i kapslingen. Vissa n\u00e4tverkskort erbjuder konfigurerbara hashnycklar, som jag anpassar efter den dominerande arbetsbelastningen. S\u00e5 snart jag ser belastningskluster i enskilda k\u00f6er justerar jag hashvalet. Detta steg tar lite tid, men f\u00f6rhindrar en <strong>obalans<\/strong> vid h\u00f6gt antal anslutningar.<\/p>\n\n<h2>Interrupt-Coalescing och PPS<\/h2>\n\n<p>Jag kombinerar RSS med m\u00e5ttlig <strong>Sammanslagning av avbrott<\/strong>, f\u00f6r att samla PPS-intensiv trafik i hanterbara batcher. Detta minskar avbrotts\u00f6verheaden, men f\u00e5r inte f\u00f6rs\u00e4mra latensen f\u00f6r k\u00e4nsliga tj\u00e4nster. D\u00e4rf\u00f6r m\u00e4ter jag rundturstider och justerar coalescing-v\u00e4rdena stegvis. Den som hanterar lagrings- eller s\u00e4kerhetskopieringsbelastning kan sammanf\u00f6ra i st\u00f6rre utstr\u00e4ckning \u00e4n vid L7-API:er eller VoIP. Sammanfattningsvis balanserar jag <strong>F\u00f6rdr\u00f6jning<\/strong> mot genomstr\u00f6mning, tills b\u00e5da st\u00e4mmer \u00f6verens.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/performance_tuning_linux_1234.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Koalescens i praktiken: profiler och m\u00e4tpunkter<\/h2>\n\n<p>Jag b\u00f6rjar med m\u00e5ttliga standardinst\u00e4llningar och arbetar mig fram mot det optimala f\u00f6r varje arbetsbelastning. Tre bepr\u00f6vade utg\u00e5ngsprofiler:<\/p>\n<ul>\n  <li>API\/l\u00e5g latens: <code>rx-usecs 2\u20136<\/code>, <code>rx-ramar 16\u201332<\/code>, adaptiv av<\/li>\n  <li>Allround: <code>rx-usecs 8\u201316<\/code>, <code>rx-ramar 32\u201364<\/code>, anpassningsbar till<\/li>\n  <li>Bulk\/Lagring: <code>24\u201348 rx-usecs<\/code>, <code>rx-ramar 128\u2013256<\/code>, anpassningsbar till<\/li>\n<\/ul>\n<pre><code>ethtool -c eth0\nethtool -C eth0 rx-usecs 12 rx-frames 64 adaptive-rx on\n<\/code><\/pre>\n<p>F\u00f6r detta m\u00e4ter jag p95\/p99-latenser, PPS, CPU-belastning per k\u00e4rna och \u00e5teruts\u00e4ndningar. S\u00e5 snart jag ser en \u00f6kande varians f\u00f6r API\/VoIP g\u00e5r jag vidare med <code>rx-usecs<\/code> ner igen. N\u00e4r det g\u00e4ller lagring skalar jag hellre upp via bildrutor f\u00f6r att spara p\u00e5 avbrott.<\/p>\n\n<h2>RSS i 10-Gbit-milj\u00f6er<\/h2>\n\n<p>P\u00e5 10G-n\u00e4tverkskort arbetar jag oftast med 8 till 16 <strong>Ledtr\u00e5dar<\/strong> per port, f\u00f6rutsatt att CPU:n tillhandah\u00e5ller tillr\u00e4ckligt m\u00e5nga k\u00e4rnor. Webbservrar, lagringsgateways och virtualiseringsv\u00e4rdar skalar d\u00e4rmed smidigt \u00f6ver m\u00e5nga parallella anslutningar. Jag kopplar huvudk\u00f6erna till lediga k\u00e4rnor och m\u00e4ter d\u00e4refter PPS, latens och \u00e5teruts\u00e4ndningar. Om det uppst\u00e5r f\u00f6rluster kontrollerar jag coalescing, hash och utnyttjandet per k\u00f6. D\u00e4refter finjusterar jag <strong>affinitet<\/strong>, tills belastningen ser j\u00e4mn ut.<\/p>\n\n<h2>RSS i 25-Gbit- och Multi-25G-konfigurationer<\/h2>\n\n<p>Med 25 Gbit\/s \u00f6kar PPS och bussbelastningen, vilket \u00e4r anledningen till att jag <strong>NUMA<\/strong>-Var mer uppm\u00e4rksam p\u00e5 tillr\u00e4ckligt med k\u00f6er och avlastningar. Large Receive Offload (LRO) eller RSC kan minska paketbelastningen p\u00e5 stacken, f\u00f6rutsatt att applikationerna klarar det. Dessutom kontrollerar jag PCIe-banor f\u00f6r att utesluta flaskhalsar utanf\u00f6r n\u00e4tverket. I v\u00e4rddatorer med flera 25G-l\u00e4nkar separerar jag k\u00f6er och affinitet strikt efter uppgifter och noder. P\u00e5 s\u00e5 s\u00e4tt anv\u00e4nder jag <strong>Bandbredd<\/strong> och k\u00e4rnor p\u00e5 ett effektivt s\u00e4tt, utan att hamna i trafik mellan noder.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/linuxnetztuning_7234.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>H\u00e5rdvaru- och drivrutinsinformation: vad jag tar h\u00e4nsyn till<\/h2>\n\n<p>Alla n\u00e4tverkskort fungerar inte p\u00e5 samma s\u00e4tt. Intels olika generationer (t.ex. ixgbe, i40e, ice) erbjuder funktioner som Flow Director\/ATR, som p\u00e5 ett m\u00e5linriktat s\u00e4tt kopplar fl\u00f6den till k\u00f6er \u2013 vilket \u00e4r anv\u00e4ndbart n\u00e4r jag vill j\u00e4mna ut flaskhalsar. Mellanox mlx5 kan st\u00f6dja aRFS i h\u00e5rdvaran, vilket minskar CPU-belastningen n\u00e4r stacken betj\u00e4nar m\u00e5nga socklar. Jag avg\u00f6r fr\u00e5n fall till fall om jag ska aktivera dessa funktioner och m\u00e4ter om de f\u00f6rb\u00e4ttrar f\u00f6rdelningen. P\u00e5 routing-\/NAT-system st\u00e4nger jag ofta av LRO och anv\u00e4nder ist\u00e4llet GRO f\u00f6r att uppr\u00e4tth\u00e5lla header-konsistensen; p\u00e5 rena serverarbetsbelastningar kan LRO\/GRO bidra till att d\u00e4mpa PPS-trycket. Det \u00e4r dessutom viktigt med tillr\u00e4ckligt m\u00e5nga MSI-X-vektorer per k\u00f6 och korrekta firmwareversioner.<\/p>\n\n<h2>RSS inom virtualisering och containrar<\/h2>\n\n<p>I hypervisorn kombinerar jag fysiska <strong>RSS<\/strong>-K\u00f6er med vNIC:er som st\u00f6der flera k\u00f6er, till exempel virtio-net, s\u00e5 att g\u00e4sterna inte drabbas av konstgjorda flaskhalsar. Jag ser till att virtuella maskiner har CPU-pinning och fastst\u00e4ller deras vCPU-NUMA-n\u00e4rhet till det fysiska n\u00e4tverkskortet. P\u00e5 s\u00e5 s\u00e4tt stannar data lokalt och v\u00e4rden betalar mindre f\u00f6r minnes\u00e5tkomst. F\u00f6r containrar kopplar jag kritiska poddar till l\u00e4mpliga k\u00e4rnor och h\u00e5ller v\u00e4rdk\u00f6erna fria fr\u00e5n st\u00f6rande belastning. Denna ordning \u00f6kar <strong>Effektivitet<\/strong> vid mikrotj\u00e4nster, d\u00e4r m\u00e5nga sm\u00e5 fl\u00f6den uppst\u00e5r.<\/p>\n\n<h2>Att anv\u00e4nda SR-IOV och VF-RSS p\u00e5 r\u00e4tt s\u00e4tt<\/h2>\n\n<p>Med SR-IOV tilldelar jag virtuella maskiner (VM) egna virtuella funktioner (VF), som i sin tur kan tillhandah\u00e5lla flera k\u00f6er och RSS. Jag planerar in tillr\u00e4ckligt m\u00e5nga virtuella funktioner (VF) per port, tar h\u00e4nsyn till MSI-X-kapaciteten och kopplar VF-IRQ:erna i den virtuella maskinen s\u00e5 att de st\u00e4mmer \u00f6verens med dess vCPU:er. I Linux-g\u00e4ster aktiverar jag Multi-Queue explicit, annars f\u00f6rblir vNIC:en ofta enstegs:<\/p>\n<pre><code># i g\u00e4st (virtio-net-exempel)\nethtool -l eth0\nethtool -L eth0 combined 4\n<\/code><\/pre>\n<p>Jag f\u00f6rdelar v\u00e4rddatorer med flera virtuella funktioner (VF) strikt per NUMA-nod och arbetsbelastning, s\u00e5 att virtuella maskiner (VM) inte st\u00f6r varandra i samma fysiska RX-v\u00e4gar.<\/p>\n\n<h2>\u00d6vervakning och fels\u00f6kning<\/h2>\n\n<p>Jag \u00f6vervakar utnyttjandegraden per <strong>K\u00f6<\/strong>, enskilda k\u00e4rnor, paketf\u00f6rluster och \u00e5teruts\u00e4ndningar f\u00f6r att uppt\u00e4cka obalanser i ett tidigt skede. Om en k\u00e4rna lyfter medan andra f\u00f6rblir lediga st\u00e4mmer ofta inte affiniteten eller antalet k\u00f6er. I s\u00e5dana fall kontrollerar jag hashf\u00e4lt, IRQ-masker och coalescing-v\u00e4rden ett efter ett. Dessutom tittar jag p\u00e5 <a href=\"https:\/\/webhosting.de\/sv\/softirq-cpu-hosting-naetverk-genomstroemning-optimering-datacenter\/\">SoftIRQ-belastning<\/a>, eftersom den ger indikationer p\u00e5 uttr\u00e4ngningseffekter. F\u00f6rst n\u00e4r dessa signaler ser stabila ut skalar jag upp trafiken eller ut\u00f6kar <strong>Ledtr\u00e5dar<\/strong> forts\u00e4tta.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/08\/servernetzwerk-optimierung-4721.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>RPS, RFS och XPS: Programvarutill\u00e4gg till RSS<\/h2>\n\n<p>Om ett n\u00e4tverkskort bara har n\u00e5gra f\u00e5 k\u00f6er eller om jag anv\u00e4nder n\u00e4tverksbundning\/tunneling kompletterar jag RSS med <strong>RPS<\/strong> (Receive Packet Steering) och <strong>RFS<\/strong> (Receive Flow Steering). RPS f\u00f6rdelar SoftIRQ:er mellan k\u00e4rnorna, medan RFS kopplar fl\u00f6den till den k\u00e4rna d\u00e4r den tillh\u00f6rande sockeln \u00e4r aktiv. Jag aktiverar b\u00e5da p\u00e5 ett m\u00e5linriktat s\u00e4tt:<\/p>\n<pre><code># \u00d6ka antalet globala fl\u00f6desposter (RFS)\necho 32768 &gt; \/proc\/sys\/net\/core\/rps_sock_flow_entries\n\n# St\u00e4lla in antal CPU:er per RX-k\u00f6 f\u00f6r RPS (exempelmask, anpassa!)\nfor f in \/sys\/class\/net\/eth0\/queues\/rx-*\/rps_cpus; do echo ffff &gt; \"$f\"; done\n\nSt\u00e4ll in fl\u00f6destabellen f\u00f6r # Pro RX-k\u00f6 f\u00f6r RFS\nfor f in \/sys\/class\/net\/eth0\/queues\/rx-*\/rps_flow_cnt; do echo 4096 &gt; \"$f\"; done\n<\/code><\/pre>\n<p>P\u00e5 TX-sidan anv\u00e4nder jag <strong>XPS<\/strong> (Transmit Packet Steering), s\u00e5 att utg\u00e5ende paket skickas fr\u00e5n den k\u00e4rna som genererade dem:<\/p>\n<pre><code>for f in \/sys\/class\/net\/eth0\/queues\/tx-*\/xps_cpus; do echo ffff &gt; \"$f\"; done\n<\/code><\/pre>\n<p>RPS\/RFS\/XPS kr\u00e4ver lite CPU-resurser, men \u00e4r till hj\u00e4lp n\u00e4r jag saknar k\u00f6er p\u00e5 h\u00e5rdvarusidan eller n\u00e4r jag vill h\u00e5lla strikt fast vid socket-lokaliteten.<\/p>\n\n<h2>Single-Flow-prestanda, GRO\/TSO och Busy-Polling<\/h2>\n\n<p>En enskild str\u00f6m f\u00f6rblir av goda sk\u00e4l bunden till en k\u00e4rna. Om jag vill \u00f6ka bandbredden f\u00f6r en enskild str\u00f6m satsar jag p\u00e5 avlastning (GRO\/TSO), en h\u00f6g k\u00e4rnfrekvens och v\u00e4lavst\u00e4md sammanslagning. F\u00f6r latenskritiska v\u00e4gar kan <strong>Upptagen polling<\/strong> hj\u00e4lpa:<\/p>\n<pre><code>St\u00e4ll in # p\u00e5 ett l\u00e5gt v\u00e4rde och m\u00e4t\nsysctl -w net.core.busy_read=25\nsysctl -w net.core.busy_poll=25\n<\/code><\/pre>\n<p>Busy-Polling minskar antalet kontextbyten, men tar upp CPU-tid. Jag aktiverar det endast d\u00e4r p99-latenser spelar roll och kontrollerar alltid effekterna p\u00e5 den totala belastningen och tail-latensen. GRO brukar jag vanligtvis ha avst\u00e4ngt p\u00e5 servrar, medan jag anv\u00e4nder LRO beroende p\u00e5 roll; n\u00e4r det g\u00e4ller middleboxar \u00e4r jag f\u00f6rsiktig f\u00f6r att inte st\u00f6ra bearbetningen av rubriker och hash-konsistensen.<\/p>\n\n<h2>Rekommendationer och exempel: k\u00f6er, affinitet, kommandon<\/h2>\n\n<p>Som utg\u00e5ngspunkt v\u00e4ljer jag ett antal k\u00f6er som passar till <strong>CPU<\/strong> Justera, observera sedan belastningen per k\u00f6 och justera stegvis. Vid 10G r\u00e4cker det ofta med 8\u201316 k\u00f6er, vid 25G s\u00e4tter jag ofta ett h\u00f6gre antal, f\u00f6rutsatt att det finns tillr\u00e4ckligt med k\u00e4rnor. F\u00f6r affinitet anv\u00e4nder jag tydliga masker per IRQ, s\u00e5 att jag senare l\u00e4ttare kan analysera v\u00e4garna. F\u00f6ljande tabell ger kompakta riktv\u00e4rden som jag sedan verifierar genom m\u00e4tningar. Det \u00e4r f\u00f6rst m\u00e4tresultaten som avg\u00f6r om jag <strong>mer<\/strong> \u00f6ka eller minska.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>L\u00e4nkhastighet<\/th>\n      <th>Typiska RX-k\u00f6er<\/th>\n      <th>Exempel p\u00e5 kommandon<\/th>\n      <th>Anteckningar<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>10 Gbit\/s<\/td>\n      <td>8-16<\/td>\n      <td><code>ethtool -l eth0<\/code> | <code>ethtool -L eth0 rx 16<\/code><\/td>\n      <td><strong>Sammansm\u00e4ltning<\/strong> H\u00e5ll en m\u00e5ttlig niv\u00e5, kontrollera L7-latensen<\/td>\n    <\/tr>\n    <tr>\n      <td>25 Gbit\/s<\/td>\n      <td>16\u201332+<\/td>\n      <td><code>grep . \/proc\/interrupts<\/code> | IRQ-masker per <code>eko<\/code><\/td>\n      <td><strong>NUMA<\/strong> Observera, kontrollera PCIe-banorna<\/td>\n    <\/tr>\n    <tr>\n      <td>Multi-25G<\/td>\n      <td>Per portion separat<\/td>\n      <td>Aktivera vNIC Multi-Queue (t.ex. virtio)<\/td>\n      <td>K\u00f6er p\u00e5 k\u00e4rnor och <strong>Arbetsbelastning<\/strong> dela<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<p>Dessa riktv\u00e4rden utg\u00f6r endast en utg\u00e5ngspunkt, inte ett m\u00e5l, eftersom arbetsbelastningarna varierar kraftigt. Jag dokumenterar \u00e4ndringar, m\u00e4ter f\u00f6re och efter justeringen och h\u00e5ller i \u00f6vrigt milj\u00f6n of\u00f6r\u00e4ndrad. S\u00e5 snart systemet f\u00f6rblir stabilt under produktionsbelastning l\u00e5ser jag konfigurationen. Senare upprepar jag m\u00e4tningarna efter uppdateringar av k\u00e4rnan eller drivrutinerna. P\u00e5 s\u00e5 s\u00e4tt h\u00e5ller jag mig till <strong>RSS<\/strong> H\u00e5ller kursen och ger s\u00e4kra, reproducerbara resultat.<\/p>\n\n<h2>Vanliga hinder och \u00e5tg\u00e4rder f\u00f6r att undvika dem<\/h2>\n\n<p>F\u00f6r f\u00e5 <strong>Ledtr\u00e5dar<\/strong> Enstaka k\u00e4rnor \u00f6verbelastas, medan f\u00f6r m\u00e5nga \u00f6kar administrationsarbetet och f\u00f6rs\u00e4mrar cache-tr\u00e4fffrekvensen. En olycklig affinitet f\u00f6rskjuter avbrott till redan belastade k\u00e4rnor eller felaktiga NUMA-noder. \u00c4ven en ol\u00e4mplig hash leder till att dominerande fl\u00f6den t\u00e4pper till k\u00f6erna. Jag l\u00f6ser detta steg f\u00f6r steg: justera antalet k\u00f6er, korrigera affiniteten, ut\u00f6ka hash-f\u00e4lten, finjustera coalescing. Varje \u00e4ndring dokumenterar jag med <strong>M\u00e4tetal<\/strong>, innan jag g\u00e5r vidare till n\u00e4sta spak.<\/p>\n\n<h2>Praktiska scenarier<\/h2>\n\n<p>En lagringsserver med 10G drar snabbt nytta av 8\u201312 <strong>Ledtr\u00e5dar<\/strong> samt m\u00e5ttlig koalescering f\u00f6r att genomf\u00f6ra bulk\u00f6verf\u00f6ringar smidigt. En API-server med ett stort antal anslutningar beh\u00f6ver ofta finare hashf\u00e4lt och l\u00e4gre latens vid avbrott. Virtualiseringsv\u00e4rdar vinner betydligt p\u00e5 att ha vNIC-Multi-Queue aktiverat p\u00e5 g\u00e4stsidan och att det passar v\u00e4rdens layout. Container-arbetsbelastningar fungerar smidigare n\u00e4r kritiska podar k\u00f6rs n\u00e4ra NIC och NUMA-minne. Dessa m\u00f6nster ut\u00f6kar jag situationsanpassat genom att <strong>PPS<\/strong>, j\u00e4mf\u00f6r vidarebefordringar och k\u00f6f\u00f6rdelning.<\/p>\n\n<h2>Kraftfulla plattformar som en f\u00f6rdel<\/h2>\n\n<p>Webbhotellkonfigurationer med konsekvent inst\u00e4llda <strong>RSS<\/strong>, n\u00e4tverkskort med flera k\u00f6er och korrekt affinitet ger m\u00e4rkbara reserver vid toppbelastning. Den som utv\u00e4rderar servererbjudanden b\u00f6r specifikt fr\u00e5ga efter st\u00f6d f\u00f6r flera k\u00f6er, NUMA-pinning och \u00f6vervakning. En leverant\u00f6r som tydligt implementerar dessa punkter uppn\u00e5r ofta m\u00e4rkbart b\u00e4ttre genomstr\u00f6mningskurvor. F\u00f6r h\u00f6gpresterande server- och hostingl\u00f6sningar vill jag h\u00e4r ge webhoster.de som en klar rekommendation. Denna inriktning l\u00f6nar sig i <strong>Prestanda<\/strong> och stabilitet, s\u00e4rskilt vid m\u00e5nga parallella fl\u00f6den.<\/p>\n\n<h2>Sammanfattning f\u00f6r praktiken<\/h2>\n\n<p>Jag aktiverar <strong>Ta emot<\/strong> Sidosskalning: st\u00e4ll in ett rimligt antal k\u00f6er, koppla IRQ:er till l\u00e4mpliga k\u00e4rnor och kontrollera hashkonfigurationen. D\u00e4refter optimerar jag coalescing mot latens, ser till att NUMA-n\u00e4rheten \u00e4r optimal och f\u00f6rdelar arbetsbelastningarna konsekvent. Vid virtualisering anv\u00e4nder jag Multi-Queue \u00e4nda in i g\u00e4sterna och h\u00e5ller pinning och affinitet synkroniserade. M\u00e4tningar av PPS, k\u00f6belastning, \u00e5teruts\u00e4ndningar och latens avg\u00f6r n\u00e4sta steg. Den som g\u00e5r tillv\u00e4ga p\u00e5 detta s\u00e4tt utnyttjar 10G och 25G fullt ut och h\u00e5ller <strong>F\u00f6rdr\u00f6jning<\/strong> inom ramen f\u00f6r detta och uppn\u00e5r p\u00e5litliga n\u00e4tverksavkastningar.<\/p>","protected":false},"excerpt":{"rendered":"<p>Receive Side Scaling optimerar 10G- och 25G-n\u00e4tverk genom att f\u00f6rdela paket mellan flera CPU-k\u00e4rnor. L\u00e4r dig hur du konfigurerar RSS p\u00e5 en Linux-server f\u00f6r att f\u00e5 ut maximal prestanda ur din installation. Fokus: Receive Side Scaling i h\u00f6ghastighetsmilj\u00f6er.<\/p>","protected":false},"author":1,"featured_media":21050,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[676],"tags":[],"class_list":["post-21057","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server_vm"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"163","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"receive side scaling","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"21050","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts\/21057","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/comments?post=21057"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts\/21057\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/media\/21050"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/media?parent=21057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/categories?post=21057"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/tags?post=21057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}