概述

用于计算服务器出入口实际带宽速率,用于统计服务器网络测速统计。

脚本功能

该脚本会根据当前服务器内存剩余空间判断生成约为1.5G临时文件,并提交至指定的url地址进行出口带宽占用。通过检查默认出入口网卡流量数值来判断出入口带宽网络速率。

执行效果

本脚本不适宜在生产或已部署服务的服务器上运行,可能会因CPU&内存占用过高导致其他服务被系统杀死

[root@cloud-node1 ~]# bash test.sh
当前默认网卡 ens32 上行测速将开始,等待10s...
当前默认网卡 ens32 下行测速将开始,等待10s...
当前默认网卡 ens32 物理速率为: 1000Mb/s ,实际测试流量下行速率约为: 917 Mbps/s,上行速率约为: 98 Mbps/s
当前默认网卡 ens32 物理速率为: 1000Mb/s ,实际测试流量下行格式化速率约为: 114.74 MB/s,出口流量格式化速率约为: 12.29 MB/s
脚本内容
#!/bin/bash
# 服务器出入口网络带宽速率计算
# Author: [email protected]
# Date: 2023-03-31
# Version: 0.0.4
# Description: 该脚本用于服务器外网出入口网络速率测速

set +m

# 检查是否有测速请求进程未完成
ps -o pid,command|awk '/Speed_Test_File[[:space:]]/ {print $1}'|xargs -i kill {} 2> /dev/null
# 默认流量出口网卡
Default_Network_Device_Name=`route -n|awk '/^0.0.0.0/ {print $8}' |uniq`
# 临时测速文件
Temp_Speed_File="/dev/shm/Speed_Test_File"
if [ ! -f "${Temp_Speed_File}" ];then
    # 剩余内存计算
    Free_Mem_Info=`awk -F":[[:space:]]" '/^MemFree:/ {print $2}' /proc/meminfo  |awk '{printf "%.0F",$1/1024}'`
    if [ "${Free_Mem_Info}" -gt 2048 ];then
        Temp_Speed_Size='2000000'
    else
        Temp_Speed_Size='1563000'
    fi
    echo "开始生成 $((${Temp_Speed_Size}/1024))M 的临时文件:${Temp_Speed_File}"
    # 生成临时测速文件
    dd if=/dev/zero of=${Temp_Speed_File} bs=1024 count=${Temp_Speed_Size} &> /dev/null
fi
# 获取物理网卡速率
Network_Device_Speed=`route -n|awk '/^0.0.0.0/{print $8}'|uniq |xargs -i ethtool {} 2>/dev/null|awk '/Speed/ {print $2}'`
if [ "${Network_Device_Speed}" = '100Mb/s' ];then
    Network_Conf_Speed='2'
elif [ "${Network_Device_Speed}" = '1000Mb/s' ];then
    Network_Conf_Speed='10'
elif [ "${Network_Device_Speed}" = '10000Mb/s' ];then
    Network_Conf_Speed='20'
elif [ "${Network_Device_Speed}" = '20000Mb/s' ];then
    Network_Conf_Speed='30'
elif [ "${Network_Device_Speed}" = '25000Mb/s' ];then
    Network_Conf_Speed='40'
else
    Network_Device_Speed='100Mb/s(虚拟机)'
    Network_Conf_Speed='2'
fi
# 上传测速地址Url
Upload_Speed_Url_List=('https://www.baidu.com/speed' 'https://www.aliyun.com/speed' 'https://ecloud.10086.cn/speed' 'https://www.ctyun.cn/speed' 'https://cucc.wocloud.cn/speed' 'https://lol.qq.com/speed' 'https://daoju.qq.com/speed' 'https://pay.qq.com/speed' 'https://www.migu.cn/speed')
for num in $(seq 1 "${Network_Conf_Speed}");do
    for Upload_Speed_Url in ${Upload_Speed_Url_List[@]};do
        (curl -s --interface "${Default_Network_Device_Name}" -F "data=@${Temp_Speed_File}" "${Upload_Speed_Url}" &> /dev/null &)
    done &
done &
sleep 4
echo "当前默认网卡 ${Default_Network_Device_Name} 上行测速将开始,等待10s..."
# 历史出口流量
Old_Network_Outlet_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/tx_bytes`
sleep 10
# 最新新出口流量
New_Network_Outlet_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/tx_bytes`
# 网卡出口流量字节速率
Network_Outlet_Flow_Sum=`echo |awk "{printf \"%f\", (${New_Network_Outlet_Flow_Sum}-${Old_Network_Outlet_Flow_Sum})/10}"`
# 网卡出口流量比特速率
Network_Outlet_Flow_Sum_D=`echo |awk "{printf \"%f\",(${New_Network_Outlet_Flow_Sum}-${Old_Network_Outlet_Flow_Sum})*8/10}"`
# 标准出口比特速率
Network_Outlet_Device_Flow_Sum_D=`echo|awk "{printf \"%f\",${Network_Outlet_Flow_Sum_D/.*}/1024/1024}"`
# 标准出口字节速率
Network_Outlet_Device_Flow_Sum=`echo|awk "{printf \"%.2f\",${Network_Outlet_Flow_Sum/.*}/1024/1024}"`
# 清理未完成进程
ps -o pid,command|awk '/Speed_Test_File[[:space:]]/ {print $1}'|xargs -i kill -9 {} 2> /dev/null
if [ -z "${1}" ];then
    rm -f "${Temp_Speed_File}"
fi

# 下载测速地址Url
Download_Speed_Url_List=('https://speed.cloudflare.com/__down?bytes=150000000' 'https://mirrors.cloud.tencent.com/OpenBSD/7.3/packages/amd64/unknown-horizons-2019.1p1.tgz' 'https://mirrors.tuna.tsinghua.edu.cn/OpenBSD/7.3/packages/amd64/unknown-horizons-2019.1p1.tgz' 'https://mirrors.aliyun.com/centos/7/os/x86_64/LiveOS/squashfs.img' 'https://mirrors.163.com/ubuntu/dists/kinetic/Contents-amd64.gz' 'http://mirrors.sohu.com/ubuntu/dists/kinetic/Contents-amd64.gz' 'https://mirrors.aliyun.com/ubuntu/dists/kinetic/Contents-amd64.gz' )
# 下载速率
for num in $(seq 1 "${Network_Conf_Speed}");do
    for Download_Speed_Url in ${Download_Speed_Url_List[@]};do
        (wget -q --no-check-certificate --dns-timeout=5 --connect-timeout=3 -O /dev/null -U 'Speed_Test_Query' "${Download_Speed_Url}" &> /dev/null &)
    done &
done &
sleep 4
echo "当前默认网卡 ${Default_Network_Device_Name} 下行测速将开始,等待10s..."
Old_Network_Ingress_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/rx_bytes`
sleep 10
New_Network_Ingress_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/rx_bytes`
# 网卡入口流量字节速率
Network_Ingress_Flow_Sum=`echo |awk "{printf \"%f\",(${New_Network_Ingress_Flow_Sum}-${Old_Network_Ingress_Flow_Sum})/10}"`
# 网卡入口流量比特速率
Network_Ingress_Flow_Sum_D=`echo |awk "{printf \"%f\",(${New_Network_Ingress_Flow_Sum}-${Old_Network_Ingress_Flow_Sum})*8}"`
# 标准入口比特速率
Network_Ingress_Device_Flow_Sum_D=`echo|awk "{printf \"%f\",${Network_Ingress_Flow_Sum_D/.*}/10485760}"`
# 标准入口字节速率
Network_Ingress_Device_Flow_Sum=`echo|awk "{printf \"%.2f\",${Network_Ingress_Flow_Sum/.*}/1024/1024}"`
ps -o pid,command|awk '/Speed_Test_Query[[:space:]]/ {print $1}'|xargs -i kill -9 {} 2> /dev/null
# 标准网络速率
Network_Outlet_Device_Flow_Type="Mbps"
# 标准硬盘速率
Network_Outlet_Device_Flow_Type_D="MB"
echo "当前默认网卡 ${Default_Network_Device_Name} 物理速率为: ${Network_Device_Speed} ,实际测试流量下行速率约为: ${Network_Ingress_Device_Flow_Sum_D/.*} ${Network_Outlet_Device_Flow_Type}/s,上行速率约为: ${Network_Outlet_Device_Flow_Sum_D/.*} ${Network_Outlet_Device_Flow_Type}/s"
echo "当前默认网卡 ${Default_Network_Device_Name} 物理速率为: ${Network_Device_Speed} ,实际测试流量下行格式化速率约为: ${Network_Ingress_Device_Flow_Sum} ${Network_Outlet_Device_Flow_Type_D}/s,出口流量格式化速率约为: ${Network_Outlet_Device_Flow_Sum} ${Network_Outlet_Device_Flow_Type_D}/s"
END

本文标题:[原创]Linux服务器出入口网络带宽速率测速Shell脚本

本文作者:宇宙最帅的男人

本文链接:https://lolicp.com/shell/202108311.html

版权声明:转载或者引用本文内容请注明来源及原作者,本文著作权归作者 (宇宙最帅的男人) 所有。

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

最后修改:2023 年 03 月 31 日
如果觉得我的文章对你有用,请随意赞赏