在实时音视频场景中,获取系统、应用进程和BIOS信息是非常重要的。这些信息可以帮助测试人员直观地了解测试设备和进程的性能,从而更好地进行测试和优化。此外,这些信息还可以为进一步的数据挖掘和Top机型挖掘提供素材,为设备和应用的开发提供有力支持。
在Linux系统中,获取这些信息不像其他操作系统那样有简单易用的工具(例如Windows的SDK),而是非常分散和碎片化,几乎没有现成的工具可用。
首先,我们应该优先使用Linux API来获取相关信息。Linux API提供了很多接口,可以方便地获取系统和应用进程信息。如果没有相关API可用,我们可以查找是否有相关的文件系统,通过读取文件来获取信息。例如/sys,/etc和/proc文件系统。最后,如果以上方法都无法获取所需信息,我们才考虑通过管道执行命令来获取信息。但这种方法不仅效率低下,而且容易出现安全问题,因此应该尽量避免使用。
总之,在获取Linux系统、应用进程和BIOS信息时,我们应该遵循优先使用Linux API,其次是读取文件系统,最后才考虑通过管道执行命令的原则。这样可以保证获取信息的高效性和安全性。
本节介绍获取系统相关信息的工具和方法,包括:
读取/etc/os-release配置文件可以获得有关操作系统发行版、版本和其他相关细节的信息,被广泛应用于确定特定的Linux发行版及其属性,我们通常更关注PRETTY_NAME参数,因为它通常会覆盖Linux桌面特有发行版的名称和版本号。下面的表格列出了三个不同设备的配置信息,包括常用的桌面发行版Ubuntu、国产化Linux操作系统UOS以及嵌入式场景下的树莓派。
工具 |
ubuntu 18.04 台式机 |
ubuntu 22.04 笔记本 |
UOS国产化机器 |
树莓派 |
/etc/os-release |
NAME="Ubuntu" VERSION="18.04.6 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.6 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic |
PPRETTY_NAME="Ubuntu 22.04.1 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.1 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy |
PRETTY_NAME="UnionTech OS Desktop 20 Pro" NAME="uos" VERSION_ID="20" VERSION="20" ID=uos HOME_URL="https://www.chinauos.com/" BUG_REPORT_URL="http://bbs.chinauos.com" VERSION_CODENAME=eagle |
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)" NAME="Raspbian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs" |
读取/etc/hostname配置文件即可获得主机名。
工具 |
ubuntu 18.04 台式机 |
ubuntu 22.04 笔记本 |
UOS国产化机器 |
树莓派 |
|
/etc/hostname |
ubuntu-Precision-3630-Tower |
test-ThinkPad-Edge-E440 |
uos-PC |
raspberrypi |
使用uname工具可以方便获取内核相关的信息,包括版本及架构等等。
工具 |
ubuntu 18.04 台式机 |
ubuntu 22.04 笔记本 |
UOS国产化机器 |
树莓派 |
||
uname -a |
内核信息 |
Linux ubuntu-Precision-3630-Tower 5.4.0-132-generic #148~18.04.1-Ubuntu SMP Mon Oct 24 20:41:14 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux |
Linux test-ThinkPad-Edge-E440 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux |
Linux uos-PC 4.19.71-arm64-desktop #51.57016 SMP PREEMPT Mon Jan 17 13:10:41 CST 2023 aarch64 GNU/Linux |
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux |
|
uname API (推荐) |
sysname |
系统名 |
Linux |
Linux |
Linux |
Linux |
release |
系统版本号 |
5.4.0 |
5.19.0 |
4.19.71 |
4.14.98 |
|
machine |
架构 |
x86_64 |
x86_64 |
aarch64 |
armv7 |
读取/cpu/cpuinfo文件以获取CPU型号,优先读取model name,若不存在则读取Hardware。注意使用sysconf API获取到的是CPU的逻辑核心数,而不是物理核心数,获得cpu核心数主要可以指导我们进行线程优化。
工具 |
ubuntu 18.04 台式机 |
ubuntu 22.04 笔记本 |
UOS国产化机器 |
树莓派 |
||
/proc |
/proc/cpuinfo |
model name |
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz |
Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz |
❌ |
❌ |
Hardware |
❌ |
❌ |
HUAWEI Kirin 990 |
BCM2835 |
||
sysconf(_SC_NPROCESSORS_CONF) |
CPU Processors |
12 |
4 |
4 |
4 |
本节介绍主板和BIOS相关信息的获取,注意,只有Linux桌面系统才能获取该信息。
工具 |
ubuntu 18.04 台式机 |
ubuntu 22.04 笔记本 |
UOS国产化机器 |
树莓派 |
||
DMI/ SMBIOS |
/sys/class/dmi/id/bios_vendor |
BIOS制造商 |
Dell Inc. |
LENOVO |
Byosoft |
❌ |
/sys/class/dmi/id/board_name |
主板名 |
0Y2K8N |
20C5A084CD |
SP1KVUM |
❌ |
|
/sys/class/dmi/id/board_vendor |
主板制造商 |
Dell Inc. |
LENOVO |
HUAWEI |
❌ |
|
/sys/class/dmi/id/product_name |
产品名 |
Precision 3630 Tower |
20C5A084CD |
L410 KLVU-WDU0 |
用/proc/device-tree/model替代 Raspberry Pi 3 Model B Plus Rev 1.3 |
|
/sys/class/dmi/id/product_version |
产品版本 |
空白 |
ThinkPad Edge E440 |
L410 |
❌ |
本节介绍进程最关键的两个性能指标信息获取,包括CPU占用率和内存使用。
详见文章《linux系统下如何获取进程和系统的cpu占用率》
步骤:
这里介绍下/proc/pid/stat和/proc/stat的的内容:
pid comm state ppid pgrp session tty_nr tpgid flags minflt cminflt majflt cmajflt utime stime cutime cstime priority nice num_threads itrealvalue starttime vsize rss rsslim startcode endcode startstack kstkesp kstkeip signal blocked sigignore sigcatch wchan nswap cnswap exit_signal processor rt_priority policy delayacct_blkio_ticks guest_time cguest_time
可以计算出某一时刻进程总的消耗的cpu时间:
T= Tutime + Tstime + Tcutime + Tcstime
utime:用户态运行时间
stime :内核态运行时间
cutime:子进程用户态运行时间
cstime:子进程内核态运行时间
cpu user nice system idle iowait irq softirq steal guest guest_nice
cpu0 user nice system idle iowait irq softirq steal guest guest_nice
cpu1 user nice system idle iowait irq softirq steal guest guest_nice
可以计算出某一时刻系统总的的cpu时间Ttotal和消耗的cpu时间Twork:
Ttotal = Tuser + Tnice + Tsystem + Tidle
Twork = Tuser + Tnice + Tsystem
user:进程在用户态运行的时间
nice:进程在低优先级用户态运行的时间
system:进程在内核态运行的时间。
idle:CPU 空闲的时间。
计算统计周期内的时间差值可以得出相应的时间,从而计算出CPU占用率。需要注意的是,由于我们计算的是占用率,所以不必关注时间单位。
可以通过读取/proc/pid/status文件中的VmRSS字段值来获取指定进程实际使用的物理内存,单位为kB。
# proc/pid/status 部分内容
Name: demo
Umask: 0002
State: S (sleeping)
Tgid: 11253
Ngid: 0
Pid: 11253
PPid: 10679
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 24 27 30 46 116 126 1000
NStgid: 11253
NSpid: 11253
NSpgid: 10679
NSsid: 10077
VmPeak: 6071984 kB
VmSize: 5924488 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 164040 kB
VmRSS: 164040 kB
RssAnon: 61064 kB
RssFile: 102976 kB
RssShmem: 0 kB
详见文章《基于netlink的Linux Network Monitor实现》
Linux系统下可以使用API和内核通信或者直接读取文件系统来获取所需信息。此外,还有一些命令行工具可供使用,但我们建议优先使用API和文件系统。通过获取设备的一些静态信息,例如系统和BIOS信息,可以帮助我们挖掘Top机型。通过进程和网络等动态信息,可以指导我们进行应用性能测试和优化实践。