NanoPi
linux
Pi
产品概况
# NanoPi Fire3 测评
[![](http://wiki.friendlyarm.com/wiki/images/7/73/NanoPi_Fire3-01B.jpg)](http://wiki.friendlyarm.com/wiki/images/7/73/NanoPi_Fire3-01B.jpg)
nanopi Fire3 是友善出的一款高性能的Arm Linux开发板。主打机器学习,基于Qt终端相关的功能。
本次非常有幸能够参加芯吧客的测评活动,一下对为期一个月的使用使用体验做一个总结。
本文从一下几个角度进行测评:
1.硬件性能测试
2.Nginx静态/动态网站压力测试
3.机器学习性能
4.Qt5实现天气时钟
# 前言
## 硬件配置简述
- CPU: S5P6818, 运行主频1.4GHz
- RAM: 1GB DDR3
- 电源管理: 采用一颗ARM® Cortex®-M0单片机做电源管理, 支持动态调压, 软件关机和定时开机等功能.
- 网络: 千兆以太网口 x1
- 接口:USB 2.0接口、40pinGPIO、DVP Camera、microHDMI
在终端上使用
```bash
lscpu
```
![](https://IMG_URL_REPLACE/bbsimages/202008/1b2c35fe82fd45c1a2a8c236b8251601.png)
得到CPU信息如下:
```
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 2
CPU max MHz: 1400.0000
CPU min MHz: 400.0000
```
值得注意的是Socket参数为2,看来S5P6818这个8核心处理器应该是由两个4核心的处理器组合(胶水粘的?)而成的。
## 准备工作
1.32G class10 内存卡一张
2.5V 2A充电器一个
3.散热片一个(注意,这块开发板必加散热片,因为待机状态下温度已经接近60度了)
4.开关线一根
5.TF预先烧写由FriendlyArm提供的基于ubuntu16.04定制的firendlyCore([下载地址](http://www.nanopi.io/downloads.html))
### 通过SSH连接
从路由器的网页后台找到nanopi的IP(如192.168.1.223)
friendlyCore的root账户的密码为fa
打开Windows的CMD或Linux的虚拟终端
输入如下命令
```bash
ssh root@192.168.1.223
```
![](https://IMG_URL_REPLACE/bbsimages/202008/3acfc338010a86ae7568cd74e77b39a5.png)
提示输入密码,输入fa
![](https://IMG_URL_REPLACE/bbsimages/202008/bd6193e0ae523f5dcaa1b29230ec5c12.png)
登录成功,终端显示系统的一些必要信息
### 更换APT源
使用自带的nano编辑器修改`/etc/apt/sources.list`
将其中的`http://port.ubuntu.com/`更改为`http://mirrors.aliyun.com/ubuntu-ports/`
如下图:
![](https://IMG_URL_REPLACE/bbsimages/202008/af805a8bd87b17f238ca2c7d13d59447.png)
### 进行系统更新
在终端中输入命令
```
apt update //更新APT源
apt upgrade -y //更新系统所有软件
```
系统更新过程大概10-20分钟左右,请耐心等待,中间务必保证不能结束任务。
至此系统部署已经基本完成,可以这个时候备份一下内存卡,之后可以直接还原。
功能体验
# 测试项目
## 1.CPU基准性能测试
sysbench是一个非常方便好用的硬件性能测试软件,测试主要关注性能测试分数,以及温度表现
### 安装sysbench
```bash
#终端中输入
apt install sysbench
```
### CPU基准性能测试
#### 默认配置测试
终端输入:
```bash
sysbench --test=cpu --max-requests=100000 run #单线程条件下,总计算(请求)次数为10万次条件下进行测试
```
测试结果:
```bash
#完成10万次10000以内素数计算所用的时间
Maximum prime number checked in CPU test: 10000
Test execution summary:
total time: 106.1629s #花费的总时间,越短越好
total number of events: 100000 #完成请求总数,由max-requests参数指定
total time taken by event execution: 106.0978
per-request statistics: #一次请求的相关参数
min: 1.06ms
avg: 1.06ms
max: 3.07ms
approx. 95 percentile: 1.07ms
Threads fairness:
events (avg/stddev): 100000.0000/0.00
execution time (avg/stddev): 106.0978/0.00
```
起始温度:65度
终点温度:68度
看出来单线程模式下面,fire3应付压力测试轻轻松松,负载甚至都没怎么变更。
#### 8线程(满线程条件)测试
终端输入:
```bash
sysbench --test=cpu --max-requests=100000 --num-threads=8 run #8线程条件下,总计算(请求)次数为10万次条件下进行测试
```
测试结果:
```bash
Maximum prime number checked in CPU test: 10000
Test execution summary:
total time: 13.3268s
total number of events: 100000
total time taken by event execution: 106.4511
per-request statistics:
min: 1.06ms
avg: 1.06ms
max: 21.12ms
approx. 95 percentile: 1.07ms
Threads fairness:
events (avg/stddev): 12500.0000/24.21
execution time (avg/stddev): 13.3064/0.01
```
起始温度:65度
终点温度:68度
#### 8线程(满线程条件)极限压力测试
终端输入:
```bash
sysbench --test=cpu --max-requests=100000 --num-threads=8 run
```
本次将请求次数设为1000万次,观察满载过程中的温度表现
起始温度:65度
1分钟温度:80度
5分钟温度:85度
## 2.异构集群部署
不知道各位吧友有没有这样的困惑?手里面有几张不同型号的开发板都在吃灰,这样的话其实可以利用闲置的开发板搭建集群,自己做一个超级计算机!我手里现在有一张树莓派4B,下面就使用树莓派4B和nanopiFire3进行基于DockerSwarm的计算集群的搭建。这里值得吐槽的一点是,官方wiki中给出的docker安装方式工作不正常,通过dpkg安装docker我这里是直接卡死的,没办法只能自己编译安装docker了
树莓派4B烧写的是我之前文章中推荐过的国人自制系统([项目地址](https://gitee.com/openfans-community/Debian-Pi-Aarch64))
### Docker Swarm简介
Docker Swarm 是 Docker 的集群管理工具。它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
Swarm是典型的master-slave结构,拥有一个master和多个worker。Manager节点还执行维护所需群集状态所需的编排和集群管理功能,Worker节点接收并执行从Manager节点分派的任务。可以实现动态的接入扩展。
此处,我们使用树莓派作为Manager,使用nanopi作为Worker节点。当然,由于我们只有一个Manager节点,如果节点挂了,我们整个集群也就停止运行了。可以通过添加冗余的Manager节点来避免这样的问题。
![](https://IMG_URL_REPLACE/bbsimages/202008/eb7c92528147ba60411e8e564fee1fea.png)
### 安装Docker
运行以下命令
```bash
wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/arm64/containerd.io_1.2.6-3_arm64.deb
wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/arm64/docker-ce-cli_19.03.2~3-0~ubuntu-xenial_arm64.deb
wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/arm64/docker-ce_19.03.2~3-0~ubuntu-xenial_arm64.deb
sudo dpkg -i containerd.io_1.2.6-3_arm64.deb
sudo dpkg -i docker-ce-cli_19.03.2~3-0~ubuntu-xenial_arm64.deb
sudo dpkg -i docker-ce_19.03.2~3-0~ubuntu-xenial_arm64.deb
```
### 配置主(manager)结点
因为我这里树莓派是常开的,这次把树莓派作为主结点,在树莓派上运行一下命令
```bash
sudo docker swarm init #初始化Swarm集群,将树莓派节点加入集群,担任管理者(manager node)
```
返回信息:
```bash
root@raspbian:/home/pi# docker swarm init
Swarm initialized: current node (dfi3prfg84a2xulg1bk1fevol) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4hbmyzmgngabdym6j1s6yexijvbtgxqp31ythsjftbkassrh0t-7dy7q4jog95jrizwhbr2plvg6 192.168.1.239:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
```
### 配置工人(Worker)结点
在NanoPifire3上执行命令
```bash
docker swarm join --token SWMTKN-1-4hbmyzmgngabdym6j1s6yexijvbtgxqp31ythsjftbkassrh0t-7dy7q4jog95jrizwhbr2plvg6 192.168.1.239:2377
```
返回信息:
```bash
docker swarm join --token SWMTKN-1-4hbmyzmgngabdym6j1s6yexijvbtgxqp31ythsjftbkassrh0t-7dy7q4jog95jrizwhbr2plvg6 192.168.1.239:2377
This node joined a swarm as a worker.#这个nanopi节点作为工作者加入集群(worker node)
```
和集群相关的命令均不可在Worker节点上执行
如执行
```bash
docker node ls
```
会得到报错信息:
```bash
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
```
### 集群管理
#### 显示集群结点
在masterNode上,即我们的树莓派上输入命令:
```docker node ls ```
![](https://IMG_URL_REPLACE/bbsimages/202008/b8c6959d13c9bc2cc239187883fe5f21.png)
现在我们的集群已经搭建完毕了。
#### 显示集群节点运行的服务
```docker service ls ```
#### 变更节点角色
```bash
docker node promote [节点名] #将worker节点变更为manager节点
```
## 安装Openfaas
OpenFaaS 是一个使用 Docker 构建无服务器(Serverless)功能的框架,它拥有对指标的一级支持。任何流程都可以打包为一个函数,使你能够使用一系列 web 事件,而无需重复的样板化编码。也就是创建远程函数。在任何地方都可以使用该函数完成所需的功能,下面完成Python环境的搭建
### 部署
在master节点上运行如下命令,其他的worker节点会收到来自master节点上的指令,自动完成环境的搭建。
```bash
root@raspbian:/home/pi/code# git clone https://github.com/alexellis/faas/
root@raspbian:/home/pi/code# cd faas/
root@raspbian:/home/pi/code/faas# ./deploy_stack.sh
#脚本运行结果
Attempting to create credentials for gateway..
c4zx71n9njduqdt86o1700xhp
pqzukn3jzsbdggmms0ajd0rdp
[Credentials]
username: admin
password: d78d9f205e065cf5bae0841eb76262afd1b6742e0b6d031a03db16cc0dc7ae68
echo -n d78d9f205e065cf5bae0841eb76262afd1b6742e0b6d031a03db16cc0dc7ae68 | faas-cli login --username=admin --password-stdin
Enabling basic authentication for gateway..
Deploying OpenFaaS core services for ARM64
Creating network func_functions
Creating config func_alertmanager_config
Creating config func_prometheus_config
Creating config func_prometheus_rules
Creating service func_prometheus
Creating service func_alertmanager
Creating service func_gateway
Creating service func_basic-auth-plugin
Creating service func_faas-swarm
Creating service func_nats
Creating service func_queue-worker
root@raspbian:/home/pi/code/faas#
```
记得保存得到的用户名和密码
使用命令
```bash
docker service ls #显示当前集群中运行的服务
```
可以看到类似如下返回:
```bash
pi@raspbian:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
owzkqxicwrqz func_alertmanager replicated 1/1 prom/alertmanager:v0.18.0
wvrm669yfd5n func_basic-auth-plugin replicated 1/1 openfaas/basic-auth-plugin:0.18.17-arm64
ul3roevvxluj func_faas-swarm replicated 1/1 openfaas/faas-swarm:0.8.5-arm64
rj2j7tz4fdyo func_gateway replicated 1/1 openfaas/gateway:0.18.17-arm64 *:8080->8080/tcp
juu3ok1thkb9 func_nats replicated 1/1 nats-streaming:0.17.0
31n0v2qhwmo5 func_prometheus replicated 1/1 prom/prometheus:v2.11.0 *:9090->9090/tcp
ep2ngmxsud7a func_queue-worker replicated 1/1 openfaas/queue-worker:0.11.2
```
我们可以看到当前集群暴露出来了8080和9090两个端口
浏览器访问`主节点ip:8080`就可以看到openfass的后台了。这里我们可以新建和调试Function(也就是我们的云函数)
至此OpenFaas搭建完毕,我们已经可以生成我们自己的云函数了,可以使用我们集群的运算能力了。
![](https://IMG_URL_REPLACE/bbsimages/202008/6a0aaf550f34335cce49181cdc77c749.png)
总结
### 总结
在sysbench中NanoPIFire3的性能强劲一览无余,但是同时最大的缺点就是发热问题了,在安装了导热片散热片同时室内开着空调的情况下,无负载温度为60度,满载几分钟后温度接近85度,横向对比大火炉树梅派4B+,其待机温度也不过是40度左右。也就是说,被动散热已经满足不了这块板子的需求。那么用这块板子做项目,散热系统设计就是一个非常重要的环节了。
同时希望官方的文档支持能够更加友善和完善,如按照官方wiki进行Docker部署会出现不成功的情况,希望官方能够对文档内容做有效核实。以及官方的npi-config工具仍然有一些不完善。
总的来说,需要算力和性价比,选NanoPiFire3就够了!
原创作品,未经权利人授权禁止转载。详情见转载须知。