[{"data":1,"prerenderedAt":1776},["ShallowReactive",2],{"category-devops":3},[4],{"id":5,"title":6,"body":7,"categories":1756,"coverImage":1760,"date":1761,"description":1762,"extension":1763,"meta":1764,"navigation":378,"path":1765,"seo":1766,"stem":1767,"sticky":1768,"tags":1769,"__hash__":1775},"articles/nanopi-r76s-router-2-5gbps-performance-speed-boost.md","Ottimizzare le prestazioni del router NanoPi R76S con OpenWrt: da 600 Mbps a oltre 2 Gbps",{"type":8,"value":9,"toc":1736},"minimark",[10,38,43,58,69,80,84,91,96,132,151,154,158,165,168,198,202,205,234,239,266,272,274,278,289,293,301,304,330,337,340,455,457,461,468,481,783,789,805,807,811,817,830,1322,1326,1340,1342,1349,1356,1359,1443,1447,1461,1463,1467,1474,1477,1499,1501,1505,1516,1526,1567,1569,1573,1576,1626,1629,1637,1639,1643,1646,1699,1703,1709,1717,1732],[11,12,13,14,18,19,22,23,26,27,30,31,34,35,30],"p",{},"Questa settimana ho sostituito il mio amatissimo ",[15,16,17],"strong",{},"EdgeRouter X SFP"," (un router a mio avviso ottimo per qualità/prezzo ma purtroppo limitato a 1gbps)\ncon un ",[15,20,21],{},"NanoPi R76S",", un piccolo router ARMv8 basato su ",[15,24,25],{},"Rockchip RK3576",", pubblicizzato con porte ",[15,28,29],{},"2.5GbE",".",[32,33],"br",{},"\nSulla carta, doveva essere perfetto ma nella pratica… ",[15,36,37],{},"non lo era affatto",[39,40,42],"h2",{"id":41},"perché-ho-scelto-il-friendlyelec-nanopi-r76s","Perché ho scelto il FriendlyELEC NanoPi R76S",[11,44,45,46,49,50,53,54,57],{},"Quando ho deciso di sostituire il mio vecchio EdgeRouter X SFP, cercavo qualcosa di compatto, silenzioso e moderno, ma soprattutto ",[15,47,48],{},"abbastanza potente da gestire la mia nuova connessione 2.5gbps FTTH"," senza sudare troppo.\nDopo un po’ di ricerche mi sono imbattuto nel ",[15,51,52],{},"FriendlyELEC NanoPi R76S"," — un piccolo router con un look quasi da mini NUC, ma costruito attorno a un ",[15,55,56],{},"SoC Rockchip RK3576"," con ben otto core ARM (quattro Cortex-A76 e quattro Cortex-A55) e due porte Ethernet 2.5 GbE basate su chip Realtek RTL8125B.",[11,59,60,61,64,65,68],{},"Oltre alla potenza, mi ha convinto anche la forma fisica: ",[15,62,63],{},"il case in alluminio anodizzato nero",", le ",[15,66,67],{},"dimensioni davvero ridotte"," e il fatto che si alimenti tramite USB-C.\nNel mio piccolo armadietto server domestico — dove ogni centimetro e ogni alimentatore contano — questo dettaglio ha fatto la differenza.\nFinalmente niente più brick da 12 V con spinotto, ma un semplice cavo USB-C come quello di uno smartphone.",[11,70,71,72,75,76,79],{},"A bordo c’è ",[15,73,74],{},"FriendlyWrt",", la versione personalizzata di ",[15,77,78],{},"OpenWrt"," mantenuta da FriendlyELEC, che di base è già un ottimo punto di partenza.",[39,81,83],{"id":82},"la-delusione","La delusione",[11,85,86,87,90],{},"Dopo l’installazione pulita di ",[15,88,89],{},"FriendlyWrt 24.10 (OpenWrt 24.10)",", entusiasta di poter finalemnte testare la nuova conenssione multi-gigabit\nho eseguito i primi test con la CLI di Ookla (speedtest) pregustando già la soddisfazione di vedere schizzare la banda.",[11,92,93],{},[15,94,95],{},"I risultati sono stati deludenti:",[97,98,99,115],"table",{},[100,101,102],"thead",{},[103,104,105,109,112],"tr",{},[106,107,108],"th",{},"Test",[106,110,111],{},"Download",[106,113,114],{},"Upload",[116,117,118],"tbody",{},[103,119,120,126,129],{},[121,122,123],"td",{},[15,124,125],{},"Before tuning",[121,127,128],{},"606 Mbps",[121,130,131],{},"771 Mbps",[11,133,134,135,139,140,142,143,146,147,150],{},"Ho iniziato a fare dei test più approfonditi, ",[136,137,138],"code",{},"htop"," alla mano, e il collo di bottiglia era evidente: la CPU si saturava su un solo core durante i test, mentre gli altri restavano praticamente inattivi.",[32,141],{},"\nNonostante il ",[136,144,145],{},"flow_offloading"," fosse attivo nel firewall, ",[15,148,149],{},"il kernel non stava distribuendo correttamente gli interrupt (IRQ)"," delle interfacce di rete sui vari core.",[152,153],"hr",{},[39,155,157],{"id":156},"diagnosi-irq-rps-xps-e-cpu-governor","Diagnosi: IRQ, RPS, XPS e CPU governor",[11,159,160,161,164],{},"Il SoC ",[15,162,163],{},"RK3576"," supporta 8 core, ma senza una corretta gestione delle code e delle interrupt mask, OpenWrt tende ad assegnare tutto a un singolo core (con esattezza lo 0).",[11,166,167],{},"Ho quindi individuato tre aree di intervento:",[169,170,171,186,192],"ol",{},[172,173,174,177,178,181,182,185],"li",{},[15,175,176],{},"Distribuire gli IRQ"," delle interfacce di rete (",[136,179,180],{},"eth0",", ",[136,183,184],{},"eth1",") su più core CPU",[172,187,188,191],{},[15,189,190],{},"Abilitare e ottimizzare RPS/XPS"," (Receive/Transmit Packet Steering)",[172,193,194,197],{},[15,195,196],{},"Forzare la CPU in modalità “performance”"," per evitare scaling aggressivo della frequenza",[39,199,201],{"id":200},"️-tuning-v1-rpsxps-e-sysctl-base","⚙️ Tuning v1 — RPS/XPS e Sysctl base",[11,203,204],{},"La prima iterazione ha incluso:",[206,207,208,214,221,227],"ul",{},[172,209,210,211],{},"Abilitazione di ",[136,212,213],{},"net.core.rps_sock_flow_entries=65536",[172,215,216,217,220],{},"Configurazione di RPS e XPS su tutti i core (",[136,218,219],{},"0xff",")",[172,222,223,224],{},"Applicazione permanente via ",[136,225,226],{},"/etc/hotplug.d/net/99-optimize-network",[172,228,229,230,233],{},"Disattivazione di ",[136,231,232],{},"irqbalance"," per gestire manualmente le CPU affinity",[235,236,238],"h3",{"id":237},"risultato","Risultato",[97,240,241,251],{},[100,242,243],{},[103,244,245,247,249],{},[106,246,108],{},[106,248,111],{},[106,250,114],{},[116,252,253],{},[103,254,255,260,263],{},[121,256,257],{},[15,258,259],{},"Tuning v1",[121,261,262],{},"706 Mbps",[121,264,265],{},"928 Mbps",[11,267,268,269,271],{},"Il miglioramento è stato tangibile (almeno lato upload), ma non risolutivo.",[32,270],{},"\nLa saturazione CPU era distribuita meglio, ma ancora incompleta: i pacchetti non sfruttavano tutti i core disponibili.",[152,273],{},[39,275,277],{"id":276},"tuning-finale-irq-affinity-cpu-performance-mode","🔥 Tuning finale — IRQ affinity + CPU performance mode",[11,279,280,281,284,285,288],{},"Il tuning finale che porta ai ~2 Gbps stabili il ",[15,282,283],{},"NanoPi R76S (RK3576)"," con ",[15,286,287],{},"FriendlyWrt/OpenWrt 24.10"," richiede l'introduzione di diversi parametri finalizzati prevalentemente a distribuire il carico sui (tanti) core disponibili e distribuire i flussi di rete coerentemente.",[235,290,292],{"id":291},"_1️⃣-sysctl-tuning-del-network-stack","🧩 1️⃣  Sysctl – Tuning del network stack",[11,294,295,296],{},"📄 ",[15,297,298],{},[136,299,300],{},"/etc/sysctl.d/60-rps.conf",[11,302,303],{},"→ imposta le entry per i flussi RPS (Receive Packet Steering)",[305,306,311],"pre",{"className":307,"code":308,"language":309,"meta":310,"style":310},"language-bash shiki shiki-themes github-light github-dark","net.core.rps_sock_flow_entries = 65536\n","bash","",[136,312,313],{"__ignoreMap":310},[314,315,318,322,326],"span",{"class":316,"line":317},"line",1,[314,319,321],{"class":320},"sScJk","net.core.rps_sock_flow_entries",[314,323,325],{"class":324},"sZZnC"," =",[314,327,329],{"class":328},"sj4cs"," 65536\n",[11,331,295,332],{},[15,333,334],{},[136,335,336],{},"/etc/sysctl.d/99-network-tune.conf",[11,338,339],{},"→ parametri generali di rete + TCP tuning (coerenti con BBR)",[305,341,343],{"className":307,"code":342,"language":309,"meta":310,"style":310},"# Fair Queueing + congestion control\nnet.core.default_qdisc = fq\nnet.ipv4.tcp_congestion_control = bbr\n\n# TCP tuning generali\nnet.ipv4.tcp_fastopen = 3\nnet.ipv4.tcp_tw_reuse = 2\nnet.ipv4.ip_local_port_range = 10000 65535\nnet.ipv4.tcp_fin_timeout = 30\n\n# Gestione traffico burst\nnet.core.netdev_max_backlog = 250000\n",[136,344,345,351,362,373,380,386,397,408,422,433,438,444],{"__ignoreMap":310},[314,346,347],{"class":316,"line":317},[314,348,350],{"class":349},"sJ8bj","# Fair Queueing + congestion control\n",[314,352,354,357,359],{"class":316,"line":353},2,[314,355,356],{"class":320},"net.core.default_qdisc",[314,358,325],{"class":324},[314,360,361],{"class":324}," fq\n",[314,363,365,368,370],{"class":316,"line":364},3,[314,366,367],{"class":320},"net.ipv4.tcp_congestion_control",[314,369,325],{"class":324},[314,371,372],{"class":324}," bbr\n",[314,374,376],{"class":316,"line":375},4,[314,377,379],{"emptyLinePlaceholder":378},true,"\n",[314,381,383],{"class":316,"line":382},5,[314,384,385],{"class":349},"# TCP tuning generali\n",[314,387,389,392,394],{"class":316,"line":388},6,[314,390,391],{"class":320},"net.ipv4.tcp_fastopen",[314,393,325],{"class":324},[314,395,396],{"class":328}," 3\n",[314,398,400,403,405],{"class":316,"line":399},7,[314,401,402],{"class":320},"net.ipv4.tcp_tw_reuse",[314,404,325],{"class":324},[314,406,407],{"class":328}," 2\n",[314,409,411,414,416,419],{"class":316,"line":410},8,[314,412,413],{"class":320},"net.ipv4.ip_local_port_range",[314,415,325],{"class":324},[314,417,418],{"class":328}," 10000",[314,420,421],{"class":328}," 65535\n",[314,423,425,428,430],{"class":316,"line":424},9,[314,426,427],{"class":320},"net.ipv4.tcp_fin_timeout",[314,429,325],{"class":324},[314,431,432],{"class":328}," 30\n",[314,434,436],{"class":316,"line":435},10,[314,437,379],{"emptyLinePlaceholder":378},[314,439,441],{"class":316,"line":440},11,[314,442,443],{"class":349},"# Gestione traffico burst\n",[314,445,447,450,452],{"class":316,"line":446},12,[314,448,449],{"class":320},"net.core.netdev_max_backlog",[314,451,325],{"class":324},[314,453,454],{"class":328}," 250000\n",[152,456],{},[235,458,460],{"id":459},"️-2️⃣-script-principale-applica-rpsxps-manualmente","⚙️ 2️⃣  Script principale – Applica RPS/XPS manualmente",[11,462,295,463],{},[15,464,465],{},[136,466,467],{},"/usr/local/sbin/apply-rpsxps.sh",[11,469,470,471,474,475,477,478,480],{},"→ comando indipendente che puoi eseguire a mano o al boot\n(applica ",[136,472,473],{},"MASK=ff"," su ",[136,476,180],{}," e ",[136,479,184],{},", e imposta i flussi globali)",[305,482,484],{"className":307,"code":483,"language":309,"meta":310,"style":310},"#!/bin/sh\nMASK_HEX=ff\nFLOW_ENTRIES=65536\nDEVS=\"eth0 eth1\"\nlogger -t rpsxps \"start apply (devs: $DEVS)\"\n\nsysctl -q -w net.core.rps_sock_flow_entries=\"$FLOW_ENTRIES\"\n\nfor IF in $DEVS; do\n  for RX in /sys/class/net/$IF/queues/rx-*; do\n    [ -d \"$RX\" ] || continue\n    echo \"$MASK_HEX\" > \"$RX/rps_cpus\"\n    echo 32768 > \"$RX/rps_flow_cnt\" 2>/dev/null\n  done\n  for TX in /sys/class/net/$IF/queues/tx-*; do\n    [ -d \"$TX\" ] || continue\n    echo \"$MASK_HEX\" > \"$TX/xps_cpus\"\n  done\ndone\nlogger -t rpsxps \"done apply (mask=$MASK_HEX, flows=$FLOW_ENTRIES)\"\n",[136,485,486,491,504,514,524,544,548,568,572,589,613,639,661,684,690,711,731,751,756,762],{"__ignoreMap":310},[314,487,488],{"class":316,"line":317},[314,489,490],{"class":349},"#!/bin/sh\n",[314,492,493,497,501],{"class":316,"line":353},[314,494,496],{"class":495},"sVt8B","MASK_HEX",[314,498,500],{"class":499},"szBVR","=",[314,502,503],{"class":324},"ff\n",[314,505,506,509,511],{"class":316,"line":364},[314,507,508],{"class":495},"FLOW_ENTRIES",[314,510,500],{"class":499},[314,512,513],{"class":324},"65536\n",[314,515,516,519,521],{"class":316,"line":375},[314,517,518],{"class":495},"DEVS",[314,520,500],{"class":499},[314,522,523],{"class":324},"\"eth0 eth1\"\n",[314,525,526,529,532,535,538,541],{"class":316,"line":382},[314,527,528],{"class":320},"logger",[314,530,531],{"class":328}," -t",[314,533,534],{"class":324}," rpsxps",[314,536,537],{"class":324}," \"start apply (devs: ",[314,539,540],{"class":495},"$DEVS",[314,542,543],{"class":324},")\"\n",[314,545,546],{"class":316,"line":388},[314,547,379],{"emptyLinePlaceholder":378},[314,549,550,553,556,559,562,565],{"class":316,"line":399},[314,551,552],{"class":320},"sysctl",[314,554,555],{"class":328}," -q",[314,557,558],{"class":328}," -w",[314,560,561],{"class":324}," net.core.rps_sock_flow_entries=\"",[314,563,564],{"class":495},"$FLOW_ENTRIES",[314,566,567],{"class":324},"\"\n",[314,569,570],{"class":316,"line":410},[314,571,379],{"emptyLinePlaceholder":378},[314,573,574,577,580,583,586],{"class":316,"line":424},[314,575,576],{"class":499},"for",[314,578,579],{"class":495}," IF ",[314,581,582],{"class":499},"in",[314,584,585],{"class":495}," $DEVS; ",[314,587,588],{"class":499},"do\n",[314,590,591,594,597,599,602,605,608,611],{"class":316,"line":435},[314,592,593],{"class":499},"  for",[314,595,596],{"class":495}," RX ",[314,598,582],{"class":499},[314,600,601],{"class":324}," /sys/class/net/",[314,603,604],{"class":495},"$IF",[314,606,607],{"class":324},"/queues/rx-*",[314,609,610],{"class":495},"; ",[314,612,588],{"class":499},[314,614,615,618,621,624,627,630,633,636],{"class":316,"line":440},[314,616,617],{"class":495},"    [ ",[314,619,620],{"class":499},"-d",[314,622,623],{"class":324}," \"",[314,625,626],{"class":495},"$RX",[314,628,629],{"class":324},"\"",[314,631,632],{"class":495}," ] ",[314,634,635],{"class":499},"||",[314,637,638],{"class":499}," continue\n",[314,640,641,644,646,649,651,654,656,658],{"class":316,"line":446},[314,642,643],{"class":328},"    echo",[314,645,623],{"class":324},[314,647,648],{"class":495},"$MASK_HEX",[314,650,629],{"class":324},[314,652,653],{"class":499}," >",[314,655,623],{"class":324},[314,657,626],{"class":495},[314,659,660],{"class":324},"/rps_cpus\"\n",[314,662,664,666,669,671,673,675,678,681],{"class":316,"line":663},13,[314,665,643],{"class":328},[314,667,668],{"class":328}," 32768",[314,670,653],{"class":499},[314,672,623],{"class":324},[314,674,626],{"class":495},[314,676,677],{"class":324},"/rps_flow_cnt\"",[314,679,680],{"class":499}," 2>",[314,682,683],{"class":324},"/dev/null\n",[314,685,687],{"class":316,"line":686},14,[314,688,689],{"class":499},"  done\n",[314,691,693,695,698,700,702,704,707,709],{"class":316,"line":692},15,[314,694,593],{"class":499},[314,696,697],{"class":495}," TX ",[314,699,582],{"class":499},[314,701,601],{"class":324},[314,703,604],{"class":495},[314,705,706],{"class":324},"/queues/tx-*",[314,708,610],{"class":495},[314,710,588],{"class":499},[314,712,714,716,718,720,723,725,727,729],{"class":316,"line":713},16,[314,715,617],{"class":495},[314,717,620],{"class":499},[314,719,623],{"class":324},[314,721,722],{"class":495},"$TX",[314,724,629],{"class":324},[314,726,632],{"class":495},[314,728,635],{"class":499},[314,730,638],{"class":499},[314,732,734,736,738,740,742,744,746,748],{"class":316,"line":733},17,[314,735,643],{"class":328},[314,737,623],{"class":324},[314,739,648],{"class":495},[314,741,629],{"class":324},[314,743,653],{"class":499},[314,745,623],{"class":324},[314,747,722],{"class":495},[314,749,750],{"class":324},"/xps_cpus\"\n",[314,752,754],{"class":316,"line":753},18,[314,755,689],{"class":499},[314,757,759],{"class":316,"line":758},19,[314,760,761],{"class":499},"done\n",[314,763,765,767,769,771,774,776,779,781],{"class":316,"line":764},20,[314,766,528],{"class":320},[314,768,531],{"class":328},[314,770,534],{"class":324},[314,772,773],{"class":324}," \"done apply (mask=",[314,775,648],{"class":495},[314,777,778],{"class":324},", flows=",[314,780,564],{"class":495},[314,782,543],{"class":324},[11,784,785,786],{},"📌  ",[15,787,788],{},"Permessi:",[305,790,792],{"className":307,"code":791,"language":309,"meta":310,"style":310},"chmod +x /usr/local/sbin/apply-rpsxps.sh\n",[136,793,794],{"__ignoreMap":310},[314,795,796,799,802],{"class":316,"line":317},[314,797,798],{"class":320},"chmod",[314,800,801],{"class":324}," +x",[314,803,804],{"class":324}," /usr/local/sbin/apply-rpsxps.sh\n",[152,806],{},[235,808,810],{"id":809},"_3️⃣-hook-net-rpsxps-automatico-su-ogni-interfaccia","🔁 3️⃣  Hook NET – RPS/XPS automatico su ogni interfaccia",[11,812,295,813],{},[15,814,815],{},[136,816,226],{},[11,818,819,820,477,823,826,827,30],{},"Si attiva ogni volta che nasce una nuova interfaccia (eth*, VLAN, PPPoE).\nGarantisce che anche ",[136,821,822],{},"eth0.835",[136,824,825],{},"pppoe-wan"," ricevano ",[136,828,829],{},"rps_cpus=ff",[305,831,833],{"className":307,"code":832,"language":309,"meta":310,"style":310},"#!/bin/sh\n[ \"$ACTION\" = \"add\" ] || exit 0\ncase \"$DEVICENAME\" in eth*|pppoe-*) : ;; *) exit 0 ;; esac\n\nMASK_HEX=ff\nFLOW_ENTRIES=65536\nlogger -t rpsxps \"net hook: $DEVICENAME ACTION=$ACTION (mask=$MASK_HEX flows=$FLOW_ENTRIES)\"\nsysctl -q -w net.core.rps_sock_flow_entries=\"$FLOW_ENTRIES\"\n\nPARENT=\"$(basename \"$(readlink -f /sys/class/net/$DEVICENAME/lower_* 2>/dev/null || true)\")\"\n[ -n \"$PARENT\" ] || PARENT=\"$DEVICENAME\"\n\napply_one() {\n  IF=\"$1\"\n  for i in 1 2 3 4 5; do\n    [ -e \"/sys/class/net/$IF/queues/rx-0/rps_cpus\" ] && break\n    sleep 1\n  done\n  for RX in /sys/class/net/\"$IF\"/queues/rx-*; do\n    [ -e \"$RX/rps_cpus\" ] || continue\n    echo \"$MASK_HEX\" > \"$RX/rps_cpus\"\n    echo 32768 > \"$RX/rps_flow_cnt\" 2>/dev/null\n  done\n  for TX in /sys/class/net/\"$IF\"/queues/tx-*; do\n    [ -e \"$TX/xps_cpus\" ] || continue\n    echo \"$MASK_HEX\" > \"$TX/xps_cpus\"\n  done\n}\n\napply_one \"$PARENT\"\napply_one \"$DEVICENAME\"\n",[136,834,835,839,866,915,919,927,935,965,979,983,1027,1056,1060,1068,1082,1110,1131,1139,1143,1163,1182,1201,1220,1225,1245,1265,1284,1289,1295,1300,1311],{"__ignoreMap":310},[314,836,837],{"class":316,"line":317},[314,838,490],{"class":349},[314,840,841,844,846,849,851,853,856,858,860,863],{"class":316,"line":353},[314,842,843],{"class":495},"[ ",[314,845,629],{"class":324},[314,847,848],{"class":495},"$ACTION",[314,850,629],{"class":324},[314,852,325],{"class":499},[314,854,855],{"class":324}," \"add\"",[314,857,632],{"class":495},[314,859,635],{"class":499},[314,861,862],{"class":328}," exit",[314,864,865],{"class":328}," 0\n",[314,867,868,871,873,876,878,881,885,888,891,894,896,899,902,905,907,910,912],{"class":316,"line":364},[314,869,870],{"class":499},"case",[314,872,623],{"class":324},[314,874,875],{"class":495},"$DEVICENAME",[314,877,629],{"class":324},[314,879,880],{"class":499}," in",[314,882,884],{"class":883},"sA_wV"," eth",[314,886,887],{"class":499},"*|",[314,889,890],{"class":883},"pppoe-",[314,892,893],{"class":499},"*",[314,895,220],{"class":499},[314,897,898],{"class":328}," :",[314,900,901],{"class":495}," ;; ",[314,903,904],{"class":499},"*)",[314,906,862],{"class":328},[314,908,909],{"class":328}," 0",[314,911,901],{"class":495},[314,913,914],{"class":499},"esac\n",[314,916,917],{"class":316,"line":375},[314,918,379],{"emptyLinePlaceholder":378},[314,920,921,923,925],{"class":316,"line":382},[314,922,496],{"class":495},[314,924,500],{"class":499},[314,926,503],{"class":324},[314,928,929,931,933],{"class":316,"line":388},[314,930,508],{"class":495},[314,932,500],{"class":499},[314,934,513],{"class":324},[314,936,937,939,941,943,946,948,951,953,956,958,961,963],{"class":316,"line":399},[314,938,528],{"class":320},[314,940,531],{"class":328},[314,942,534],{"class":324},[314,944,945],{"class":324}," \"net hook: ",[314,947,875],{"class":495},[314,949,950],{"class":324}," ACTION=",[314,952,848],{"class":495},[314,954,955],{"class":324}," (mask=",[314,957,648],{"class":495},[314,959,960],{"class":324}," flows=",[314,962,564],{"class":495},[314,964,543],{"class":324},[314,966,967,969,971,973,975,977],{"class":316,"line":410},[314,968,552],{"class":320},[314,970,555],{"class":328},[314,972,558],{"class":328},[314,974,561],{"class":324},[314,976,564],{"class":495},[314,978,567],{"class":324},[314,980,981],{"class":316,"line":424},[314,982,379],{"emptyLinePlaceholder":378},[314,984,985,988,990,993,996,999,1002,1005,1007,1009,1012,1014,1016,1019,1021,1024],{"class":316,"line":435},[314,986,987],{"class":495},"PARENT",[314,989,500],{"class":499},[314,991,992],{"class":324},"\"$(",[314,994,995],{"class":320},"basename",[314,997,998],{"class":324}," \"$(",[314,1000,1001],{"class":320},"readlink",[314,1003,1004],{"class":328}," -f",[314,1006,601],{"class":324},[314,1008,875],{"class":495},[314,1010,1011],{"class":324},"/lower_",[314,1013,893],{"class":328},[314,1015,680],{"class":499},[314,1017,1018],{"class":324},"/dev/null ",[314,1020,635],{"class":499},[314,1022,1023],{"class":328}," true",[314,1025,1026],{"class":324},")\")\"\n",[314,1028,1029,1031,1034,1036,1039,1041,1043,1045,1048,1050,1052,1054],{"class":316,"line":440},[314,1030,843],{"class":495},[314,1032,1033],{"class":499},"-n",[314,1035,623],{"class":324},[314,1037,1038],{"class":495},"$PARENT",[314,1040,629],{"class":324},[314,1042,632],{"class":495},[314,1044,635],{"class":499},[314,1046,1047],{"class":495}," PARENT",[314,1049,500],{"class":499},[314,1051,629],{"class":324},[314,1053,875],{"class":495},[314,1055,567],{"class":324},[314,1057,1058],{"class":316,"line":446},[314,1059,379],{"emptyLinePlaceholder":378},[314,1061,1062,1065],{"class":316,"line":663},[314,1063,1064],{"class":320},"apply_one",[314,1066,1067],{"class":495},"() {\n",[314,1069,1070,1073,1075,1077,1080],{"class":316,"line":686},[314,1071,1072],{"class":495},"  IF",[314,1074,500],{"class":499},[314,1076,629],{"class":324},[314,1078,1079],{"class":328},"$1",[314,1081,567],{"class":324},[314,1083,1084,1086,1089,1091,1094,1097,1100,1103,1106,1108],{"class":316,"line":692},[314,1085,593],{"class":499},[314,1087,1088],{"class":495}," i ",[314,1090,582],{"class":499},[314,1092,1093],{"class":324}," 1",[314,1095,1096],{"class":324}," 2",[314,1098,1099],{"class":324}," 3",[314,1101,1102],{"class":324}," 4",[314,1104,1105],{"class":324}," 5",[314,1107,610],{"class":495},[314,1109,588],{"class":499},[314,1111,1112,1114,1117,1120,1122,1125,1128],{"class":316,"line":713},[314,1113,617],{"class":495},[314,1115,1116],{"class":499},"-e",[314,1118,1119],{"class":324}," \"/sys/class/net/",[314,1121,604],{"class":495},[314,1123,1124],{"class":324},"/queues/rx-0/rps_cpus\"",[314,1126,1127],{"class":495}," ] && ",[314,1129,1130],{"class":499},"break\n",[314,1132,1133,1136],{"class":316,"line":733},[314,1134,1135],{"class":320},"    sleep",[314,1137,1138],{"class":328}," 1\n",[314,1140,1141],{"class":316,"line":753},[314,1142,689],{"class":499},[314,1144,1145,1147,1149,1151,1154,1156,1159,1161],{"class":316,"line":758},[314,1146,593],{"class":499},[314,1148,596],{"class":495},[314,1150,582],{"class":499},[314,1152,1153],{"class":324}," /sys/class/net/\"",[314,1155,604],{"class":495},[314,1157,1158],{"class":324},"\"/queues/rx-*",[314,1160,610],{"class":495},[314,1162,588],{"class":499},[314,1164,1165,1167,1169,1171,1173,1176,1178,1180],{"class":316,"line":764},[314,1166,617],{"class":495},[314,1168,1116],{"class":499},[314,1170,623],{"class":324},[314,1172,626],{"class":495},[314,1174,1175],{"class":324},"/rps_cpus\"",[314,1177,632],{"class":495},[314,1179,635],{"class":499},[314,1181,638],{"class":499},[314,1183,1185,1187,1189,1191,1193,1195,1197,1199],{"class":316,"line":1184},21,[314,1186,643],{"class":328},[314,1188,623],{"class":324},[314,1190,648],{"class":495},[314,1192,629],{"class":324},[314,1194,653],{"class":499},[314,1196,623],{"class":324},[314,1198,626],{"class":495},[314,1200,660],{"class":324},[314,1202,1204,1206,1208,1210,1212,1214,1216,1218],{"class":316,"line":1203},22,[314,1205,643],{"class":328},[314,1207,668],{"class":328},[314,1209,653],{"class":499},[314,1211,623],{"class":324},[314,1213,626],{"class":495},[314,1215,677],{"class":324},[314,1217,680],{"class":499},[314,1219,683],{"class":324},[314,1221,1223],{"class":316,"line":1222},23,[314,1224,689],{"class":499},[314,1226,1228,1230,1232,1234,1236,1238,1241,1243],{"class":316,"line":1227},24,[314,1229,593],{"class":499},[314,1231,697],{"class":495},[314,1233,582],{"class":499},[314,1235,1153],{"class":324},[314,1237,604],{"class":495},[314,1239,1240],{"class":324},"\"/queues/tx-*",[314,1242,610],{"class":495},[314,1244,588],{"class":499},[314,1246,1248,1250,1252,1254,1256,1259,1261,1263],{"class":316,"line":1247},25,[314,1249,617],{"class":495},[314,1251,1116],{"class":499},[314,1253,623],{"class":324},[314,1255,722],{"class":495},[314,1257,1258],{"class":324},"/xps_cpus\"",[314,1260,632],{"class":495},[314,1262,635],{"class":499},[314,1264,638],{"class":499},[314,1266,1268,1270,1272,1274,1276,1278,1280,1282],{"class":316,"line":1267},26,[314,1269,643],{"class":328},[314,1271,623],{"class":324},[314,1273,648],{"class":495},[314,1275,629],{"class":324},[314,1277,653],{"class":499},[314,1279,623],{"class":324},[314,1281,722],{"class":495},[314,1283,750],{"class":324},[314,1285,1287],{"class":316,"line":1286},27,[314,1288,689],{"class":499},[314,1290,1292],{"class":316,"line":1291},28,[314,1293,1294],{"class":495},"}\n",[314,1296,1298],{"class":316,"line":1297},29,[314,1299,379],{"emptyLinePlaceholder":378},[314,1301,1303,1305,1307,1309],{"class":316,"line":1302},30,[314,1304,1064],{"class":320},[314,1306,623],{"class":324},[314,1308,1038],{"class":495},[314,1310,567],{"class":324},[314,1312,1314,1316,1318,1320],{"class":316,"line":1313},31,[314,1315,1064],{"class":320},[314,1317,623],{"class":324},[314,1319,875],{"class":495},[314,1321,567],{"class":324},[11,1323,785,1324],{},[15,1325,788],{},[305,1327,1329],{"className":307,"code":1328,"language":309,"meta":310,"style":310},"chmod +x /etc/hotplug.d/net/99-optimize-network\n",[136,1330,1331],{"__ignoreMap":310},[314,1332,1333,1335,1337],{"class":316,"line":317},[314,1334,798],{"class":320},[314,1336,801],{"class":324},[314,1338,1339],{"class":324}," /etc/hotplug.d/net/99-optimize-network\n",[152,1341],{},[235,1343,1345,1346],{"id":1344},"_4️⃣-hook-iface-fallback-su-evento-ifup","🪝 4️⃣  Hook IFACE – Fallback su evento ",[136,1347,1348],{},"ifup",[11,1350,295,1351],{},[15,1352,1353],{},[136,1354,1355],{},"/etc/hotplug.d/iface/99-rpsxps",[11,1357,1358],{},"Serve come “cintura di sicurezza” in caso di ricreazione PPPoE o WAN da script esterni (es. DDNS)",[305,1360,1362],{"className":307,"code":1361,"language":309,"meta":310,"style":310},"#!/bin/sh\n[ \"$ACTION\" = \"ifup\" ] || exit 0\n\ncase \"$INTERFACE\" in\n  wan|lan)\n    /bin/sh -c \"sleep 1; /usr/local/sbin/apply-rpsxps.sh\"\n    ;;\nesac\n",[136,1363,1364,1368,1391,1395,1409,1423,1434,1439],{"__ignoreMap":310},[314,1365,1366],{"class":316,"line":317},[314,1367,490],{"class":349},[314,1369,1370,1372,1374,1376,1378,1380,1383,1385,1387,1389],{"class":316,"line":353},[314,1371,843],{"class":495},[314,1373,629],{"class":324},[314,1375,848],{"class":495},[314,1377,629],{"class":324},[314,1379,325],{"class":499},[314,1381,1382],{"class":324}," \"ifup\"",[314,1384,632],{"class":495},[314,1386,635],{"class":499},[314,1388,862],{"class":328},[314,1390,865],{"class":328},[314,1392,1393],{"class":316,"line":364},[314,1394,379],{"emptyLinePlaceholder":378},[314,1396,1397,1399,1401,1404,1406],{"class":316,"line":375},[314,1398,870],{"class":499},[314,1400,623],{"class":324},[314,1402,1403],{"class":495},"$INTERFACE",[314,1405,629],{"class":324},[314,1407,1408],{"class":499}," in\n",[314,1410,1411,1414,1417,1420],{"class":316,"line":382},[314,1412,1413],{"class":883},"  wan",[314,1415,1416],{"class":499},"|",[314,1418,1419],{"class":883},"lan",[314,1421,1422],{"class":499},")\n",[314,1424,1425,1428,1431],{"class":316,"line":388},[314,1426,1427],{"class":320},"    /bin/sh",[314,1429,1430],{"class":328}," -c",[314,1432,1433],{"class":324}," \"sleep 1; /usr/local/sbin/apply-rpsxps.sh\"\n",[314,1435,1436],{"class":316,"line":399},[314,1437,1438],{"class":495},"    ;;\n",[314,1440,1441],{"class":316,"line":410},[314,1442,914],{"class":499},[11,1444,785,1445],{},[15,1446,788],{},[305,1448,1450],{"className":307,"code":1449,"language":309,"meta":310,"style":310},"chmod +x /etc/hotplug.d/iface/99-rpsxps\n",[136,1451,1452],{"__ignoreMap":310},[314,1453,1454,1456,1458],{"class":316,"line":317},[314,1455,798],{"class":320},[314,1457,801],{"class":324},[314,1459,1460],{"class":324}," /etc/hotplug.d/iface/99-rpsxps\n",[152,1462],{},[235,1464,1466],{"id":1465},"_5️⃣-esecuzione-al-boot-failsafe","🚀 5️⃣  Esecuzione al boot (failsafe)",[11,1468,295,1469],{},[15,1470,1471],{},[136,1472,1473],{},"/etc/rc.local",[11,1475,1476],{},"Garantisce che lo script venga lanciato anche all’avvio completo del sistema (dopo init)",[305,1478,1480],{"className":307,"code":1479,"language":309,"meta":310,"style":310},"/usr/local/sbin/apply-rpsxps.sh || true\nexit 0\n",[136,1481,1482,1492],{"__ignoreMap":310},[314,1483,1484,1486,1489],{"class":316,"line":317},[314,1485,467],{"class":320},[314,1487,1488],{"class":499}," ||",[314,1490,1491],{"class":328}," true\n",[314,1493,1494,1497],{"class":316,"line":353},[314,1495,1496],{"class":328},"exit",[314,1498,865],{"class":328},[152,1500],{},[235,1502,1504],{"id":1503},"_6️⃣-opzionale-cpu-governor","🧠 6️⃣  (Opzionale) CPU governor",[11,1506,1507,1508,1511,1512,1515],{},"Se vuoi forzare il governor ",[15,1509,1510],{},"conservative"," o ",[15,1513,1514],{},"performance"," all’avvio:",[11,1517,295,1518,1522,1523,220],{},[15,1519,1520],{},[136,1521,1473],{}," (appendi sotto la riga ",[136,1524,1525],{},"apply-rpsxps.sh",[305,1527,1529],{"className":307,"code":1528,"language":309,"meta":310,"style":310},"for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do\n    echo conservative > \"$g\"\ndone\n",[136,1530,1531,1547,1563],{"__ignoreMap":310},[314,1532,1533,1535,1538,1540,1543,1545],{"class":316,"line":317},[314,1534,576],{"class":499},[314,1536,1537],{"class":495}," g ",[314,1539,582],{"class":499},[314,1541,1542],{"class":324}," /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor",[314,1544,610],{"class":495},[314,1546,588],{"class":499},[314,1548,1549,1551,1554,1556,1558,1561],{"class":316,"line":353},[314,1550,643],{"class":328},[314,1552,1553],{"class":324}," conservative",[314,1555,653],{"class":499},[314,1557,623],{"class":324},[314,1559,1560],{"class":495},"$g",[314,1562,567],{"class":324},[314,1564,1565],{"class":316,"line":364},[314,1566,761],{"class":499},[152,1568],{},[235,1570,1572],{"id":1571},"_7️⃣-verifica-post-boot","🧾 7️⃣  Verifica post-boot",[11,1574,1575],{},"Comandi di controllo:",[305,1577,1579],{"className":307,"code":1578,"language":309,"meta":310,"style":310},"logread -e rpsxps | tail -n 20\ngrep . /sys/class/net/eth{0,1}/queues/{rx,tx}-*/rps_cpus\nsysctl net.core.rps_sock_flow_entries\n",[136,1580,1581,1603,1619],{"__ignoreMap":310},[314,1582,1583,1586,1589,1591,1594,1597,1600],{"class":316,"line":317},[314,1584,1585],{"class":320},"logread",[314,1587,1588],{"class":328}," -e",[314,1590,534],{"class":324},[314,1592,1593],{"class":499}," |",[314,1595,1596],{"class":320}," tail",[314,1598,1599],{"class":328}," -n",[314,1601,1602],{"class":328}," 20\n",[314,1604,1605,1608,1611,1614,1616],{"class":316,"line":353},[314,1606,1607],{"class":320},"grep",[314,1609,1610],{"class":324}," .",[314,1612,1613],{"class":324}," /sys/class/net/eth{0,1}/queues/{rx,tx}-",[314,1615,893],{"class":328},[314,1617,1618],{"class":324},"/rps_cpus\n",[314,1620,1621,1623],{"class":316,"line":364},[314,1622,552],{"class":320},[314,1624,1625],{"class":324}," net.core.rps_sock_flow_entries\n",[11,1627,1628],{},"Output atteso:",[305,1630,1635],{"className":1631,"code":1633,"language":1634},[1632],"language-text","rpsxps: net hook: eth0.835 ACTION=add ...\nrpsxps: net hook: pppoe-wan ACTION=add ...\n...\n/sys/class/net/eth0.835/queues/rx-0/rps_cpus: ff\n/sys/class/net/eth0/queues/tx-0/xps_cpus: ff\n/sys/class/net/eth1/queues/tx-0/xps_cpus: ff\nnet.core.rps_sock_flow_entries = 65536\n","text",[136,1636,1633],{"__ignoreMap":310},[152,1638],{},[39,1640,1642],{"id":1641},"risultati-finali","🚀 Risultati finali",[11,1644,1645],{},"Dopo il reboot e una verifica completa dei parametri, il risultato è stato spettacolare:",[97,1647,1648,1658],{},[100,1649,1650],{},[103,1651,1652,1654,1656],{},[106,1653,108],{},[106,1655,111],{},[106,1657,114],{},[116,1659,1660,1671,1681],{},[103,1661,1662,1667,1669],{},[121,1663,1664],{},[15,1665,1666],{},"Before",[121,1668,128],{},[121,1670,131],{},[103,1672,1673,1677,1679],{},[121,1674,1675],{},[15,1676,259],{},[121,1678,262],{},[121,1680,265],{},[103,1682,1683,1688,1694],{},[121,1684,1685],{},[15,1686,1687],{},"Tuning finale",[121,1689,1690,1691],{},"🟢 ",[15,1692,1693],{},"2162 Mbps",[121,1695,1690,1696],{},[15,1697,1698],{},"1038 Mbps",[39,1700,1702],{"id":1701},"conclusioni","Conclusioni",[11,1704,1705,1706,1708],{},"Il ",[15,1707,21],{}," è un hardware eccezionale, ma per sfruttarlo al massimo serve una configurazione mirata.\nDi default, OpenWrt/FriendlyWrt non imposta:",[206,1710,1711,1714],{},[172,1712,1713],{},"IRQ affinity efficiente",[172,1715,1716],{},"RPS/XPS su tutti i core",[11,1718,1719,1720,1723,1724,1727,1728,30],{},"Con pochi accorgimenti, questo piccolo router passa da ",[15,1721,1722],{},"midrange"," a ",[15,1725,1726],{},"full 2.5 Gbps router",". In barba a cosa si possa pensare dei ",[1729,1730,1731],"em",{},"soft router",[1733,1734,1735],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}",{"title":310,"searchDepth":353,"depth":353,"links":1737},[1738,1739,1740,1741,1744,1754,1755],{"id":41,"depth":353,"text":42},{"id":82,"depth":353,"text":83},{"id":156,"depth":353,"text":157},{"id":200,"depth":353,"text":201,"children":1742},[1743],{"id":237,"depth":364,"text":238},{"id":276,"depth":353,"text":277,"children":1745},[1746,1747,1748,1749,1751,1752,1753],{"id":291,"depth":364,"text":292},{"id":459,"depth":364,"text":460},{"id":809,"depth":364,"text":810},{"id":1344,"depth":364,"text":1750},"🪝 4️⃣  Hook IFACE – Fallback su evento ifup",{"id":1465,"depth":364,"text":1466},{"id":1503,"depth":364,"text":1504},{"id":1571,"depth":364,"text":1572},{"id":1641,"depth":353,"text":1642},{"id":1701,"depth":353,"text":1702},[1757,1758,1759],"networking","devops","hardware","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/nanopi-r76s-performance.png","2025-10-05T09:00:00.000Z","Come ho ottimizzato il NanoPi R76S con OpenWrt per passare da 600 Mbps a oltre 2 Gbps reali, sistemando IRQ, RPS/XPS e CPU governor per sfruttare al massimo il SoC Rockchip RK3576.","md",{},"/nanopi-r76s-router-2-5gbps-performance-speed-boost",{"title":6,"description":1762},"nanopi-r76s-router-2-5gbps-performance-speed-boost",false,[1770,1771,1772,1773,1514,1774],"openwrt","nanopi","router","linux","tuning","RdJAYi52JTNcgoaJqjoKg-oDyw808HqOn6zwZojyAG8",1780867863095]