ARM SBC: NanoPi Neo 2

19 de Abril, 2017

ARM, Informática, Linux, Open-Source, Servidores, Single Board Computer

A FriendlyARM lançou o NanoPi Neo 2, um SBC muito pequeno com o novo CPU ARM Allwinner H5 Quad-Core A53 64 bits por apenas 15$. Depois de vários testes descrevo a minha experiência fantástica com este SBC de baixo custo.

Comecemos pelo básico: este SBC entra claramente na categoria de hardware muito barato do qual não devemos esperar muito. Quando digo esperar muito incluo performance, durabilidade e compatibilidade / software.

Caraterísticas:

  • CPU: Allwinner H5 Quad-Core A53
  • RAM: 512 MB
  • Conetividade: 10/100/1000M Ethernet;
  • USB: 1x type A + 2x headers;
  • Armazenamento: SD
  • Outros: UART, SPI, I2C, I2S, 24x GPIO, 2x LED,
  • Alimentação: Micro USB – 5V @ 2A
  • Software: Ubuntu Core / armbian

Porquê?

Comprei este SBC para substituir um antigo SheevaPlug na partilha de um disco em rede, descarregar torrents, servidor local de GIT e mais algumas coisas semelhantes. Este SBC pareceu-me bastante atrativo porque é muito barato, tem uma porta Ethernet Gigabit (algo raro em ARMs) e um CPU moderno de 64 bits. Comparativamente, o Raspberry Pi 3, tem um CPU melhor no entanto o Ethernet está limitado a 100Mbps – bastante fraco. O Raspberry Pi 3 tem também outras funcionalidades como saída de vídeo, Wifi, Bluetooth etc. de que não necessito.

Unboxing Rápido

Como é habitual os produtos da FriendlyARM vêm em caixas bastante grandes e com material protetor. Infelizmente a proteção veio distribuída de forma pouco útil a proteger o SBC. Já tinha visto vários vídeos no Youtube onde mostravam o mesmo problema:

O SBC vinha dentro de uma caixa de cartão de boa qualidade, acompanhado do dissipador e caixa impressa em 3D que encomendei:

Com os seus 4 x 4 cm é mesmo muito pequeno, acrescentei uma tampa de uma caneta como escala:

Caixa Exterior

Por mais 2.97$ é possível comprar uma caixa impressa em 3D para o NEO 2. É uma boa solução para quem o quer deixar sempre ligado junto com discos e outro equipamento sem preocupações.  O site engana um pouco porque ao comprar o NEO 2 existe opção para pedir uma caixa supostamente compatível – infelizmente a que enviaram era para o modelo modelo anterior. Até a própria fatura apresenta a caixa como sendo para o NEO 2:

O modelo mais recente tem a porta Ethernet “rebaixada” o que faz o SBC não encaixar corretamente na caixa. Com a ajuda de algumas ferramentas próximas decidi resolver rapidamente o problema da incompatibilidade de caixa. É certo que não ficou perfeito (especialmente porque a parte inferior da caixa era frágil e partiu), mas o SBC encaixa sem qualquer problema:

Nota: Ao comprarem confirmem sempre com a FriendlyARM se a caixa que vão receber é a correta.

Dissipador

Os processadores ARM modernos têm tendência a aquecer rapidamente. O dissipador custou mais 2.97$ e é essencial porque a temperatura do CPU, com muito pouca ou nenhuma carga, passa facilmente dos 50ºC. Recebi diversos parafusos e também um bloco de massa térmica com as dimensões apropriadas (incluindo espessura) para montar tudo na caixa sem problemas:

Instalação & Software

A FriendlyARM disponibiliza uma imagem de Ubuntu Core para este SBC no entanto é a 15.10, bastante antiga, quase obsoleta. Decidi este SBC no Armbian e, infelizmente, ainda não existe Debian para ele, no entanto, existe Ubuntu 16.04 LTS que pode ser descarregado aqui.

Após descarregar a imagem basta descomprimir, gravar no cartão SD (utilizei o programa Etcher) e inserir no NEO 2. No primeiro boot devemos esperar 1 a 2 minutos já que o sistema tem de correr algumas tarefas. Depois disso podemos fazer login via SSH com o utilizador root e password 1234. Neste primeiro login será pedido para definir uma nova password.

Serão feitas algumas questões de configuração automaticamente, no entanto o fuso horário do dispositivo poderá ficar incorreto. Podemos corrigir com o seguinte comando:

dpkg-reconfigure tzdata

Todo o processo foi bastante simples rápido e sem problemas ou dificuldades. Após a instalação decidi executar alguns testes para perceber o SBC se iria comportar bem tendo em conta os meus objetivos.

Testes à Rede

Essencial a qualquer partilha de ficheiros em rede é uma ligação rápida e estável. Recorrendo à ferramenta iperf fiz um teste básico de performance à rede entre o NEO 2 e o meu computador. Com o NEO 2 a servir de cliente:

root@neo2:~# iperf -w 256K -c 172.20.1.8 -t 15 -i 1 -f m
------------------------------------------------------------
Client connecting to 172.20.1.8, TCP port 5001
TCP window size: 0.50 MByte (WARNING: requested 0.25 MByte)
------------------------------------------------------------
[  3] local 172.20.1.2 port 38366 connected with 172.20.1.8 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 1.0 sec   105 MBytes   884 Mbits/sec
[  3]  1.0- 2.0 sec   107 MBytes   900 Mbits/sec
[  3]  2.0- 3.0 sec   107 MBytes   898 Mbits/sec
[  3]  3.0- 4.0 sec   108 MBytes   902 Mbits/sec
[  3]  4.0- 5.0 sec   107 MBytes   901 Mbits/sec
[  3]  5.0- 6.0 sec   107 MBytes   899 Mbits/sec
[  3]  6.0- 7.0 sec   108 MBytes   902 Mbits/sec
[  3]  7.0- 8.0 sec   107 MBytes   900 Mbits/sec
[  3]  8.0- 9.0 sec   107 MBytes   901 Mbits/sec
[  3]  9.0-10.0 sec   107 MBytes   899 Mbits/sec
[  3] 10.0-11.0 sec   107 MBytes   900 Mbits/sec
[  3] 11.0-12.0 sec   107 MBytes   901 Mbits/sec
[  3] 12.0-13.0 sec   107 MBytes   901 Mbits/sec
[  3] 13.0-14.0 sec   107 MBytes   899 Mbits/sec
[  3] 14.0-15.0 sec   107 MBytes   900 Mbits/sec
[  3]  0.0-15.0 sec  1607 MBytes   899 Mbits/sec

Com o NEO 2 como servidor:

root@neo2:~# iperf -w 512K -s -i 1 -f m
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 1.00 MByte (WARNING: requested 0.50 MByte)
------------------------------------------------------------
[  4] local 172.20.1.2 port 5001 connected with 172.20.1.8 port 50400
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0- 1.0 sec  76.4 MBytes   641 Mbits/sec
[  4]  1.0- 2.0 sec  78.9 MBytes   662 Mbits/sec
[  4]  2.0- 3.0 sec  88.0 MBytes   739 Mbits/sec
[  4]  3.0- 4.0 sec   112 MBytes   940 Mbits/sec
[  4]  4.0- 5.0 sec   112 MBytes   940 Mbits/sec
[  4]  5.0- 6.0 sec   112 MBytes   940 Mbits/sec
[  4]  6.0- 7.0 sec   111 MBytes   929 Mbits/sec
[  4]  7.0- 8.0 sec   112 MBytes   940 Mbits/sec
[  4]  8.0- 9.0 sec   112 MBytes   940 Mbits/sec
[  4]  9.0-10.0 sec   112 MBytes   940 Mbits/sec
[  4] 10.0-11.0 sec   111 MBytes   929 Mbits/sec
[  4] 11.0-12.0 sec   112 MBytes   937 Mbits/sec
[  4] 12.0-13.0 sec  98.4 MBytes   826 Mbits/sec
[  4] 13.0-14.0 sec   112 MBytes   939 Mbits/sec
[  4] 14.0-15.0 sec   112 MBytes   939 Mbits/sec
[  4]  0.0-15.0 sec  1572 MBytes   879 Mbits/sec

Teste bi-direcional:

root@neo2:~# iperf -w 256K -c 172.20.1.8 -d -t 15 -i 1 -f m
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 0.50 MByte (WARNING: requested 0.25 MByte)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 172.20.1.8, TCP port 5001
TCP window size: 0.50 MByte (WARNING: requested 0.25 MByte)
------------------------------------------------------------
[ 5] local 172.20.1.2 port 38376 connected with 172.20.1.8 port 5001
[ 4] local 172.20.1.2 port 5001 connected with 172.20.1.8 port 50469
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 1.0 sec 70.1 MBytes 588 Mbits/sec
[ 4] 0.0- 1.0 sec 57.5 MBytes 483 Mbits/sec
[ 5] 1.0- 2.0 sec 71.1 MBytes 597 Mbits/sec
[ 4] 1.0- 2.0 sec 57.0 MBytes 478 Mbits/sec
[ 5] 2.0- 3.0 sec 71.1 MBytes 597 Mbits/sec
[ 4] 2.0- 3.0 sec 57.9 MBytes 486 Mbits/sec
[ 5] 3.0- 4.0 sec 71.4 MBytes 599 Mbits/sec
[ 4] 3.0- 4.0 sec 57.8 MBytes 485 Mbits/sec
[ 5] 4.0- 5.0 sec 70.9 MBytes 595 Mbits/sec
[ 4] 4.0- 5.0 sec 58.3 MBytes 489 Mbits/sec
[ 5] 5.0- 6.0 sec 70.2 MBytes 589 Mbits/sec
[ 4] 5.0- 6.0 sec 58.7 MBytes 493 Mbits/sec
[ 5] 6.0- 7.0 sec 67.6 MBytes 567 Mbits/sec
[ 4] 6.0- 7.0 sec 62.5 MBytes 524 Mbits/sec

Já em termos de UDP (computador como servidor):

$ iperf -s -u -i 1
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 192 KByte (default)
------------------------------------------------------------
[ 4] local 172.20.1.8 port 5001 connected with 172.20.1.2 port 60177
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.0- 1.0 sec 83.1 MBytes 697 Mbits/sec 0.022 ms 234/59480 (0.39%)
[ 4] 1.0- 2.0 sec 80.6 MBytes 676 Mbits/sec 0.026 ms 0/57505 (0%)
[ 4] 2.0- 3.0 sec 81.7 MBytes 685 Mbits/sec 0.014 ms 0/58264 (0%)
[ 4] 3.0- 4.0 sec 92.5 MBytes 776 Mbits/sec 0.022 ms 2336/68318 (3.4%)
[ 4] 4.0- 5.0 sec 80.8 MBytes 678 Mbits/sec 0.023 ms 416/58051 (0.72%)
[ 4] 5.0- 6.0 sec 80.2 MBytes 673 Mbits/sec 0.022 ms 0/57225 (0%)
[ 4] 6.0- 7.0 sec 80.1 MBytes 672 Mbits/sec 0.023 ms 0/57112 (0%)
[ 4] 7.0- 8.0 sec 79.9 MBytes 670 Mbits/sec 0.023 ms 0/57007 (0%)
[ 4] 8.0- 9.0 sec 82.4 MBytes 691 Mbits/sec 0.026 ms 32/58788 (0.054%)
[ 4] 0.0-10.0 sec 830 MBytes 697 Mbits/sec 0.023 ms 4454/596859 (0.75%)
[ 4] 0.0-10.0 sec 1 datagrams received out-of-order

Conclusão: Os resultados são bastante bons, fiquei surpreendido como um SBC de tão baixo custo consegue ter uma performance de rede tão alta. A rede flutua em torno dos 900 Mbps. Isto já demonstra como este SBC é uma solução excelente para partilhas em rede.

Nota: os testes foram feitos com ambos os dispositivos ligados através de um router gigabit ethernet da Netgear cujo switch, segundo testes meus, atinge um máximo de 990 Mbps entre portas.

Testes ao Cartão SD

O meu cartão SD é, por acaso, um dos dos aconselhados pela FriendlyARM, um SanDisk TF 32 GB Class 10 Micro/SD TF. Eis alguns testes de performance, primeiro com a ferramenta hdparm e, de seguida com a dd:

HDPARM:
======
Timing O_DIRECT disk reads: 68 MB in 3.02 seconds = 22.55 MB/sec
Timing O_DIRECT disk reads: 68 MB in 3.02 seconds = 22.55 MB/sec
Timing O_DIRECT disk reads: 68 MB in 3.02 seconds = 22.55 MB/sec

WRITE:
=====
536870912 bytes (537 MB, 512 MiB) copied, 23.5859 s, 22.8 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 23.7077 s, 22.6 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 23.7277 s, 22.6 MB/s

READ:
====
536870912 bytes (537 MB, 512 MiB) copied, 22.4643 s, 23.9 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 22.4073 s, 24.0 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 22.4034 s, 24.0 MB/s

Conclusão: Os valores parecem-me bastante razoáveis porque segundo a Wikipedia, um cartão SD Class 10 deverá suportar, no mínimo velocidades de 10MB/s, neste caso temos o dobro. O fabricante do cartão diz que este poderá ir aos 95MB/s mas nunca vi testes com estes resultados. Comparando com estes testes o NEO 2 ultrapassa ligeiramente qualquer um dos Raspberry Pi, algo que eu também não esperava.

Testes em Disco Externo SSD

Decidi executar os testes anteriores num disco externo SSD ligado à porta USB 2.0 do NEO 2. Estes foram os resultados:

HDPARM:
======
Timing O_DIRECT disk reads: 110 MB in 3.04 seconds = 36.17 MB/sec
Timing O_DIRECT disk reads: 110 MB in 3.04 seconds = 36.17 MB/sec
Timing O_DIRECT disk reads: 110 MB in 3.04 seconds = 36.16 MB/sec

WRITE:
=====
536870912 bytes (537 MB, 512 MiB) copied, 14.6282 s, 36.7 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 14.618 s, 36.7 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 14.5923 s, 36.8 MB/s

READ:
====
536870912 bytes (537 MB, 512 MiB) copied, 14.7294 s, 36.4 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 14.7132 s, 36.5 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 14.7125 s, 36.5 MB/s

Conclusão: O disco externo apresentou melhores resultados que o cartão SD. Segundo a especificação do USB 2.0 a velocidade máxima teórica seria 53 MB/s. Contabilizando uma margem de 20% para os overheads típicos a performance teórica máxima seria de 44MB/s. O disco apresentou certa de 36 MB/s o que é mesmo muito bom.

Testes com Partilha Samba / SMB

Após instalar o Samba decidi fazer um teste real de partilha de ficheiros em rede a partir do disco externo porque este sera um dos meus casos típicos de utilização do NEO 2. Os resultados foram os seguintes:

root@debian:~/Desktop# smbclient \\\\172.20.1.184\\SU1@Stardust -U tadeubento
Enter tadeubento's password:
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.3.11-Ubuntu]
smb: \> put 1GB
putting file 1GB as \1GB (34183,4 kb/s) (average 34183,4 kb/s)
smb: \> get 1GB
getting file \1GB of size 1073741824 as 1GB (29181,4 KiloBytes/sec) (average 29181,4 KiloBytes/sec)
smb: \>

O teste de escrita aproxima-se do teste pela rede aproxima-se do resultado do teste de escrita directa anterior (34MB/s vs 37MB/s). Já o teste de leitura apresentou valores inferiores cerca de 29MB/s através da rede contra os 36MB/s diretamente no dispositivo. Em ambos os casos considero que os resultados foram bastante positivos e não esperava, nem creio que fosse possível melhor.

Conclusão: A performance do Samba / partilha em rede é praticamente a mesma do máximo conseguido por USB no dispositivo. Estes são resultados excelentes e na minha experiência com outros SBCs só são possíveis porque o CPU é capaz de lidar com a criptografia necessária ao protocolo SMB.

Conclusões

Estou bastante surpreendido com o NanoPi Neo 2 porque nunca pensei que um SBC de baixo custo conseguisse apresentar resultados tão bons, especialmente na componente de rede e USB. A FriendlyARM desenvolveu um produto que na minha opinião é muito bom e de certeza que passou em diversas fases de testes.

Em muitos SBC (como o Raspberry Pi) a utilização da rede influência a performance do USB e vice-versa, mas no caso do NEO 2 isto não acontece – isto torna-o uma solução mesmo muito boa para partilha de ficheiros em rede. É possível também adicionar mais duas portas USB através dos seus pinos não utilizados, no futuro irei provavelmente fazer isto para poder ligar mais discos.

tl;dr: extremamente barato (15$), alta performance de rede e USB (muito superior ao Raspberry Pi 3), muito pequeno e de fácil instalação. Surpreendente. Aconselho vivamente para quem quiser montar uma partilha em rede / ter um servidor local de backups etc. Superou completamente as minhas expetativas e, sinceramente, pelo preço era bem provável nem ligar! ;).