核心资源

CPU

QuecPi Alpha 单板电脑采用高通 QCS6490 作为核心处理器,基于 Arm v8 Cortex ,主频高达 2.7GHz 。

  1. 查看 CPU 信息命令
root@qcm6490-idp:/# cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 38.40
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x2
CPU part        : 0xd05
CPU revision    : 0

processor       : 1
BogoMIPS        : 38.40
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x2
CPU part        : 0xd05
CPU revision    : 0
  • processor :系统中逻辑处理核的编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核
  • BogoMIPS :在系统内核启动时粗略测算的CPU 每秒运行百万条指令数( Million Instructions Per Second )
  1. 查看 CPU 使用率

执行top之后,按1显示各CPU核使用率

root@qcm6490-idp:/# top
top - 00:20:05 up 20 min,  1 user,  load average: 0.04, 0.07, 0.06
Tasks: 340 total,   1 running, 339 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.5 us,  1.6 sy,  0.0 ni, 97.3 id,  0.0 wa,  0.5 hi,  0.0 si,  0.0 st
%Cpu1  :  0.5 us,  0.0 sy,  0.0 ni, 98.9 id,  0.0 wa,  0.5 hi,  0.0 si,  0.0 st
%Cpu2  :  1.6 us,  0.0 sy,  0.0 ni, 97.3 id,  0.5 wa,  0.0 hi,  0.0 si,  0.5 st
%Cpu3  :  0.0 us,  0.5 sy,  0.0 ni, 98.4 id,  0.0 wa,  0.5 hi,  0.0 si,  0.5 st
%Cpu4  :  1.1 us,  0.0 sy,  0.0 ni, 98.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.5 st
%Cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7366.7 total,   6386.2 free,    498.6 used,    481.9 buff/cache
MiB Swap:   5395.5 total,   5395.5 free,      0.0 used.   6698.9 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  162028   9468   6524 S   1.1   0.1   0:07.64 systemd
    594 message+  20   0    6904   3712   3328 S   1.1   0.0   0:06.46 dbus-daemon
   1087 root      20   0 1794556  61472  30848 S   1.1   0.8   0:05.56 containerd
   1816 root      20   0    5768   2688   2048 R   1.1   0.0   0:00.04 top
     40 root      20   0       0      0      0 I   0.5   0.0   0:00.48 kworker/3:0-mm_percpu_wq
     50 root      20   0       0      0      0 S   0.5   0.0   0:00.55 rcuop/4
    127 root      20   0       0      0      0 I   0.5   0.0   0:00.47 kworker/u16:6-events_unbound
    280 root      20   0   34988  15176  14792 S   0.5   0.2   0:05.38 systemd-journal
    925 root      20   0  630136  72200  53256 S   0.5   1.0   0:06.65 weston

  • %us :表示用户空间程序的 CPU 使用率(没有通过 nice 调度)
  • %sy :表示系统空间的 CPU 使用率,主要是内核程序
  • %ni :表示用户空间且通过 nice 调度过的程序的 CPU 使用率
  • %id :空闲 CPU
  • %wa : 等待输入输出的 CPU 时间百分比
  • %hi : CPU 处理硬中断的数量
  • %si : CPU 处理软中断的数量
  • %st : 实时
  1. 获取 CPU 温度信息
root@qcm6490-idp:/# cat /sys/class/thermal/thermal_zone0/temp
37000
  • 上面显示数字为千分之一度,除以 1000 就是当前温度值。
  1. CPU 压力测试

CPU 的压力的测试方式有很多,可通过 bc 命令来计算圆周率方法来测试 CPU 在运算过程中的稳定性。

root@qcm6490-idp:/# echo "scale=5000; 4*a(1)" | bc -l -q &
[1] 1592

上述命令将在后台计算的 PI,并精确到小数点后 5000 位,计算过程需要一段时间。
此时,我们可以通过 top 命令检查 CPU 利用率的变化,如下所示:

root@qcm6490-idp:/# top
top - 06:42:14 up 8 min,  1 user,  load average: 0.29, 0.16, 0.09
Tasks: 326 total,   3 running, 323 sleeping,   0 stopped,   0 zombie
%Cpu(s): 12.7 us,  0.2 sy,  0.0 ni, 86.8 id,  0.0 wa,  0.1 hi,  0.0 si,  0.2 st
MiB Mem :   7366.9 total,   6540.2 free,    439.5 used,    387.2 buff/cache
MiB Swap:   5395.7 total,   5395.7 free,      0.0 used.   6770.1 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   1592 root      20   0    3052   1792   1536 R  99.7   0.0   0:14.37 bc
    588 message+  20   0    6908   3584   3200 S   0.7   0.0   0:03.06 dbus-da+
      1 root      20   0  162064   9324   6380 S   0.3   0.1   0:04.26 systemd
...

约 15 秒后,PI 结果被计算出来。在此期间 CPU 使用率达到 100% ,没有发生异常,说明 CPU 压力测试通过。还可以继续增加精确值,可进一步提高测试压力。

root@qcm6490-idp:/# 3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
22317253594081284811174502841027019385211055596446229489549303819644\
...

PMIC

Linux 内核一般提供了三种 Suspend: Freeze、Standby 和STR( Suspend to RAM ),在用户空间向 /sys/power/state 文件分别写入 "freeze"、"standby" 和 "mem" , 即可触发它们。 QuecPi Alpha 支持 freeze 、mem 2 种方式,disk 暂不支持,以下将以 mem 为例进行测试说明。

  • 查看当前 QuecPi Alpha 支持的模式
root@qcm6490-idp:/# cat /sys/power/state
freeze mem disk
  • 设置唤醒源

测试休眠唤醒需要先设置唤醒源,设置 Debug 串口( ttySC0 )为唤醒源。

root@qcm6490-idp:/# echo enabled > /sys/devices/platform/soc@0/9c0000.geniqup/994000.serial/tty/ttyMSM0/power/wakeup
  • 休眠到内存

在用户空间向 /sys/power/state 写入字符串即进入相应的电源管理模式,休眠到内存的方式如下:

root@qcm6490-idp:/# echo mem > /sys/power/state
[15219.746797] PM: suspend entry (s2idle)
[15219.760424] Filesystems sync: 0.013 seconds
[15219.780574] Freezing user space processes
[15219.781589] process_accept_req: 22 callbacks suppressed
[15219.781600] smcinvoke: process_accept_req: Server id :17 interrupted probaby due to suspend, pid:897
[15219.791806] smcinvoke: process_accept_req: Server id :24 interrupted probaby due to suspend, pid:962
[15219.801969] smcinvoke: process_accept_req: Server id :18 interrupted probaby due to suspend, pid:903
[15219.812240] smcinvoke: process_accept_req: Server id :17 interrupted probaby due to suspend, pid:898
[15219.822590] smcinvoke: process_accept_req: Server id :18 interrupted probaby due to suspend, pid:902
[15219.832962] smcinvoke: process_accept_req: Server id :26 interrupted probaby due to suspend, pid:969
[15219.843391] smcinvoke: process_accept_req: Server id :21 interrupted probaby due to suspend, pid:929
[15219.853728] smcinvoke: process_accept_req: Server id :21 interrupted probaby due to suspend, pid:930
[15219.864031] smcinvoke: process_accept_req: Server id :17 interrupted probaby due to suspend, pid:899
[15219.874482] smcinvoke: process_accept_req: Server id :22 interrupted probaby due to suspend, pid:935
[15219.900228] Freezing user space processes completed (elapsed 0.119 seconds)

  • 通过 debug 串口唤醒

输入休眠命令后 QuecPi Alpha 休眠,将运行状态数据存到内存,并关闭外设,进入等待模式,此时因为设置的是 debug 唤醒,键盘随意输入字符即能成功唤醒系统,如下:

[15221.270632] process_accept_req: 3 callbacks suppressed
[15221.270636] smcinvoke: process_accept_req: process_accept_req txn 4 either invalid or removed from Q
[15221.270655] smcinvoke: process_accept_req: process_accept_req txn 2 either invalid or removed from Q
[15221.270668] smcinvoke: process_accept_req: process_accept_req txn 3 either invalid or removed from Q
[15221.270742] smcinvoke: process_accept_req: process_accept_req txn 2 either invalid or removed from Q
[15221.270870] smcinvoke: process_accept_req: process_accept_req txn 1 either invalid or removed from Q
[15221.270924] smcinvoke: process_accept_req: process_accept_req txn 4 either invalid or removed from Q
[15221.270981] smcinvoke: process_accept_req: process_accept_req txn 3 either invalid or removed from Q
[15221.270982] done.
[15221.271044] smcinvoke: process_accept_req: process_accept_req txn 1 either invalid or removed from Q
[15221.271059] smcinvoke: process_accept_req: process_accept_req txn 3 either invalid or removed from Q
[15221.271078] smcinvoke: process_accept_req: process_accept_req txn 2 either invalid or removed from Q
[15221.371963] PM: suspend exit

UFS

QuecPi Alpha 内嵌 128GB UFS 存储芯片,相比 eMMC,UFS 读写速度更快、支持全双工通信和命令队列,性能更优。

1. 查看容量

通过 fdisk -l 命令可以查询到 ufs 分区信息及容量。

root@qcm6490-idp:/opt/bc-1.08.1# fdisk -l
Disk /dev/sda: 116.09 GiB, 124646326272 bytes, 30431232 sectors
Disk model: C2G072
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 49B3A77D-3D7D-22A5-0A10-6A2ECDDEA256

Device      Start      End  Sectors   Size Type
/dev/sda1       6   131077   131072   512M EFI System
/dev/sda2  131078   138757     7680    30M Linux filesystem
/dev/sda3  138758 30431226 30292469 115.6G Linux root (ARM-64)

2. 查看分区信息

通过 df 命令可以查询到 ufs 分区信息,使用情况,挂载目录等信息。

root@qcm6490-idp:/opt/bc-1.08.1# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       109G  3.3G  101G   4% /sysroot
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           3.6G     0  3.6G   0% /dev/shm
tmpfs           1.5G   31M  1.5G   3% /run
tmpfs           4.0M     0  4.0M   0% /sys/fs/cgroup
tmpfs           3.6G   12K  3.6G   1% /tmp
tmpfs           3.6G     0  3.6G   0% /var/volatile
/dev/sda1       511M  136M  376M  27% /boot
/dev/sda2        25M  892K   22M   4% /var/persist
tmpfs           737M     0  737M   0% /run/user/0

3. 性能测试

性能测试主要测试 ufs 在 linux 系统下对文件的读写速度,一般结合 time 与 dd 双命令进行测试。

  • 写文件测试
root@qcm6490-idp:/opt# time dd if=/dev/zero of=tempfile bs=1M count=100 conv=fdatasync
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.2874 s, 365 MB/s

real    0m0.316s
user    0m0.000s
sys     0m0.122s

使用 dd 命令写文件时,需要加 conv=fdatasync 参数,表示当 dd 写 N 次结束之后,会 flush cache 同步到磁盘。因为对磁盘的写一般是先写到缓存还没有写到磁盘就返回了。这里测试出写磁盘速度为 365MB/s 。

  • 读文件测试

在嵌入式系统中,经常需要测试系统文件读写性能,读文件时忽略 cache 的影响。这时可以指定参数 iflag=direct ,nonblock 。

root@qcm6490-idp:/opt# time dd if=tempfile of=/dev/null bs=1M count=100 iflag=direct,nonblock
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.196993 s, 532 MB/s

real    0m0.201s
user    0m0.001s
sys     0m0.041s

可知,从磁盘直接读取读速度为532MB/s。

Memory

  1. 查看内存信息
root@qcm6490-idp:/opt/bc-1.08.1# cat /proc/meminfo
MemTotal:        7543736 kB
MemFree:         6664720 kB
MemAvailable:    6928688 kB
Buffers:           19768 kB
Cached:           380520 kB
SwapCached:            0 kB
Active:            52044 kB
Inactive:         462332 kB
Active(anon):       3588 kB
Inactive(anon):   142568 kB
Active(file):      48456 kB
Inactive(file):   319764 kB
  • MemTotal:所有可用的RAM 大小,物理内存减去预留位和内核使用
  • MemFree :LowFree + HighFree
  • Buffers:用来给块设备做缓存的大小
  • Cached:文件的缓冲区大小
  • SwapCached:已经被交换出来的内存。与I/O 相关
  • Active:经常(最近)被使用的内存
  • Inactive:最近不常使用的内存
  1. 获取内存使用率
root@qcm6490-idp:/opt/bc-1.08.1# free -m
               total        used        free      shared  buff/cache   available
Mem:            7366         437        6504          31         424        6763
Swap:           5395           0        5395
  • total :内存总量
  • used :被使用的内存量
  • free :可使用的内存量
  1. 内存压力测试

通过给定测试内存的大小和次数, 可以对系统现有的内存进行压力上的测试。可使用系统工具 memtester 进行测试,如指定内存大小 300MB ,测试次数为 1 ,测试命令为 "memtester 300M 1" 。

下列以使用 300MB 内存空间,单次测试为例:

root@qcm6490-idp:/# memtester 300M 1
memtester version 4.5.1 (64-bit)
Copyright (C) 2001-2020 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 300MB (314572800 bytes)
got  300MB (314572800 bytes), trying mlock ...locked.
Loop 1/1:
  Stuck Address       : ok
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok
  Block Sequential    : ok
  Checkerboard        : ok
  Bit Spread          : ok
  Bit Flip            : ok
  Walking Ones        : ok
  Walking Zeroes      : ok

Done.