Files
2026-test-labor-02/bash/USAGE.md
2026-06-22 22:38:29 +03:00

332 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Инструкция по использованию скрипта замера скорости интернета
## Описание
`speed_test.sh` — это bash-скрипт для измерения скорости интернет-соединения путём последовательной загрузки файла с указанного URL.
## Требования
Скрипт использует стандартные утилиты, которые обычно предустановлены в большинстве Unix-подобных систем:
- `bash` — командная оболочка
- `curl` — утилита для загрузки данных по URL
- `bc` — калькулятор для вычислений с плавающей точкой
- `awk`, `seq` — стандартные утилиты
### Установка зависимостей (если требуется)
* **Ubuntu/Debian:**
```bash
sudo apt-get install curl bc
```
* **macOS:**
```bash
brew install curl bc
```
* **CentOS/RHEL:**
```bash
sudo yum install curl bc
```
* **Fedora/RHEL:**
```bash
sudo dnf install curl bc
```
* **Windows (через WSL):**
```bash
sudo apt-get install curl bc
```
## Использование
### Базовое использование
```bash
bash speed_test.sh [ОПЦИИ] <URL>
```
Где `<URL>` — адрес файла для загрузки (например, большая картинка или другой файл).
### Опции
- `-n, --count NUM` — Количество запросов для тестирования (по умолчанию: 10)
- `-q, --quiet` — Тихий режим: выводит только скорость в МБ/с (без единиц измерения, просто число)
- `-g, --gzip` — Разрешить HTTP-сжатие (gzip/deflate) для измерения эффективной скорости
- `-c, --no-color` — Отключить цветной вывод (по умолчанию цвета включены)
- `-h, --help` — Показать справку по использованию
### Режимы измерения
#### По умолчанию (без `-g`): Реальная скорость канала
Измеряет **реальную пропускную способность** интернет-канала:
- Отключает HTTP-сжатие (gzip/deflate)
- Показывает, сколько байт реально передаётся по сети
- **Используйте для:** тестирования скорости провайдера, VPN, выбора быстрого сервера
#### С опцией `-g`: Эффективная скорость
Измеряет **эффективную скорость передачи данных**:
- Разрешает серверу использовать HTTP-сжатие
- Показывает, сколько полезных данных получено (после распаковки)
- Может быть в 2-10 раз выше для текстовых данных (HTML, JSON, CSS)
- **Используйте для:** оценки производительности веб-приложений, API
**Тихий режим** особенно полезен для использования в других скриптах, где нужно получить только результат без дополнительного форматирования.
### Примеры
Тест с использованием готового тестового файла selectel.ru (Санкт-Петербург):
```bash
./speed_test.sh https://speedtest.selectel.ru/10MB
```
Там же есть файлы других размеров, например:
- 100MB: `https://speedtest.selectel.ru/100MB`
- 1GB: `https://speedtest.selectel.ru/1GB`
- 10GB: `https://speedtest.selectel.ru/10GB`
## Как работает скрипт
1. **Проверка аргументов**: Скрипт проверяет, что передан URL для тестирования
2. **Серия запросов**: Выполняется 10 последовательных HTTP-запросов к указанному URL
3. **Замер параметров**: Для каждого запроса измеряется:
- Время выполнения (в секундах)
- Объём скачанных данных (в байтах)
- Скорость загрузки (в МБ/с)
4. **Вычисление средних значений**: После завершения всех запросов вычисляются:
- Среднее время запроса
- Общий и средний объём данных
- **Средняя скорость интернет-соединения в МБ/с**
### Вывод скрипта
#### Обычный режим
Скрипт выводит:
- **Цветной заголовок** (можно отключить через `--no-color`)
- Информацию о каждом отдельном запросе с ✓ зелёной галочкой (время, объём, скорость)
- Итоговую статистику:
- Количество выполненных запросов
- Общее и среднее время
- Общий и средний объём данных
- **Среднюю скорость в МБ/с**
#### Тихий режим (`-q` или `--quiet`)
В тихом режиме скрипт выводит **только одно число** — среднюю скорость в МБ/с без единиц измерения.
Это полезно для:
- Использования результата в других скриптах.
- Автоматизации тестирования.
- Сравнения разных серверов, CDN и VPN-подключений.
- Логирования результатов.
Пример:
```bash
$ ./speed_test.sh -q -n 2 https://speedtest.selectel.ru/10MB
2.40
```
### Пример вывода
```text
==============================================
Замер скорости интернета
==============================================
URL: http://speedtest.ftp.otenet.gr/files/test10Mb.db
Количество запросов: 10
==============================================
Запрос 1/10... OK (11.039670s, 10.00 МБ, .90 МБ/с)
Запрос 2/10... OK (127.344702s, 10.00 МБ, .07 МБ/с)
...
Запрос 10/10... OK (3.832720s, 10.00 МБ, 2.60 МБ/с)
==============================================
Результаты измерения
==============================================
Выполнено запросов: 10
Общее время: 192.026102 сек
Среднее время запроса: 19.2026 сек
Общий объём данных: 100.00 МБ
Средний объём на запрос: 10.00 МБ
==============================================
СРЕДНЯЯ СКОРОСТЬ: .52 МБ/с
==============================================
```
## Рекомендации по выбору URL для тестирования
Для точного измерения скорости интернета рекомендуется:
1. **Размер файла**: Используйте файлы размером от 5 МБ до 100 МБ
- Слишком маленькие файлы (< 1 МБ) дадут неточные результаты
- Слишком большие файлы (> 100 МБ) увеличат время тестирования
2. **Стабильный сервер**: Выбирайте серверы с хорошей пропускной способностью
- Speedtest-серверы
- CDN-сервисы (Cloudflare, Akamai)
- Известные хостинги изображений
3. **Географическая близость**: Для более точных результатов выбирайте серверы в вашем регионе
### Рекомендуемые тестовые файлы
**Selectel Speedtest (Россия):**
```bash
# 10 МБ файл (быстро, хорошо для частых тестов)
./speed_test.sh -n 5 https://speedtest.selectel.ru/10MB
# 100 МБ файл (рекомендуется для точных измерений)
./speed_test.sh https://speedtest.selectel.ru/100MB
# 1000 МБ (1 ГБ) файл (для очень стабильных каналов)
./speed_test.sh -n 3 https://speedtest.selectel.ru/1000MB
```
**Примечание:** Для больших файлов (100 МБ+) рекомендуется использовать меньшее количество запросов (2-5) для экономии времени и трафика.
## Устранение неполадок
### Ошибка: "curl: command not found"
**Решение**: Установите curl (см. раздел "Установка зависимостей")
### Ошибка: "bc: command not found"
**Решение**: Установите bc (см. раздел "Установка зависимостей")
### Ошибка: "Не удалось выполнить запрос"
**Возможные причины:**
- Неверный или недоступный URL
- Отсутствие интернет-соединения
- Сервер не отвечает или перегружен
- Файл был удалён
**Решение**: Проверьте URL и подключение к интернету
### Очень низкая скорость
**Возможные причины:**
- Медленный сервер источника
- Проблемы с вашим интернет-соединением
- Высокая загрузка сети
**Решение**: Попробуйте другой URL или проверьте соединение
## Технические детали
### Единицы измерения
- **МБ (мегабайт)** = 1 048 576 байт (1024 × 1024)
- Скрипт измеряет скорость в **МБ/с** (мегабайтах в секунду)
- Это отличается от **Мбит/с** (мегабит в секунду), которые часто используют провайдеры
- **Конверсия**: 1 МБ/с ≈ 8 Мбит/с
### Метод расчёта
Средняя скорость вычисляется как:
```
Средняя скорость = (Общий объём данных в МБ) / (Общее время в секундах)
```
Этот метод даёт более точную картину реальной пропускной способности при последовательных запросах.
### Защита от искажения результатов и режимы измерения
**Проблема с HTTP-сжатием:** Многие веб-серверы используют gzip/deflate сжатие для экономии трафика. Это создаёт две разные метрики скорости:
1. **Реальная скорость канала** — сколько байт фактически передаётся по сети
2. **Эффективная скорость** — сколько полезных данных получено после распаковки
#### Режим по умолчанию: Реальная скорость канала
Без опции `-g` скрипт измеряет **реальную пропускную способность** вашего интернет-канала:
- **Что делает:** Добавляет HTTP-заголовок `Accept-Encoding: identity`
- **Эффект:** Запрещает серверу отправлять сжатые данные
- **Измеряет:** Реальный объём байт, переданных по сети
- **Используйте для:**
- Тестирования скорости интернет-провайдера
- Сравнения VPN-серверов
- Выбора быстрого CDN или зеркала
- Диагностики проблем с каналом
**Пример:**
```bash
./speed_test.sh -n 5 https://speedtest.selectel.ru/10MB
# Результат: 2.5 МБ/с — реальная скорость вашего канала
```
#### Режим с опцией `-g`: Эффективная скорость
С опцией `-g` скрипт измеряет **эффективную скорость** передачи данных:
- **Что делает:** Разрешает серверу использовать gzip/deflate сжатие
- **Эффект:** Сервер сжимает данные перед отправкой, браузер распаковывает
- **Измеряет:** Объём полезных данных после распаковки
- **Может быть выше в 2-10 раз** для текстовых файлов (HTML, JSON, CSS, JS)
- **Используйте для:**
- Оценки производительности веб-приложений
- Тестирования API с JSON-ответами
- Понимания реальной скорости работы сайтов
**Пример:**
```bash
./speed_test.sh -g -n 5 https://www.wikipedia.org/
# Результат: 15.0 МБ/с — эффективная скорость с учётом сжатия
# (реальный канал 2.5 МБ/с, но благодаря gzip получили данных в 6 раз больше)
```
#### Сравнение режимов
Файл `compare_modes.sh` демонстрирует разницу:
```bash
./compare_modes.sh https://example.com/
```
**Типичные результаты:**
- **Бинарные файлы** (изображения, видео, архивы): разницы почти нет
- **Текстовые данные** (HTML, JSON, XML): эффективная скорость в 3-10 раз выше
- **Speedtest-файлы** (специально не сжимаются): режимы дают одинаковый результат
**Вывод:** Используйте режим по умолчанию для честного замера скорости интернета. Используйте `-g` для оценки реальной производительности веб-приложений.
## Модификация скрипта
Вы можете легко изменить параметры в начале скрипта:
```bash
# Изменить количество запросов (по умолчанию 10)
NUM_REQUESTS=20
# Добавить таймаут для curl (например, 30 секунд)
curl --max-time 30 -s -o /dev/null ...
# Использовать другой метод HTTP (по умолчанию GET)
curl -X POST ...
```
## Использование в автоматизации
### Пример: Поиск лучшего сервера
В проекте включён пример скрипта `compare_servers.sh`, который показывает, как использовать тихий режим для сравнения скорости разных серверов:
```bash
./compare_servers.sh
```
Этот скрипт:
1. Тестирует список серверов
2. Использует `speed_test.sh -q` для получения скорости каждого
3. Находит и выводит самый быстрый сервер
Вы можете адаптировать этот пример для:
- Выбора лучшего VPN-сервера
- Тестирования разных CDN
- Мониторинга скорости интернета по расписанию
- Логирования производительности сети
## Лицензия
Скрипт предоставляется "как есть" для образовательных целей.
## Автор: Sergei Erjemin (+Claude Sonnet 4.5 mini через CoPilot)
Создано как решение тестового задания для вакансии "Python-разработчик" в "Интерактивное агентство 'Это Легко'".