Cheater Posted April 13, 2022 Report Posted April 13, 2022 (edited) Cum n-am mai deschis un topic aici de multi ani, si am terminat serialele, si n-am somn, m-am gandit sa impartasesc cu voi optimizarile ce le folosesc pentru a imbunatati timpul de raspuns si viteza internetului. Este vorba de setari si configurari ce se aplica routerului, si este necesar ca routerul sa va permita conectarea prin ssh ca root pentru a le aplica. Eu folosesc https://www.synology.com/en-us/products/RT2600ac dar sunt convins ca ca sunt si alti producatori ce au routere cu linux destul de accesibil pentru a implementa optimizarile. Stiu nu e AX, luna viitoare scot cei de la Synology unul AX. Oricum tutorialul se aplica la fel si la AX si AC. Cand apare wifi 6e in Romania, poate fac o continuare. La routerele Synology parola setata la userul Admin, este parola de root. Valorile ce le gasiti in continuare au fost optimizate pentru o viteza maxima permisa de isp de 940Mbps, dar pana la 2.5Gbps nu ar trebui sa fie necesare modificari semnificative. De asemenea puteti aplica aceste setari si pe servere linux vor aduca imbunatatiri semnificative fata de default. 1. /etc/rc.local Este posibil sa nu functioneze configurarile exact asa cum le prezint eu aici pe routerul vostru, de aceeea inainte de a le scrie in fisiere pentru a deveni persistente, faceti setarile la run-time, si adaptatiile daca este necesar, sau omitetile daca nu se aplica la voi (nu aveti binarele respective/variabilele de kernel, ajustati caila catre ele) Quote # Add this if your router has build-in IDS/IPS set ips queue_length 8192 # Start random number seeder. Increases the entropy pool from ~120 to ~4096 /usr/sbin/rngd -r /dev/urandom -o /dev/random -W 90% > /dev/null 2>&1 # Configure custom txqueuelen, based on your actual internet speed, on all interfaces except the virtual ones, 8333 is used for 1Gbps, it's important to calculate the right configuration based on your speed, I used the numbers below, here it is the formula in `Kernel Parameters for Core Networking` section: https://cromwell-intl.com/open-source/performance-tuning/ethernet.html # Also do NOT change MTU if you won't be able to change it for every device in your entire network. # I use 2 commands, one for wifi+bridges and one just for ethernet ports, you may adjust this commands. for i in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF | grep -v lo | grep -v tap | grep -v vbr| grep -v eth); do ifconfig $i txqueuelen 7500 > /dev/null 2>&1; done for i in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF | grep eth); do ifconfig $i txqueuelen 7833 > /dev/null 2>&1; done # nic off-loading, check it in console before yo make it permanent. Use ethtool -k eth0 to check your interface capabilities. I use it only for ethernet interfaces. for i in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF | grep eth); do ethtool -K $i rx on tx on sg on tso on ufo on gso on gro on lro on rxhash on ntuple on txvlan on rxvlan on tx-nocache-copy off tx-checksum-ipv4 on tx-checksum-ip-generic on tx-checksum-ipv6 on tx-checksum-fcoe-crc on tx-checksum-sctp on tx-scatter-gather on tx-scatter-gather-fraglist on tx-tcp-segmentation on tx-tcp-ecn-segmentation on tx-tcp6-segmentation on highdma on tx-gso-robust on tx-fcoe-segmentation on tx-gre-segmentation on tx-ipip-segmentation on tx-sit-segmentation on tx-udp_tnl-segmentation on tx-vlan-stag-hw-insert on > /dev/null 2>&1; done # Tuning the initial congestion window parameter (initcwnd) and advertised receive window (initrwnd), make sure that the interfaces are up and you received DHCP before it runs, or add a sleep before if it is needed. sleep 600 ip route | while read p; do ip route change $p initcwnd 128 initrwnd 128; done > /dev/null 2>&1 ip -6 route | while read p; do ip -6 route change $p initcwnd 128 initrwnd 128; done > /dev/null 2>&1 exit 0 2. /etc/sysctl.conf Ca sa aplicati configurarile fara reboot folositi sysctl -p, sau sysctl -w nume_variabila=valoare. Indepartati variabilele daca primiti eroare, unele pot sa lipseasca din versiunea de kernel pe care o aveti. Quote kernel.panic=3 # Required for Synology Routers, comment it if you don't have a default like this before edit this file. net.ipv6.conf.default.accept_ra_defrtr=0 # Force gc to clean-up quickly net.ipv4.neigh.default.gc_interval = 3600 # Set ARP cache entry timeout net.ipv4.neigh.default.gc_stale_time = 3600 # Setup DNS threshold for arp net.ipv4.neigh.default.gc_thresh3 = 4096 net.ipv4.neigh.default.gc_thresh2 = 2048 net.ipv4.neigh.default.gc_thresh1 = 1024 # congestion control (default cubic) # /sbin/modprobe tcp_htcp # sysctl net.ipv4.tcp_available_congestion_control # some routers uses highspeed instead of htcp, but it is the same thing. net.ipv4.tcp_congestion_control=highspeed # use bbr if you have kernel >4.9 #net.ipv4.tcp_congestion_control=bbr #net.core.default_qdisc=fq ### Set the max OS send buffer size (wmem) and receive buffer # size (rmem) for queues on all protocols. In other # words set the amount of memory that is allocated for each # TCP socket when it is opened or created while transferring files # Default Socket Receive Buffer net.core.rmem_default = 14155776 net.core.rmem_max = 28311552 net.core.wmem_default = 14155776 net.core.wmem_max = 28311552 # Set minimum, default, and maximum TCP buffer limits # decrease it if you have packet loose after you configure it net.ipv4.tcp_rmem = 4096 14155776 28311552 net.ipv4.tcp_wmem = 4096 14155776 28311552 net.ipv4.udp_rmem_min = 16384 net.ipv4.udp_wmem_min = 16384 # Increase the maximum total buffer-space allocatable # This is measured in units of pages (4096 bytes) net.ipv4.tcp_mem = 65536 131072 262144 net.ipv4.udp_mem = 65536 131072 262144 net.ipv4.tcp_max_tw_buckets = 1440000 # Set maximum network input buffer queue length net.core.netdev_max_backlog = 250000 net.core.netdev_budget = 50000 net.core.dev_weight = 50000 net.core.flow_limit_table_len=8192 # Disable caching of TCP congestion state (2.6 only) net.ipv4.tcp_no_metrics_save = 1 # increase port range net.ipv4.ip_local_port_range = 1024 65535 # Protect Against TCP Time-Wait net.ipv4.tcp_rfc1337 = 1 net.ipv4.tcp_fack = 1 # This will enusre that immediatly subsequent connections use the new values net.ipv4.route.flush = 1 net.ipv6.route.flush = 1 # Increase TCP queue length net.ipv4.neigh.default.proxy_qlen = 96 net.ipv4.neigh.default.unres_qlen = 6 # Increase size of RPC datagram queue length net.unix.max_dgram_qlen = 256 net.ipv4.tcp_notsent_lowat = 16384 # Limit the maximum memory used to reassemble IP fragments (CVE-2018-5391) net.ipv4.ipfrag_low_thresh = 196608 net.ipv6.ip6frag_low_thresh = 196608 net.ipv4.ipfrag_high_thresh = 262144 net.ipv6.ip6frag_high_thresh = 262144 # Performance net.ipv4.tcp_reordering = 3 # max connections, usefull if your router is also a download station or it has a database like postgress/mysql net.core.somaxconn=1024000 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_fastopen = 3 net.ipv4.tcp_low_latency=1 net.ipv4.tcp_fin_timeout=7 net.ipv4.tcp_max_syn_backlog=1024 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_sack=1 net.core.optmem_max = 25165824 # disable timestamps and syncookies to decrease tcp header size net.ipv4.tcp_timestamps=0 net.ipv4.tcp_syncookies=0 # use ecn in case of congestion instead of dropping packets net.ipv4.tcp_ecn=1 net.ipv4.tcp_slow_start_after_idle=0 net.ipv4.tcp_syn_retries = 2 # make sure that we identify the right mtu, make sure that ping is allowed on ipv4/ipv6 in your fw net.ipv4.ip_no_pmtu_disc=0 net.ipv4.tcp_base_mss=1460 net.ipv4.tcp_mtu_probing=1 net.ipv4.route.mtu_expires=86400 net.ipv6.route.mtu_expires=86400 # Turn on window scaling which can enlarge the transfer window: net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_adv_win_scale = 14 # Number of times SYNACKs for passive TCP connection. net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_retries2 = 5 net.ipv4.tcp_retries1 = 3 kernel.domainname = SynologyRouter # Increase size of file handles and inode cache, usefull if your router is also a download station or it has a database like postgress/mysql fs.file-max = 50000 fs.inotify.max_user_watches=6000 # tells the kernel how many TCP sockets that are not attached to any # user file handle to maintain. In case this number is exceeded, # orphaned connections are immediately reset and a warning is printed. net.ipv4.tcp_max_orphans = 600 # Security net.ipv4.tcp_challenge_ack_limit=1073741823 net.ipv4.conf.default.rp_filter=2 net.ipv4.conf.all.rp_filter=2 # For low-latency net.core.busy_poll=100 net.core.busy_read=100 net.ipv4.route.gc_timeout = 100 3. Wifi Alegem canalul: Primul pas este scanarea de spectru, sunt multe aplicatii pentru asta, scopul este sa identificati canalul cel mai putin folosit pe 2.4/5Ghz sau daca este folosit retelele ce emit pe acel canal sa aiba o putere cat mai mica. - pe 2.4Ghz sunt 3 canale ce nu se suprapun (non overlapping channels), 1, 6 si 11, ideal este sa alegem unul dintre acestea. Daca toate sunt libere, alegeti 11. - pe 5Ghz, cautam sa ne ferim de canalele cu DFS obligatoriu, astfel ne orientam catre benziile U-NII-1 si U-NII-3, daca avem noroc sa locuim in US/Canada (sau routerul crede asta), as recomanda canalul 161. Dar cum locuim in Romania si e 5000 lei amenda daca setezi alta tara si mergi pe un canal aiurea (in ideea in care avem vreo UM in apropiere, bruiem ceva, ei fac sesizare la ANCOM si ne bate ANCOM la usa, putin probabil), iar routerul nu ne lasa sa folosim 161 pe Romania, m-as uita la 40-44, daca este liber. Daca ai un router capabil, si intamplator locuiesti in Australia, routerul iti va permite 4W puterea in U-NII-3, cea mai mare din lume acceptata pe wifi, dar majoritatea routerelor suporta ±1W maxim. Channel width: Marimea canalului este importanta, cu cat este mai mare, cu atat incap mai multe date, deci avem viteza mai mare. - pe 2.4Ghz, eu merg pe width de 40Mhz - pe 5Ghz, routerul meu stie sa mearga pe un width de 80+80 Mhz, practic foloseste 2 canale, am ales un canal din U-NII-1 si unul U-NII-3 (cand locuiam in US), ambele cu un width de 80Mhz, bine si deviceurile din caza trebuie sa stie 80+80 Mhz, sau 160Mhz, cel mai probabil suporta doar 80Mhz, ceea ce e good enough oricum. Alte setari: DTIM 4 - mai mic scade viteza si timpul de raspuns, si se consuma mai multa baterie, mai mare e opusul, optimul este 4. Dar puteti face A/B testing si vedeti ce vi se potriveste mai bine. Multicast translation - on AMPDU - on EXTENDED NSS - on U-APSD - off MU-MIMO - on, ideal 4x4, dar si 2x2 ar trebui sa fie suficient. PMF support - off, apare un overhead ciudat si pare buggy, daca la voi se comporta la fel si on si off, e o idee buna sa ii dati on. La fel si WPA 3. IGMP Snooping - on Orice setare de power saving, off! Downgrade usb 3.0 device to reduce interference to 2.4 Ghz signal - on Allow auto-switch to DFS channels - off WPS - off (security) Daca routerul suporta guest, si nu folositi reteaua in mod curent, opriti guest. La criptarea retelei alegeti AES, pentru ca e hw accelerated. Alegeti pe 2.4Ghz N only, si 5Ghz AC/AX only, ca sa va asigurati ca fortati device-urile sa folosesca cele mai rapide protocoale de wifi, daca sunt device ce nu functioneza corect reveniti la o setare mai permisiva. Daca routerul suporta 802.11v aka Smart Connect, puteti, si recomand, sa folositi acelasi nume si la 2.4Ghz si la 5Ghz si routerul va negocia protocolul cel mai bun suportat de device, tinand cont si de calitatea semnalului pentru a avea cea mai buna acoperire si un plus de simplitate. + Folositi un doh dns, daca suporta routerul, sau macar un cloudflare dns, are datacenter si la otopeni si peers locale - https://1.1.1.1/dns/ . Firewall: Mtu probing se foloseste de icmp (ping), pentru a identifica valoarea optima, astfel este important sa acceptati icmp pe ipv4 si ipv6. Blocati orice port ce nu are ce cauta in afara, eu de exemplu, prefer sa folosesc un port non-default pentru vpn server, din care mai apoi sa am access la interfata routerului si alte chestii. Locatia fizica: Recomand sa identificati locul de unde, din pozitia routerului puteti vedea usile la toate camerele (sau cat mai multe), un hol, sa va asigurati ca nu sunt obstacole (pereti mai ales de beton, frigider, etc..) in jurul routerului, este ideal sa fie situat la o inaltime de 2m, prins pe perete (preferabil), daca folositi wifi cu precadere dintr-o anumita camera cautati o pozitie cat mai aproape de camera care sa respecte cele de mai sus. Daca pui routerul sub pat, de sub pat o sa ai putere maxima :))). Este adevarat ca semnalul ocoleste/trece prin obstacole doar ca fiecare obstacol scade semnificativ puterea, daca punem routerul pe jos, in mod automat va intalni semnificativ mai multe obstacole, si daca prin dreptul lui trec persoane, o sa apara spike-uri, nu ne dorim asta, de aceea inaltimea de 2m este optima. Performante obtinute: Inainte de a face aceste optimizari aveam 300-400 mbps, cu spike-uri mari. Dupa, am 650-666 pe orice device Apple mai nou de 2019 (testat cu: iPhone X, 12, MacBook Pro 16'' M1 pro/M1 max), si 800-900 Mbps pe deviceuri Apple 2017-2019 (chiar 2014) (testat cu: MacBook Pro 16'' 2014, 2019, Intel-based), au pus placi de retea mai slabe pe 5Ghz cu 2/mimo in loc de 3 cum era pana in 2019 pe device recente, probabil ca sa faca o economie de baterie/de cost de productie, naiba stie. https://support.apple.com/ro-ro/guide/deployment/dep2ac3e3b51/web Cert este ca routerul duce mai mult decat deviceurile ce le folosesc. Daca routerul este capabil AX la 2 mimo atat pe partea de router cat si de client estimez o viteza de 750-800Mbps, ceea ce e destul de bine. Update, screenshoot facut din qbittorrent, de pe un MBP M1 Pro, pe WIFI: Sper sa va fie de folos! Have fun! PS: daca am facut vreo greseala, o sa o corectez zilele urmatoare, am inceput sa scriu la 23 si e 03 Edited April 17, 2022 by Cheater typo si fine tunning 8 Quote