linux获取带宽、cpu占用率、能耗
带宽
iperf
- 安装
- windows端
Windows分为32位和64位的,对应自己的系统版本下载,下载解压完成之后,将解压得到的文件复制到%systemroot%目录下,就能够直接使用了。
Windows的%systemroot%目录是C:\Windows\System32
不管是使用CMD还是Powershell,都必须要以管理员身份运行,否则无法正常使用
- linux端
sudo apt-get install iperf3
- 测试时记得关闭防火墙或者自行配置防火墙规则,为了快速测试,这里就直接关闭防火墙
systemctl stop firewalld
- 安装完iperf后,在Server端执行
iperf3 -s -i 1 -f m
-s表示server,-i表示显示时间间隔,-f表示显示格式化的单位
- -p, —port #,Server 端监听、Client 端连接的端口号;
- -f, —format [kmgKMG],报告中所用的数据单位,Kbits, Mbits, KBytes, Mbytes;
- -i, —interval #,每次报告的间隔,单位为秒;
- -F, —file name,测试所用文件的文件名。如果使用在 Client 端,发送该文件用作测试;如果使用在
Server 端,则是将数据写入该文件,而不是丢弃;
- -A, —affinity n/n,m,设置 CPU 亲和力;
- -B, —bind ,绑定指定的网卡接口;
- -V, —verbose,运行时输出更多细节;
- -J, —json,运行时以 JSON 格式输出结果;
—logfile f,输出到文件;
- -d, —debug,以 debug 模式输出结果;
- -v, —version,显示版本信息并退出;
- -h, —help,显示帮助信息并退出。
Server 端参数:
- -s, —server,以 Server 模式运行;
- -D, —daemon,在后台以守护进程运行;
- -I, —pidfile file,指定 pid 文件;
- -1, —one- -off,只接受 1 次来自 Client 端的测试,然后退出。
Client 端参数
- -c, —client ,以 Client 模式运行,并指定 Server 端的地址;
- -u, —udp,以 UDP 协议进行测试;
- -b, —bandwidth #[KMG][/#],限制测试带宽。UDP 默认为 1Mbit/秒,TCP 默认无限制;
- -t, —time #,以时间为测试结束条件进行测试,默认为 10 秒;
- -n, —bytes #[KMG],以数据传输大小为测试结束条件进行测试;
- -k, —blockcount #[KMG],以传输数据包数量为测试结束条件进行测试;
- -l, —len #[KMG],读写缓冲区的长度,TCP 默认为 128K,UDP 默认为 8K
—cport ,指定 Client 端运行所使用的 TCP 或 UDP 端口,默认为临时端口;
- -P, —parallel #,测试数据流并发数量;
- -R, —reverse,反向模式运行(Server 端发送,Client 端接收);
- -w, —window #[KMG],设置套接字缓冲区大小,TCP 模式下为窗口大小;
- -C, —congestion ,设置 TCP 拥塞控制算法(仅支持 Linux 和 FreeBSD );
- -M, —set- -mss #,设置 TCP/SCTP 最大分段长度(MSS,MTU 减 40 字节);
- -N, —no- -delay,设置 TCP/SCTP no delay,屏蔽 Nagle 算法;
- -4, —version4,仅使用 IPv4;
- -6, —version6,仅使用 IPv6;
- -S, —tos N,设置 IP 服务类型(TOS,Type Of Service);
- -L, —flowlabel N,设置 IPv6 流标签(仅支持 Linux);
- -Z, —zerocopy,使用 “zero copy”(零拷贝)方法发送数据;
- -O, —omit N,忽略前 n 秒的测试;
- -T, —title str,设置每行测试结果的前缀;
—get- -server- -output,从 Server 端获取测试结果;
—udp- -counters- -64bit,在 UDP 测试包中使用 64 位计数器(防止计数器溢出)。
speedtest-cli
sudo apt-get install speedtest-cli
speedtest-cli
Retrieving speedtest.net configuration...
Testing from China Telecom (117.28.251.190)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by China Unicom ZheJiang 5G (Hangzhou) [673.79 km]: 41.103 ms
Testing download speed................................................................................
Download: 187.88 Mbit/s
Testing upload speed......................................................................................................
Upload: 4.07 Mbit/s
这个好像只能测网速。
nload
查看网卡,网络情况sudo apt-get install nload
nload eth0
Incoming:
Curr: 14.38 kBit/s
Avg: 12.72 kBit/s
Min: 4.41 kBit/s
Max: 20.84 kBit/s
Ttl: 2.42 GByte
Outgoing:
Curr: 15.02 kBit/s
Avg: 16.90 kBit/s
Min: 7.54 kBit/s
Max: 55.80 kBit/s
Ttl: 730.93 MByte
Incoming也就是进入网卡的流量,Outgoing,也就是从这块网卡出去的流量,每一部分都有下面几个。
– Curr:当前流量
– Avg:平均流量
– Min:最小流量
– Max:最大流量
– Ttl:总流量
nload –help
-a:这个好像是全部数据的刷新时间周期,单位是秒,默认是300.
-i:进入网卡的流量图的显示比例最大值设置,默认10240 kBit/s.
-m:不显示流量图,只显示统计数据。
-o:出去网卡的流量图的显示比例最大值设置,默认10240 kBit/s.
-t:显示数据的刷新时间间隔,单位是毫秒,默认500。
-u:设置右边Curr、Avg、Min、Max的数据单位,默认是自动变的.注意大小写单位不同!
h|b|k|m|g h: auto, b: Bit/s, k: kBit/s, m: MBit/s etc.
H|B|K|M|G H: auto, B: Byte/s, K: kByte/s, M: MByte/s etc.
-U:设置右边Ttl的数据单位,默认是自动变的.注意大小写单位不同(与-u相同)!
Devices:自定义监控的网卡,默认是全部监控的,使用左右键切换。
如只监控eth0命令: nload eth0
nethogs
sudo apt-get install nethogs
sudo nethogs
总结
- 局域网 iperf
- 外网 speedtest-cli
- 流量统计 nload iftop
iperf3 python
- 服务端
import iperf3 def iperfserver(): server = iperf3.Server() result = server.run() result.remote_host print(result) iperfserver(received_Mbps)
- 客户端
import iperf3 def iperfclient(): client = iperf3.Client() client.duration = 1 client.server_hostname = '127.0.0.1' client.port = 5201 result = client.run() result.sent_Mbps iperfclient()
tips:预先
pip install iperf3
和sudo apt-get install iperf
输出结果
# Bits are measured in 10**3 terms
# Bytes are measured in 2**10 terms
# kbps = Kilobits per second
# Mbps = Megabits per second
# kB_s = kiloBytes per second
# MB_s = MegaBytes per second
self.sent_kbps = self.sent_bps / 1000
self.sent_Mbps = self.sent_kbps / 1000
self.sent_kB_s = self.sent_bps / (8 * 1024)
self.sent_MB_s = self.sent_kB_s / 1024
self.received_kbps = self.received_bps / 1000
self.received_Mbps = self.received_kbps / 1000
self.received_kB_s = self.received_bps / (8 * 1024)
self.received_MB_s = self.received_kB_s / 1024
看一眼源码,然后就拿到了输出数据
- bandwidth 目标带宽(以位/秒为单位)
- blksize 测试 blksize。
- duration 测试持续时间(以秒为单位)。
看了一下最小测试时间为1s,有点长。
iperf2
tcp:
iperf -s -p 5001
iperf -c localhost -p 5001 -R -t 0.1 -f s
udp:
iperf -s -p 5001 -u
iperf -c localhost -p 5001 -R -t 0.1 -f s -u -b 10000m
- -R 双向测试
- iperf3中则不区分两者区别。
udp时发现传输带宽只有1.05Mbits/sec
1.05Mbits/sec远低于TCP测试中观察到的值,它也远远低于1GB 的最大出站贷款上限,这是因为默认情况下,iperf讲UDP客户端的贷款限制为每秒1Mbit。
可以用-b标志更改此值,讲数字替换为要测试的最大带宽速率。如果需要测试网络速度,可以将数字设置为高于网络提供商提供的最大带宽上线:
iperf -c 198.51.100.5 -u -b 1000m
这将告诉客户端我们希望尽可能达到每秒1000Mbits的最大值,该-b标志仅在使用UDP连接时有效,因为iperf未在TCP客户端上设置带宽限制。
import os
tmp = os.popen('iperf3 -c localhost -R -t 0.1 -f s').readlines()
print(tmp[6].split(" ")[12])
输出
110M/bits
tips 后台运行
iperf3 -s -D # 注意D一定要大写
默认情况下我们进行测试,都是客户端发送数据,服务器端接收数据,这种情况下相当于只对上行带宽进行了测试,如果我们需要检测下行带宽,只需要使用
-R
命令,即可变为客户端接收,服务器端发送。
参考:
https://iperf.fr/iperf-doc.php
https://github.com/thiezn/iperf3-python
cpu\内存\网络\进程信息
psutil
在Python中获取系统信息的另一个好办法是使用psutil这个第三方模块。顾名思义,psutil = process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。
安装
pip install psutil
cpu信息
使用: psutil.cpu_percent(interval=0.1, percpu=False)
- percpu True 的每个核的使用率、 False 平均使用率
- interval 好像是s,0.1是最小值
psutil.cpu_times() #统计CPU的用户/系统/空闲时间: psutil.cpu_count() # CPU逻辑数量 psutil.cpu_count(logical=False) # CPU物理核心
内存信息
psutil.virtual_memory() psutil.swap_memory() svmem(total=8589934592, available=2866520064, percent=66.6, used=7201386496, free=216178688, active=3342192640, inactive=2650341376, wired=1208852480)
磁盘信息
psutil.disk_partitions() # 磁盘分区信息 psutil.disk_usage('/') # 磁盘使用情况 psutil.disk_io_counters() # 磁盘IO
网络信息
psutil.net_io_counters() # 获取网络读写字节/包的个数 psutil.net_if_addrs() # 获取网络接口信息 psutil.net_if_stats() # 获取网络接口状态
进程信息
psutil.pids() # 所有进程ID p = psutil.Process(3776) # 获取指定进程ID=3776,其实就是当前Python交互环境 p.name() # 进程名称 p.exe() # 进程exe路径 p.cwd() # 进程工作目录 p.cmdline() # 进程启动的命令行 p.ppid() # 父进程ID p.parent() # 父进程 p.children() # 子进程列表 p.status() # 进程状态 p.username() # 进程用户名 p.create_time() # 进程创建时间 p.terminal() # 进程终端 p.cpu_times() # 进程使用的CPU时间 p.memory_info() # 进程使用的内存 p.open_files() # 进程打开的文件 p.connections() # 进程相关网络连接 p.num_threads() # 进程的线程数量 p.threads() # 所有线程信息 p.environ() # 进程环境变量 p.terminate() # 结束进程
psutil还提供了一个test()函数,可以模拟出ps命令的效果:
进程能耗
PowerTOP
PowerTOP 是一个 Linux 工具,用于诊断电量消耗和电源管理的问题。
sudo powertop --csv="1.txt" --time=0.01
s-tui
该工具可以测能耗、温度、占用率
- 地址为:
https://github.com/amanusk/s-tui
git clone https://github.com/amanusk/s-tui
cd s-tui
sudo pip install urwid
sudo pip install psutil
sudo apt-get install stress(可选)
源码使用
sudo python -m s_tui.s_tui
命令行使用
sudo add-apt-repository ppa:amanusk/python-s-tui
sudo apt-get update
sudo apt-get install python3-s-tui
sudo python3-s-tui
特别提醒
windows不能使用该方法,只有linux可以用,看power需要管理员权限。
optional arguments:
-h, --help show this help message and exit
-d, --debug Output debug log to _s-tui.log
--debug-file DEBUG_FILE
Use a custom debug file. Default: _s-tui.log
-c, --csv Save stats to csv file
--csv-file CSV_FILE Use a custom CSV file. Default: s-tui_log_<TIME>.csv
-t, --terminal Display a single line of stats without tui
-j, --json Display a single line of stats in JSON format
-nm, --no-mouse Disable Mouse for TTY systems
-v, --version Display version
-ct CUSTOM_TEMP, --custom_temp CUSTOM_TEMP
Custom temperature sensors.
The format is: <sensors>,<number>
As it appears in 'sensors'
e.g
> sensors
it8792-isa-0a60,
temp1: +47.0C
temp2: +35.0C
temp3: +37.0C
use: -ct it8792,0 for temp 1
-tt T_THRESH, --t_thresh T_THRESH
High Temperature threshold. Default: 80
-cf CUSTOM_FAN, --custom_fan CUSTOM_FAN
Similar to custom temp
e.g
>sensors
thinkpad-isa-0000
Adapter: ISA adapter
fan1: 1975 RPM
use: -cf thinkpad,0 for fan1
可以通过以下方法进行获取结果sudo s-tui --csv-file='1.txt'
sudo s-tui -t
即可获取一次结果
python获取代码总结
import os
import time
while True:
start=time.time()
tmp = os.popen('iperf -c xxxx -R -t 0.3 -f s -f Mbytes').readlines()
tmp2 = os.popen('sudo s-tui -t').readlines()
print(float(tmp[6].split(" ")[tmp[6].split(" ").index("MBytes/sec\n")-1])*8,"MBbits/sec")
print(tmp2[0].split(' ')[tmp2[0].split(" ").index("Utilization:") + 1])
print(tmp2[0].split(' ')[tmp2[0].split(" ").index("Power:")+1])
print("time:",time.time()-start)
测试结果
4000MBbits
1.3
30.5
time: 0.3945608139038086
0.3s获取一次结果。
再加一个线程池,即可更进一步的将速度降低到0.3s,完美满足需求。
附带一个树莓派lcd屏幕使用
https://www.waveshare.net/wiki/1.3inch_LCD_HAT
键盘无法使用
- 先切换到root用户,执行xhost +
- 然后再切换到oracle用户,执行export DISPLAY=:0.0
案件损坏,可以修改按键nano mouse.py
图形界面下的控制
主要控制指令是:xset
想要永久防止它进入休眠可以用以下指令:
创建文件:
sudo nano /etc/profile.d/Screen.sh
文件内容:
xset dpms 0 0 0
xset s off
加执行权限:
sudo chmod +x /etc/profile.d/Screen.sh
唤醒
如果只是想临时让它从休眠中自动醒过来, 可以让程序执行自动指令:
xset dpms force on
指令 | 说明 |
---|---|
xset s off | 禁用屏幕保护 |
xset s 3600 3600 | 设置空闲时间为1小时 |
xset -dpms | 关闭 DPMS |
xset s off -dpms | 禁用 DPMS 并阻止屏幕进入空闲 |
xset dpms force off | 立即关闭屏幕 |
xset dpms force standby | 强制屏幕进入待命状态 |
xset dpms force suspend | 强制屏幕进入暂停状态 |
- 方法
sudo nano /etc/lightdm/lightdm.conf
增加[Seat:*] #type=local #pam-service=lightdm #pam-autologin-service=lightdm-autologin #pam-greeter-service=lightdm-greeter #xserver-backend= xserver-command=X -s 0-dpms #xserver-command=X
xserver-command=X -s 0-dpms
- 命令行
xset
想要永久防止它进入休眠可以用以下2条指令
xset dpms 0 0 0
xset s off
如果只是想临时让它从休眠中自动醒过来, 可以让程序执行自动指令
xset dpms force on
附上xset的常规用法
关于文字界面(Console)下防止休眠,顺带提一下:
setterm --blank 0
setterm --powersave off
UDP获取信道带宽和绑定网卡
iperf -c 198.168.0.15 -u -R -b 10000m -t 0.3 -f s -f Mbytes -B 192.168.0.21