linux获取带宽、cpu占用率、能耗


linux获取带宽、cpu占用率、能耗

带宽

iperf

  1. 安装
  • windows端

Windows分为32位和64位的,对应自己的系统版本下载,下载解压完成之后,将解压得到的文件复制到%systemroot%目录下,就能够直接使用了。

Windows的%systemroot%目录是C:\Windows\System32

不管是使用CMD还是Powershell,都必须要以管理员身份运行,否则无法正常使用

  • linux端
    sudo apt-get install iperf3
  1. 测试时记得关闭防火墙或者自行配置防火墙规则,为了快速测试,这里就直接关闭防火墙

systemctl stop firewalld

  1. 安装完iperf后,在Server端执行
iperf3   -s -i 1 -f  m
		-s表示server,-i表示显示时间间隔,-f表示显示格式化的单位
  1. 在Client端执行如下命令
    iperf3 -c 10.241.18.1 -i 1 -t 30 -f m
     -c表示客户端,后面接server的地址,-t代表运行的时间

    通用参数:

  • -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

  1. 服务端
    import iperf3
    def iperfserver():
        server = iperf3.Server()
        result = server.run()
        result.remote_host
        print(result)
    iperfserver(received_Mbps)
  2. 客户端
    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 iperf3sudo 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

看一眼源码,然后就拿到了输出数据

  1. bandwidth 目标带宽(以位/秒为单位)
  2. blksize 测试 blksize。
  3. 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
键盘无法使用

  1. 先切换到root用户,执行xhost +
  2. 然后再切换到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 强制屏幕进入暂停状态
  1. 方法
    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
  1. 命令行

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


文章作者: 万鲲鹏
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 万鲲鹏 !
评论
  目录