Ok, thank you @mjnck. Although I need to study this way, so cannot shorty tell if it was successful.
Also notice that it seems you are using "FriendlyWrt", which is not an official OpenWrt build. Since the NanoPi R4S is already supported by official OpenWrt builds, you may want to switch to the official builds.
not really. I first burned FriendlyWRT image then performed sysupgarde
from CLI to official OpenWRT image. Some config files retained as well as hostname I believe. To my understanding that image is not supposed for raw SD card flashing.
Hi, I would like to know how did you run LXC through USB with OpenWRT as the host. Any guide or tutorial I can refer to? Would like to run Pihole as well. Thanks a lot
Finally I managed to get expanded system. First I did not notice that Anael's @anaelorlinski besides the instructions created his own builds for R4S (here)
So I took his full image and applied his instructions and expanding completed successfully
root@OpenWrt:~# resize.f2fs ${LOOP}
Info: Segments per section = 1
Info: Sections per zone = 1
Info: sector size = 512
Info: total sectors = 31076096 (15173 MB)
Info: MKFS version
"Linux version 5.10.176 (ao@openwrt) (aarch64-openwrt-linux-musl-gcc (OpenWrt GCC 11.2.0 r20134-5f15225c1e) 11.2.0, GNU ld (GNU Binutils) 2.37) #0 SMP PREEMPT Thu Apr 27 20:28:15 2023"
Info: FSCK version
from "Linux version 5.10.176 (ao@openwrt) (aarch64-openwrt-linux-musl-gcc (OpenWrt GCC 11.2.0 r20134-5f15225c1e) 11.2.0, GNU ld (GNU Binutils) 2.37) #0 SMP PREEMPT Thu Apr 27 20:28:15 2023"
to "Linux version 5.10.176 (ao@openwrt) (aarch64-openwrt-linux-musl-gcc (OpenWrt GCC 11.2.0 r20134-5f15225c1e) 11.2.0, GNU ld (GNU Binutils) 2.37) #0 SMP PREEMPT Thu Apr 27 20:28:15 2023"
Info: superblock features = 0 :
Info: superblock encrypt level = 0, salt = 00000000000000000000000000000000
Info: total FS sectors = 1912576 (933 MB)
Info: CKPT version = 3b409e03
Info: Duplicate valid checkpoint to mirror position 512 -> 1024
Info: Write valid nat_bits in checkpoint
[migrate_block: 56] Migrate node block 1433 -> 6c00
[migrate_block: 56] Migrate node block 1434 -> 6c01
[migrate_block: 56] Migrate node block 143a -> 6c02
[migrate_block: 56] Migrate node block 143d -> 6c03
[migrate_block: 56] Migrate node block 143e -> 6c04
[migrate_block: 56] Migrate node block 1445 -> 6c05
[migrate_block: 56] Migrate node block 1447 -> 6c06
[migrate_block: 56] Migrate node block 1448 -> 6c07
[migrate_block: 56] Migrate node block 1449 -> 6c08
[migrate_block: 56] Migrate node block 144a -> 6c09
[migrate_block: 56] Migrate node block 144b -> 6c0a
[migrate_block: 56] Migrate node block 144c -> 6c0b
[migrate_block: 56] Migrate node block 144d -> 6c0c
[migrate_block: 56] Migrate node block 144e -> 6c0d
[migrate_block: 56] Migrate node block 144f -> 6c0e
[migrate_block: 56] Migrate node block 1451 -> 6c0f
[migrate_block: 56] Migrate node block 1453 -> 6c10
[migrate_block: 56] Migrate node block 1454 -> 6c11
[migrate_block: 56] Migrate node block 1455 -> 6c12
[migrate_block: 56] Migrate node block 1456 -> 6c13
[migrate_block: 56] Migrate node block 1457 -> 6c14
[migrate_block: 56] Migrate node block 1458 -> 6c15
[migrate_block: 56] Migrate node block 145a -> 6c16
[migrate_block: 56] Migrate node block 145c -> 6c17
[migrate_block: 56] Migrate node block 145e -> 6c18
[migrate_block: 56] Migrate node block 145f -> 6c19
[migrate_block: 56] Migrate node block 1460 -> 6c1a
[migrate_block: 56] Migrate node block 1461 -> 6c1b
[migrate_block: 56] Migrate node block 1462 -> 6c1c
[migrate_block: 56] Migrate node block 1464 -> 6c1d
[migrate_block: 56] Migrate node block 1466 -> 6c1e
[migrate_block: 56] Migrate node block 1467 -> 6c1f
[migrate_block: 56] Migrate node block 1468 -> 6c20
[migrate_block: 56] Migrate node block 1469 -> 6c21
[migrate_block: 56] Migrate node block 146a -> 6c22
[migrate_block: 56] Migrate node block 146b -> 6c23
[migrate_block: 56] Migrate node block 1472 -> 6c24
[migrate_block: 56] Migrate node block 1474 -> 6c25
[migrate_block: 56] Migrate node block 1475 -> 6c26
[migrate_block: 56] Migrate node block 1476 -> 6c27
[migrate_block: 56] Migrate node block 1477 -> 6c28
[migrate_block: 56] Migrate node block 1479 -> 6c29
[migrate_block: 56] Migrate node block 147b -> 6c2a
[migrate_block: 56] Migrate node block 147c -> 6c2b
[migrate_block: 56] Migrate node block 147e -> 6c2c
[migrate_block: 56] Migrate node block 147f -> 6c2d
[migrate_block: 56] Migrate node block 1480 -> 6c2e
[migrate_block: 56] Migrate node block 1482 -> 6c2f
[migrate_block: 56] Migrate node block 1483 -> 6c30
[migrate_block: 56] Migrate node block 1485 -> 6c31
[migrate_block: 56] Migrate node block 1486 -> 6c32
[migrate_block: 56] Migrate node block 1487 -> 6c33
[migrate_block: 56] Migrate node block 1488 -> 6c34
[migrate_block: 56] Migrate node block 1489 -> 6c35
[migrate_block: 56] Migrate node block 148c -> 6c36
[migrate_block: 56] Migrate node block 148d -> 6c37
[migrate_block: 56] Migrate node block 148e -> 6c38
[migrate_block: 56] Migrate node block 148f -> 6c39
[migrate_block: 56] Migrate node block 1491 -> 6c3a
[migrate_block: 56] Migrate node block 1492 -> 6c3b
[migrate_block: 56] Migrate node block 1493 -> 6c3c
[migrate_block: 56] Migrate node block 1494 -> 6c3d
[migrate_block: 56] Migrate node block 1495 -> 6c3e
[migrate_block: 56] Migrate node block 1496 -> 6c3f
[migrate_block: 56] Migrate node block 1497 -> 6c40
[migrate_block: 56] Migrate node block 1600 -> 6e00
[migrate_block: 56] Migrate node block 1604 -> 6e01
[migrate_block: 56] Migrate node block 1606 -> 6e02
[migrate_block: 56] Migrate node block 1608 -> 6e03
[migrate_block: 56] Migrate node block 160a -> 6e04
[migrate_block: 56] Migrate node block 160e -> 6e05
[migrate_block: 56] Migrate node block 1610 -> 6e06
[migrate_block: 56] Migrate node block 1612 -> 6e07
[migrate_block: 56] Migrate node block 1616 -> 6e08
[migrate_block: 56] Migrate node block 161b -> 6e09
[migrate_block: 56] Migrate node block 161e -> 6e0a
[migrate_block: 56] Migrate node block 1620 -> 6e0b
[migrate_block: 56] Migrate node block 1622 -> 6e0c
[migrate_block: 56] Migrate node block 1624 -> 6e0d
[migrate_block: 56] Migrate node block 1626 -> 6e0e
[migrate_block: 56] Migrate node block 162a -> 6e0f
[migrate_block: 56] Migrate node block 162c -> 6e10
[migrate_block: 56] Migrate node block 162e -> 6e11
[migrate_block: 56] Migrate node block 1630 -> 6e12
[migrate_block: 56] Migrate node block 1632 -> 6e13
[migrate_block: 56] Migrate node block 1635 -> 6e14
[migrate_block: 56] Migrate node block 1638 -> 6e15
[migrate_block: 56] Migrate node block 163a -> 6e16
[migrate_block: 56] Migrate node block 1641 -> 6e17
[migrate_block: 56] Migrate node block 1644 -> 6e18
[migrate_block: 56] Migrate node block 1645 -> 6e19
[migrate_block: 56] Migrate node block 1646 -> 6e1a
[migrate_block: 56] Migrate node block 1653 -> 6e1b
[migrate_block: 56] Migrate node block 1654 -> 6e1c
[migrate_block: 56] Migrate node block 1656 -> 6e1d
[migrate_block: 56] Migrate node block 165a -> 6e1e
[migrate_block: 56] Migrate node block 165b -> 6e1f
[migrate_block: 56] Migrate node block 165f -> 6e20
[migrate_block: 56] Migrate node block 1660 -> 6e21
[migrate_block: 56] Migrate node block 1662 -> 6e22
[migrate_block: 56] Migrate node block 1663 -> 6e23
[migrate_block: 56] Migrate node block 1664 -> 6e24
[migrate_block: 56] Migrate node block 1665 -> 6e25
[migrate_block: 56] Migrate node block 166a -> 6e26
[migrate_block: 56] Migrate node block 166c -> 6e27
[migrate_block: 56] Migrate node block 166d -> 6e28
[migrate_block: 56] Migrate node block 1677 -> 6e29
[migrate_block: 56] Migrate node block 1679 -> 6e2a
[migrate_block: 56] Migrate node block 1681 -> 6e2b
[migrate_block: 56] Migrate node block 1682 -> 6e2c
[migrate_block: 56] Migrate node block 1683 -> 6e2d
[migrate_block: 56] Migrate node block 1687 -> 6e2e
[migrate_block: 56] Migrate node block 1688 -> 6e2f
[migrate_block: 56] Migrate node block 1689 -> 6e30
[migrate_block: 56] Migrate node block 168a -> 6e31
[migrate_block: 56] Migrate node block 168d -> 6e32
[migrate_block: 56] Migrate node block 168e -> 6e33
[migrate_block: 56] Migrate node block 1691 -> 6e34
[migrate_block: 56] Migrate node block 1693 -> 6e35
[migrate_block: 56] Migrate node block 1694 -> 6e36
[migrate_block: 56] Migrate node block 1695 -> 6e37
[migrate_block: 56] Migrate node block 1697 -> 6e38
[migrate_block: 56] Migrate node block 1699 -> 6e39
[migrate_block: 56] Migrate node block 169a -> 6e3a
[migrate_block: 56] Migrate node block 169c -> 6e3b
[migrate_block: 56] Migrate node block 169d -> 6e3c
[migrate_block: 56] Migrate node block 169e -> 6e3d
[migrate_block: 56] Migrate node block 169f -> 6e3e
[migrate_block: 56] Migrate node block 16a1 -> 6e3f
[migrate_block: 56] Migrate node block 16a2 -> 6e40
[migrate_block: 56] Migrate node block 16a3 -> 6e41
[migrate_block: 56] Migrate data block 1a02 -> 7000
[migrate_block: 56] Migrate data block 1a03 -> 7001
[migrate_block: 56] Migrate data block 1a05 -> 7002
[migrate_block: 56] Migrate data block 1a06 -> 7003
[migrate_block: 56] Migrate data block 1a07 -> 7004
[migrate_block: 56] Migrate data block 1a08 -> 7005
[migrate_block: 56] Migrate data block 1a09 -> 7006
[migrate_block: 56] Migrate data block 1a0a -> 7007
[migrate_block: 56] Migrate data block 1a0b -> 7008
[migrate_block: 56] Migrate data block 1a0c -> 7009
[migrate_block: 56] Migrate data block 1a0d -> 700a
[migrate_block: 56] Migrate data block 1a10 -> 700b
[migrate_block: 56] Migrate data block 1a11 -> 700c
[migrate_block: 56] Migrate data block 1a12 -> 700d
[migrate_block: 56] Migrate data block 1a13 -> 700e
[migrate_block: 56] Migrate data block 1a14 -> 700f
[migrate_block: 56] Migrate data block 1a15 -> 7010
[migrate_block: 56] Migrate data block 1a16 -> 7011
[migrate_block: 56] Migrate data block 1a17 -> 7012
[migrate_block: 56] Migrate data block 1a18 -> 7013
[migrate_block: 56] Migrate data block 1a19 -> 7014
[migrate_block: 56] Migrate data block 1a1a -> 7015
[migrate_block: 56] Migrate data block 1a1b -> 7016
[migrate_block: 56] Migrate data block 1a1c -> 7017
[migrate_block: 56] Migrate data block 1a1d -> 7018
[migrate_block: 56] Migrate data block 1a1e -> 7019
[migrate_block: 56] Migrate data block 1a1f -> 701a
[migrate_block: 56] Migrate data block 1a20 -> 701b
[migrate_block: 56] Migrate data block 1a21 -> 701c
[migrate_block: 56] Migrate data block 1a22 -> 701d
[migrate_block: 56] Migrate data block 1a23 -> 701e
[migrate_block: 56] Migrate data block 1a24 -> 701f
[migrate_block: 56] Migrate data block 1a25 -> 7020
[migrate_block: 56] Migrate data block 1a26 -> 7021
[migrate_block: 56] Migrate data block 1a27 -> 7022
[migrate_block: 56] Migrate data block 1a28 -> 7023
[migrate_block: 56] Migrate data block 1a29 -> 7024
[migrate_block: 56] Migrate data block 1a2a -> 7025
[migrate_block: 56] Migrate data block 1a2b -> 7026
[migrate_block: 56] Migrate data block 1a2c -> 7027
[migrate_block: 56] Migrate data block 1a2d -> 7028
[migrate_block: 56] Migrate data block 1a2e -> 7029
[migrate_block: 56] Migrate data block 1a2f -> 702a
[migrate_block: 56] Migrate data block 1a30 -> 702b
[migrate_block: 56] Migrate data block 1a31 -> 702c
[migrate_block: 56] Migrate data block 1a32 -> 702d
[migrate_block: 56] Migrate data block 1a33 -> 702e
[migrate_block: 56] Migrate data block 1a34 -> 702f
[migrate_block: 56] Migrate data block 1a35 -> 7030
[migrate_block: 56] Migrate data block 1a36 -> 7031
[migrate_block: 56] Migrate data block 1a38 -> 7032
[migrate_block: 56] Migrate data block 1a39 -> 7033
[FIX] (move_one_curseg_info:2798) --> Move curseg[0] 3 -> 2e after 6c00
[FIX] (move_one_curseg_info:2798) --> Move curseg[1] e3 -> 2f after 6c00
[FIX] (move_one_curseg_info:2798) --> Move curseg[2] 71 -> 30 after 6c00
[FIX] (move_one_curseg_info:2798) --> Move curseg[3] 0 -> 2c after 6c00
[FIX] (move_one_curseg_info:2798) --> Move curseg[4] 1 -> 2d after 6c00
[FIX] (move_one_curseg_info:2798) --> Move curseg[5] 2 -> 31 after 6c00
Info: Write valid nat_bits in checkpoint
Try to do defragement: Done
[migrate_ssa: 270] Info: Done to migrate SSA blocks: sum_blkaddr = 0x1200 -> 0x4e00
[migrate_nat: 386] Info: Done to migrate NAT blocks: nat_blkaddr = 0xa00 -> 0xa00
[migrate_sit: 444] Info: Done to restore new SIT blocks: 0x600
Info: Write valid nat_bits in checkpoint
[rebuild_checkpoint: 585] Info: Done to rebuild checkpoint blocks
[update_superblock: 695] Info: Done to update superblock
Done: 7.208789 secs
PS: As he warned that 23.05 images are not stable and not supported I just took 22.03
Anyone of you guys updated to 23.05.2 with attended sysupgrade?
Mine aborts and comlains about config version.
See thread here: nanoPi R4S 23.05.2 Attended SysUpgrade Issues
thx
Is there a way to chuck my sdcard in to my laptop and to boot it up in let's say QEMU.
Or should I just look at generating a pre configured immagae?
qemu can't emulate a nanopi r4s - and your sdcard can only boot on a (real) r4s.
After 2 hours of fiddling I can't seem to do SQM without some performance hit. CAKE is out of the question, easily -10% perf.
Baseline: 750-800M
fq_codel + simplest: 730-750M
fq_codel + simple: 710M
CAKE + piece of cake: 590-680M
Anyone else?
Nah i have Lenovo m920q with mellanox cx-4 2x25gbps , works good.
The performance of the m920q x86 is indeed good, and the power consumption is also very high
That's why i've pit there esxi and i'm running some vm's , also pfsense works there like a charm with windows server and xpenology.
Did any R4S users previously have a Linksys WRT 3200? If so was the R4S performance better?
Hi. There are a few discussion on that in this thread.
To get full bandwidth with SQM it may be necessary to put certain processes on the faster A72 performance cores and not let them run on the slower A52 efficiency cores.
Search for SQM, IRQ, queues, cpu affinity, IRQ balance etc. in this topic.
One such post is:
Enjoy!
set_interface_core 4 "eth0"
set_interface_core 8 "eth1"
echo -n 10 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo -n 20 > /sys/class/net/eth1/queues/rx-0/rps_cpus
;;
try that in smp_affinity file
#CPU Performance
find /sys/devices/system/cpu/cpufreq/ -name scaling_governor | while read GOVERNOR ; do echo performance > $GOVERNOR ; done
find /sys/devices/system/cpu/cpufreq/ -name rate_limit_us | while read RATEEVAL ; do echo 1000 > $RATEEVAL ; done # was 10000
find /sys/devices/system/cpu/cpufreq/ -name scaling_min_freq | while read MINFREQ ; do echo 816000 > $MINFREQ ; done # was 408000
in startup
Where do I edit smp_affinity ?
There's one for each irq:
/proc/irq/31/smp_affinity
root@OpenWrt:~# grep eth /proc/interrupts
31: 57254 0 0 0 13254971 0 GICv3 44 Level eth0
87: 0 12850 0 0 0 9366136 ITS-MSI 524288 Edge eth1
hotplug.d/net/40-net-smp-affinity - folder file is there
use WinSCP and navigate to the above.
Does the affinity need to be indented? I put it unindented at the bottom.
vi /etc/hotplug.d/net/40-net-smp-affinity
# not sure if this should be indented
set_interface_core 4 "eth0"
set_interface_core 8 "eth1"
echo -n 10 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo -n 20 > /sys/class/net/eth1/queues/rx-0/rps_cpus
;;
#!/bin/sh
[ "$ACTION" = add ] || exit
get_device_irq() {
local device="$1"
local line
local seconds="0"
# wait up to 10 seconds for the irq/device to appear
while [ "${seconds}" -le 10 ]; do
line=$(grep -m 1 "${device}\$" /proc/interrupts) && break
seconds="$(( seconds + 2 ))"
sleep 2
done
echo ${line} | sed 's/:.*//'
}
set_interface_core() {
local core_mask="$1"
local interface="$2"
local device="$3"
[ -z "${device}" ] && device="$interface"
local irq=$(get_device_irq "$device")
echo "${core_mask}" > /proc/irq/${irq}/smp_affinity
}
case "$(board_name)" in
friendlyarm,nanopi-r2c|\
friendlyarm,nanopi-r2s|\
xunlong,orangepi-r1-plus|\
xunlong,orangepi-r1-plus-lts)
set_interface_core 2 "eth0"
set_interface_core 4 "eth1" "xhci-hcd:usb3"
;;
friendlyarm,nanopi-r4s)
set_interface_core 10 "eth0"
set_interface_core 20 "eth1"
;;
esac
set_interface_core 4 "eth0"
set_interface_core 8 "eth1"
echo -n 10 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo -n 20 > /sys/class/net/eth1/queues/rx-0/rps_cpus
;;
# edit this in luci -> startup
#CPU Performance
find /sys/devices/system/cpu/cpufreq/ -name scaling_governor | while read GOVERNOR ; do echo performance > $GOVERNOR ; done
find /sys/devices/system/cpu/cpufreq/ -name rate_limit_us | while read RATEEVAL ; do echo 1000 > $RATEEVAL ; done # was 10000
find /sys/devices/system/cpu/cpufreq/ -name scaling_min_freq | while read MINFREQ ; do echo 816000 > $MINFREQ ; done # was 408000
Then reboot.
edit: Results much better after the CPU fix. SQM limit set to 880000k and 3900k.
Raw: 865M (another 50-100M faster than throttled CPU baseline) https://www.waveform.com/tools/bufferbloat?test-id=b46094a6-7932-4d9c-b133-ec6729bb83bd
codel+simplest: 847M https://www.waveform.com/tools/bufferbloat?test-id=faebebd0-8401-4b3d-a4bf-ca7d8245bb5b
CAKE + piece of cake: 827M https://www.waveform.com/tools/bufferbloat?test-id=3ffaff08-709c-4446-899e-fdee04793ba2
Multiple tests indicated that CAKE is slower than codel on this, but it's close enough to be negligible for a lot of people. I opted for codel because there's not many people/devices on the network. The CAKE limits aren't the same as codel; you can raise them slightly above the codel limits for similar performance; though you eventually run into the lack of the rate limiter and your bufferbloat performance goes down.
CAKE seemed to do better (0ms vs 4ms) on upload throttling for no perf hit when upload bw was very small (my upload caps below 50M).
case "$(board_name)" in
friendlyarm,nanopi-r2c|\
friendlyarm,nanopi-r2s|\
xunlong,orangepi-r1-plus|\
xunlong,orangepi-r1-plus-lts)
set_interface_core 2 "eth0"
set_interface_core 4 "eth1" "xhci-hcd:usb3"
;;
friendlyarm,nanopi-r4s)
set_interface_core 4 "eth0"
set_interface_core 8 "eth1"
echo -n 10 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo -n 20 > /sys/class/net/eth1/queues/rx-0/rps_cpus
;;
esac
should look like the above
R4S is way better then WRT3200ACM in terms of wired routing, even with hardware offload the WRT3200ACM is still at least 20% slower than R4S.