На начальном этапе код работает хорошо, и Flask API успешно выполняется, когда я отправляю запрос на изменение пропускной способности для конкретного клиента. Однако, несмотря на правильное выполнение HTTP-запроса, я не вижу ожидаемого изменения пропускной способности в журналах мониторинга, где пропускная способность должна быть ограничена указанным значением (например, 30 Мбит/с).
Вот краткое описание настройки:
- Сеть Mininet: сервер, маршрутизатор и два клиента.
- Flask API: позволяет настраивать пользовательскую пропускную способность для каждого клиента через
/api/set_bandwidth. - Мониторинг: запуск iperf для мониторинга пропускной способности между клиентами и
серверу каждые 5 секунд. - Контроль пропускной способности: использование tc (управление трафиком Linux) для установки ограничения скорости TBF
для каждого канала.
< /ul>
Пример вызова API:
Я отправляю запрос POST на /api/set_bandwidth со следующей полезной нагрузкой:Соответствующие фрагменты кода:Код: Выделить всё
{ "client": "client1", "bandwidth": 30 }
- API Flask для настройки пропускной способности:< /p>
Настройка пользовательской пропускной способности с помощью tc:
Код: Выделить всё
@app.route("/api/set_bandwidth", methods=["POST"]) def set_bandwidth(): data = request.json client = data.get("client") bandwidth = data.get("bandwidth") if client not in links: return jsonify({"status": "error", "message": "Client not found", "links": list(links.keys())}) link = links[client] client_iface = f"{client}-eth0" router_iface = f"router-eth{1 if client == 'client1' else 2}" setCustomBandwidth(link, bandwidth, client_iface, router_iface) return jsonify({"status": "success"})
Код: Выделить всё
def setCustomBandwidth(link, bw, client_iface, router_iface):
def configure_tc(node, iface, bw):
node.cmd(f"tc qdisc replace dev {iface} root tbf rate {bw}mbit burst 10kb latency 50ms")
configure_tc(link.intf1.node, client_iface, bw)
configure_tc(link.intf2.node, router_iface, bw)
Код: Выделить всё
def monitorBandwidth(client, server, interval=5):
while True:
result = client.cmd(f"iperf -c {server.IP()} -t 1")
bandwidth = re.search(r"(\d+\.\d+)\sMbits/sec", result)
if bandwidth:
bw_value = float(bandwidth.group(1))
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
insert_bandwidth_data(client.name, client.IP(), bw_value, timestamp)
time.sleep(interval)
Ожидаемое поведение:
Когда я устанавливаю пропускную способность 30 Мбит/с через HTTP-запросе мониторинг должен отражать, что пропускная способность клиента не превышает 30 Мбит/с. Однако пропускная способность остается неизменной.
Мой вопрос:
Почему ограничение пропускной способности не применяется динамически при настройке пропускной способности через API? даже если HTTP-запрос выполняется успешно? Я что-то упускаю из того, как tc применяет изменения пропускной способности, или мне нужна дополнительная настройка в Mininet?
Подробнее здесь: https://stackoverflow.com/questions/791 ... -flask-api