Программа написана в качестве тестового задания в Yadro Импульс 2025, позиция Сис. Админ
Эта программа (точнее набор программ) предоставляет механизм для параллельного запуска нескольких однопоточных тестов sysbench cpu, агрегирования результатов и генерации итогового отчета и графика производительности. Основная цель — симулировать многопоточную нагрузку на CPU с помощью независимых экземпляров sysbench и визуализировать их производительность во времени.
- Одновременный запуск указанного числа экземпляров
sysbench cpu - Каждый экземпляр
sysbenchработает в однопоточном режиме (--threads=1) - Попытка запуска экземпляров
sysbenchс максимальным приоритетом планировщика (nice -n -20) для оптимального распределения ресурсов (!!требует привилегий root!!) - Настраиваемое количество параллельных экземпляров и длительность теста через аргументы командной строки.
- Сбор всех логов в единый файл.
- Автоматический парсинг лог-файла для извлечения промежуточных и итоговых данных о количестве Событий В Секунду (EPS).
- Генерация CSV отчета, суммирующего результаты EPS по времени для каждого экземпляра.
- Создание PNG-графика, визуализирующего производительность каждого экземпляра в течение времени теста.
- Автоматическое создание резервных копий существующих файлов результатов (
.log,.csv,.png) предыдущих запусков путем добавления числовых суффиксов (.1,.2и т.д.).
sysbench:nicepythonpandasиmatplotlib- Доступ
sudo: Необходим для запуска основного скрипта бенчмарка (benchmark.sh), так как он пытается использоватьnice -n -20для повышения приоритета.
Запуск через скрипт benchmark.sh. Он управляет выполнением вспомогательных Python-скриптов.
sudo ./benchmark.sh <num_threads> <time_seconds>пример:
sudo ./benchmark.sh 4 120 - 4 потока на 120 секунд<num_threads>(Обязательный): Положительное целое число, указывающее количество параллельных экземпляровsysbenchдля запуска.<time_seconds>(Обязательный): Положительное целое число, указывающее длительность (в секундах), в течение которой должен работать каждый экземпляр тестаsysbench.
Скрипт benchmark.sh выполняет следующие шаги последовательно:
- Разбор аргументов: Проверяет обязательные аргументы
<num_threads>и<time_seconds>. - Резервное копирование: Проверяет наличие существующих файлов вывода (
sysbench_cpu_report.log,report.csv,graph.png) и переименовывает их, добавляя следующий доступный числовой суффикс (например,report.csv.1,report.csv.2), чтобы предотвратить перезапись. - Запуск
main.py: Выполняет основной Python-скрипт с помощьюsudo. Этот скрипт запускает<num_threads>параллельных процессовsysbench, пытается установить их приоритет с помощьюniceи собирает их объединенный вывод вsysbench_cpu_report.log. - Запуск
parser.py: Выполняет скрипт-парсер. Он читаетsysbench_cpu_report.log(по умолчанию) и генерируетreport.csv, содержащий разобранные данные EPS. - Запуск
graph.py: Выполняет скрипт для построения графика. Он читаетreport.csv(по умолчанию) и генерируетgraph.png, визуализируя данные EPS во времени.
sysbench_cpu_report.log: Содержит необработанные, объединенные потоки стандартного вывода и стандартных ошибок всех выполненных экземпляровsysbench.report.csv: CSV-файл со строкой заголовка. Первая колонка содержит временные точки ('5s', '10s', ..., 'Final_Avg_EPS'). Последующие колонки ('Instance_0', 'Instance_1', ...) содержат соответствующие значения EPS для каждого экземпляраsysbenchв данный момент времени или итоговое среднее значение EPS.graph.png: Изображение в формате PNG, отображающее значения EPS (ось Y) в зависимости от времени в секундах (ось X) для каждого экземпляраsysbench.*.log.N,*.csv.N,*.png.N: Файлы резервных копий, созданные из предыдущих запусков, гдеN— целое число (1, 2, 3,...).
- Запуск
benchmark.shсsudoнеобходим для того, чтобы командаnice -n -20внутриmain.pyуспешно повысила приоритет процессовsysbench. Безsudo,niceможет завершиться без сообщения об ошибке или запуститьsysbenchс приоритетом по умолчанию. - Вспомогательные Python-скрипты (
parser.py,graph.py) при вызове изbenchmark.shполагаются на имена файлов ввода/вывода по умолчанию (sysbench_cpu_report.log,report.csv,graph.png), хотя они сохраняют возможность принимать имена файлов через аргументы при автономном запуске.
