netcup的vps服务器现在的限速策略是:过去24小时总流量(上+下)超过2T,则限速为200M。
第一个想法就是,检测过去23小时,根据过去23小时的总流量数,限制接下来一小时的流量数。
以下是gpt的回答:
要在Debian系统中实现这个需求,可以通过以下步骤来设置一个定时任务,每小时统计过去23小时的流量,并根据统计结果调整限速,确保未来一小时的总流量不超过1.8TB。
步骤 1: 安装必要的工具
首先,确保安装了vnstat来监控流量,以及tc来进行流量控制。可以使用以下命令安装:
sudo apt update
sudo apt install vnstat iproute2步骤 2: 配置vnstat
vnstat会自动开始监控网络流量。你可以使用以下命令查看流量统计:
vnstat -h步骤 3: 编写流量统计和限速脚本
创建一个脚本来统计流量并设置限速。例如,创建一个名为bandwidth_control.sh的脚本:
#!/bin/bash
# 网络接口名称(例如 eth0)
INTERFACE="eth0"
# 获取过去23小时的流量(以字节为单位)
TRAFFIC=$(vnstat --json h | jq ".interfaces[0].traffic.hour[].tx + .interfaces[0].traffic.hour[].rx" | tail -n 23 | paste -sd+ | bc)
# 将流量转换为TB
TRAFFIC_TB=$(echo "scale=2; $TRAFFIC / (1024^4)" | bc)
# 检查流量是否超限(1.8TB)
LIMIT=1.8
if (( $(echo "$TRAFFIC_TB >= $LIMIT" | bc -l) )); then
# 设置限速(例如,限制为100Mbps)
tc qdisc add dev $INTERFACE root tbf rate 100mbit burst 32kbit latency 400ms
else
# 移除限速
tc qdisc del dev $INTERFACE root
fi确保脚本具有可执行权限:
chmod +x bandwidth_control.sh步骤 4: 设置定时任务
使用cron每小时运行这个脚本。编辑crontab:
crontab -e添加以下行以每小时执行一次脚本:
0 * * * * /path/to/bandwidth_control.sh确保将/path/to/bandwidth_control.sh替换为实际脚本的路径。
注意事项
- 限速配置:调整脚本中的流量限制和限速参数(如
rate)以适应你的具体需求。 - 网络接口:确保脚本中的
INTERFACE变量设置为你的实际网络接口名称。 - 权限:确保脚本和
cron任务有足够的权限来执行流量监控和限速操作。
通过这些步骤,你可以实现每小时统计流量并根据需要进行限速的功能。
vnstat -h
eth0: Not enough data available yet解决办法:
https://sobaigu.com/vnstat-eth0-not-enough-data-available-yet.html
{/card-list-item}
{card-list-item}
出现的第二个问题:
-bash: jq: command not found
-bash: bc: command not found解决办法:
将之前的安装命令修改为:
sudo apt update
sudo apt install vnstat iproute2 jq bc{/card-list-item}
{card-list-item}
出现的第三个问题:
就是过去23小时指的是哪23小时,是按照到上一个整点的23小时,还是统计了到现在的流量数。
经过测试,指的是当前小时到目前为止的流量数+过去22小时的流量数。因此实际使用的时候,为了避免误差,应该使用每五分钟条目进行计算。
# 获取过去23小时的流量(以字节为单位)
TRAFFIC=$(vnstat --json h | jq ".interfaces[0].traffic.hour[].tx + .interfaces[0].traffic.hour[].rx" | tail -n 23 | paste -sd+ | bc)
# 修改为
# 获取过去276个5分钟的流量(以字节为单位)
TRAFFIC=$(vnstat --json f | jq ".interfaces[0].traffic.fiveminute[].tx + .interfaces[0].traffic.fiveminute[].rx" | tail -n 277 | paste -sd+ | bc){/card-list-item}
{card-list-item}
出现的第四个问题:
关于vnstat.conf参数,需要修改两个,BandwidthDetection和MaxBandwidth。这两项会导致速率超过一定时不统计,改为0关掉,重启服务既可。
systemctl restart nginx{/card-list-item}
新问题:该方法只能取得json最后若干行,如果已有行数少于需要取得的行数,就会导致数据出错。
询问GPT:
你可以通过以下步骤来获取 JSON 数据中的小时数,并根据具体情况进行处理,确保不会尝试读取超过实际存在的小时数。
首先,获取 JSON 数据中的小时数:
HOUR_COUNT=$(vnstat --json h | jq ".interfaces[0].traffic.hour | length")这样可以获得 JSON 数据中实际的小时数。然后,你可以根据这个小时数来决定要读取多少行数据。确保只读取存在的行数,避免超出范围:
# 确定要读取的小时数,最多不超过23小时
READ_HOURS=$((HOUR_COUNT < 23 ? HOUR_COUNT : 23))
# 计算流量
TRAFFIC=$(vnstat --json h | jq ".interfaces[0].traffic.hour[].tx + .interfaces[0].traffic.hour[].rx" | tail -n "$READ_HOURS" | paste -sd+ | bc)这样,代码会根据实际的小时数决定要读取的行数,确保不会读取到错误的数据。
评论