Скорость трансграничных соединений

  • #it

В последнее время заметил проблемы со скоростью отдельных соединений до заграничных серверов по вечерам (часовой пояс Самары - UTC +4). Заметил, что проблемы обычно начинаются в "прайм-тайм" - когда люди в европейской части России активно пользуются интернетом.

В моменты замедления как speedtest, так и iperf показывают снижение скорости до разных европейских серверов (иногда только speedtest). Можно заметить снижение юзабельности сайтов.

Решил написать простенький скрипт на Python, который скачивает один и тот же файл с установленной периодичностью и заносит данные в CSV файл.

import argparse
import csv
import datetime

import warnings
warnings.filterwarnings("ignore")

import requests

from time import sleep


parser = argparse.ArgumentParser(prog='Periodic DL perf test', description='Tests network performance by downloading file from specified URL')

parser.add_argument('url')

parser.add_argument('-t', '--interval', help='Interval between tests in minutes (may be float or int)')
parser.add_argument('-o', '--output', default='log.csv', help='Name of the CSV file for test result logging')
parser.add_argument('-i', '--ignore-ssl', action='store_true', help='If set, SSL certificate errors will be ignored')
args = parser.parse_args()

sleep_interval = int(args.interval) * 60

log_file = open(args.output, 'a')

log_writer = csv.writer(log_file, dialect='excel')

while True:
    start = datetime.datetime.now()
    try:
        length = len(requests.get(args.url, verify=(not args.ignore_ssl)).content)
        end = datetime.datetime.now()
        time_taken = (end - start).total_seconds()
        print('Downloaded ' + str(length) + ' bytes in ' + str(time_taken) + ' seconds')
    except:
        time_taken = -1.0
        print("Failed to download file")
        end = datetime.datetime.now()
        length = -1

    log_writer.writerow([start.strftime("%Y-%m-%d %H:%M:%S"), end.strftime("%Y-%m-%d %H:%M:%S"), time_taken, length])
    log_file.flush()
    interval = max(1.0, sleep_interval - time_taken)
    print("Sleeping", interval, "seconds")
    sleep(interval)

По результатам полного дня измерений построил графики, сопоставив с объемами обмена на MSK-IX:

Графики, сформированные на основе результатов измерений скорости загрузки.

Как видно на картинке, пиковое количество аномалий (длительная загрузка, ошибки загрузки) совпадает с пиковым объемом трафика на MSK-IX. Также среднее время на загрузку файла растет в несколько раз.

В ближайшее время проведу ещё некоторые тесты, которые позволят определить, является ли это замедление следствием перегруженности каналов или проблема в чём-то ещё.

Кажется (но это не точно), вам нравится мой контент. Перейдите в раздел настроек, чтобы подписаться на пуш-уведомления или разрешить сбор аналитических данных, которые позволяют улучшать этот сайт и его содержимое.

Перейти к настройкам