Исследование зависимости производительности файловой системы от размера блока
Заказать уникальную курсовую работу- 34 34 страницы
- 6 + 6 источников
- Добавлена 13.07.2023
- Содержание
- Часть работы
- Список литературы
2 Теория 6
2.1 Обзор систем хранения данных. 6
2.2. Понятие блочных систем. 9
2.3. Область применения блочных систем 10
3 Практика 13
3.1 Определение характеристик системы хранения с помощью утилит. 13
3.2. Реализация фрагмента программного кода для определения характеристик системы хранения 16
3.3. Реализация фрагмента программного кода для определения динамических характеристик доступа к информации при блочном доступе 19
3.4. Построение графиков. 23
Теперь приступим к визуализации результатов и построению графиков зависимостей в соответствии с заданием. 23
Заключение 28
Список использованных источников 29
Приложение А 30
Для этого нам нужно сформировать некую выборку, на основе которой можно делать определенные статистические выводы. num_measurements = 100 # Количество измеренийblock_size = optimal_block_sizeВсе измерения будем сводить в список measurementsmeasurements = []Далее в цикле произведем выбранное количество раз операции чтения данных for _ in range(num_measurements): measurement = sequential_access(block_size)measurements.append(measurement)На основе полученной выборки выведем статистические показатели:mean = np.mean(measurements)std_dev = np.std(measurements)distribution_type = "Нормальное" if std_dev > 0 else "Детерминированное"print("\n===========================================")print("===== Статистическая обработка данных =====")print("===========================================")print(f"Среднее время доступа: {mean:.5f} сек")print(f"Стандартное отклонение: {std_dev:.5f} сек")print(f"Тип распределения: {distribution_type}")Вывод результатов выполнения программыЗапустим программу, получим следующий вывод в консоли:================================================= Вывод информации о диске ====================================================Модель жесткого диска: WDC PC SN530 SDBPNPZ-512G-1036Статус S.M.A.R.T.: OKИнформация о дисках:--------------------Диск: C:\Тип файловой системы: NTFSТочка монтирования: C:\Общий объем диска: 183.26 ГБИспользуется дискового пространства: 93.97 ГБСвободное дисковое пространство: 89.29 ГБПроцент использования диска: 51.3--------------------Диск: D:\Тип файловой системы: NTFSТочка монтирования: D:\Общий объем диска: 292.97 ГБИспользуется дискового пространства: 16.26 ГБСвободное дисковое пространство: 276.71 ГБПроцент использования диска: 5.5========================================================================================= Вывод информации о скорости чтения ==============================================Размер блока: 512 байтВремя последовательного доступа: 0.64854 секВремя обратного доступа: 5.27279 секВремя случайного доступа: 13.62269 сек--------------------Размер блока: 1024 байтВремя последовательного доступа: 0.49182 секВремя обратного доступа: 2.72609 секВремя случайного доступа: 6.80894 сек--------------------Размер блока: 2048 байтВремя последовательного доступа: 0.44037 секВремя обратного доступа: 1.48214 секВремя случайного доступа: 3.31751 сек--------------------Размер блока: 4096 байтВремя последовательного доступа: 0.40028 секВремя обратного доступа: 0.87784 секВремя случайного доступа: 1.61958 сек--------------------Размер блока: 8192 байтВремя последовательного доступа: 0.36756 секВремя обратного доступа: 0.51753 секВремя случайного доступа: 0.77325 сек--------------------Оптимальный размер блока: 8192 байтСреднее время доступа: 0.55278 сек============================================== КПД файловой системы ==============================================КПД: 150.39%================================================ Статистическая обработка данных ================================================Среднее время доступа: 0.35829 секСтандартное отклонение: 0.01043 секТип распределения: НормальноеТакже программа выводит графики зависимостей: Рисунок 8. Вывод графиков с помощью matplotlibЗаключениеВ ходе выполнения курсовой работы были проведены исследования систем хранения информации. Были определены характеристики системы хранения на уровне "железа" с использованием специальных утилит. Также был разработан программный код, реализующий определение характеристик системы хранения и динамических характеристик доступа к информации при блочном доступе.На основе проведенного исследования были получены следующие результаты:Размер блока имеет значительное влияние на время доступа к информации. При увеличении размера блока скорость чтения увеличивается, но до определенного предела. Дальнейшее увеличение размера блока может привести к ухудшению производительности.Эффективность реализации системы хранения зависит от соотношения скорости чтения файловой системы к скорости чтения на уровне "железа". Было установлено, что при определенных размерах блока эффективность может достигать максимального значения.Статистическая обработка данных позволила определить, что время доступа к информации при операции чтения с размером блока 8192 может быть аппроксимировано нормальным распределением с определенными параметрами.На основе полученных результатов можно сделать вывод, что оптимальный размер блока чтения для данной системы хранения информации составляет 8192 байт. Это позволяет достичь наилучшей производительности и эффективности работы системы. Полученные результаты могут быть использованы для оптимизации процесса хранения и доступа к информации на дисковых накопителях.Список использованных источниковСХД (Система хранения данных) [Электронный ресурс]Режим доступа:https://itglobal.com/ru-ru/company/glossary/shd-sistema-hraneniya-dannyh/Блочные системы хранения данных: когда и чем они лучше [Электронный ресурс]Режим доступа:https://itelon.ru/blog/blochnye-sistemy-khraneniya-dannykh-kogda-i-chem-oni-luchshe/Генерация случайных байтов средствами OS [Электронный ресурс] Режим доступа: https://docs-python.ru/standart-library/modul-os-python/generator-sluchajnyh-bajtov-osnove-modulja-os/Функция time() модуля time в Python[Электронный ресурс] Режим доступа:https://docs-python.ru/standart-library/modul-time-python/funktsija-time-modulja-time/Визуализация данных с matplotlib[Электронный ресурс]Режим доступа:https://cpp-python-nsu.inp.nsk.su/textbook/sec4/ch8Визуализация в Python: matplotlib[Электронный ресурс]Режим доступа:https://newtechaudit.ru/vizualizacziya-v-python-matplotlib/Приложение АЛистинг программы importpsutilimportsubprocessimportosimporttimeimportrandomimportmatplotlib.pyplotaspltimportnumpyasnpdefget_disk_info(): # Получение модели и производителя диска с помощью системной командыprint("===========================================")print("====== Вывод информации о диске =========")print("===========================================")print("Модель жесткого диска: ")model_info = subprocess.check_output("wmicdiskdrivegetmodel", shell=True).decode("utf-8").strip()print(model_info) # Получение информации о статусе S.M.A.R.T.print("Статус S.M.A.R.T.: ")smart_info = subprocess.check_output("wmicdiskdrivegetstatus", shell=True).decode("utf-8").strip()print(smart_info)print("Информация о дисках:")disks = psutil.disk_partitions()fordiskindisks:print("--------------------")print("Диск:", disk.device)print("Тип файловой системы:", disk.fstype)print("Точка монтирования:", disk.mountpoint)disk_usage = psutil.disk_usage(disk.mountpoint)print("Общий объем диска:", round(disk_usage.total / 1024**3, 2), "ГБ")print("Используется дискового пространства:", round(disk_usage.used / 1024**3, 2), "ГБ")print("Свободное дисковое пространство:", round(disk_usage.free / 1024**3, 2), "ГБ")print("Процент использования диска:", disk_usage.percent)print("===========================================")# Вывод характеристикget_disk_info()print("\n===========================================")print("=== Выводинформацииоскоростичтения ===")print("===========================================")block_sizes = [512, 1024, 2048, 4096, 8192] # Размерыблоковдляпроверкиfile_size = max(block_sizes) * 100000 # Размерфайлавбайтах (100000 блоков)# Созданиефайлаwith open('test_file.bin', 'wb') as file:file.write(os.urandom(file_size))# Чтениефайлапоследовательносуказаннымразмеромблокаdef sequential_access(block_size):start_time = time.time() with open('test_file.bin', 'rb') as file: while True: data = file.read(block_size) if not data: breakend_time = time.time() return end_time - start_time# Чтениефайлавобратномпорядкесуказаннымразмеромблокаdef reverse_access(block_size):start_time = time.time() with open('test_file.bin', 'rb') as file: offset = file_size - block_size while offset >= 0:file.seek(offset) data = file.read(block_size) offset -= block_sizeend_time = time.time() return end_time - start_time# Чтениефайлавслучайномпорядкесуказаннымразмеромблокаdef random_access(block_size):start_time = time.time() with open('test_file.bin', 'rb') as file: blocks = file_size // block_sizerandom_blocks = random.sample(range(blocks), blocks) for block in random_blocks: offset = block * block_sizefile.seek(offset) data = file.read(block_size)end_time = time.time() return end_time - start_time# Измерениевременивыполнениядлякаждогоразмераблокаsequential_times = []reverse_times = []random_times = []average_results = []for block_size in block_sizes: print(f"Размерблока: {block_size} байт") # Замервременидляпоследовательногодоступаsequential_time = sequential_access(block_size)sequential_times.append(sequential_time) print(f"Времяпоследовательногодоступа: {sequential_time:.5f} сек") # Замервременидляобратногодоступаreverse_time = reverse_access(block_size)reverse_times.append(reverse_time) print(f"Времяобратногодоступа: {reverse_time:.5f} сек") # Замервременидляслучайногодоступаrandom_time = random_access(block_size)random_times.append(random_time) print(f"Времяслучайногодоступа: {random_time:.5f} сек")average_time = (sequential_time + reverse_time + random_time) / 3average_results.append((block_size, average_time)) print("--------------------")# Выбороптимальногоразмераблокаoptimal_block_size = min(average_results, key=lambda x: x[1])[0]optimal_time = min(average_results, key=lambda x: x[1])[1]# Выводинформацииобоптимальномразмереблокаprint(f"Оптимальныйразмерблока: {optimal_block_size} байт")print(f"Среднеевремядоступа: {optimal_time:.5f} сек")# Построениефигурыдля 2 графиковfig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)# Графиквременидоступаexecution_times = [result[1] for result in average_results]ax1.plot(block_sizes, sequential_times, marker='o', label='Последовательныйдоступ')ax1.plot(block_sizes, reverse_times, marker='o', label='Обратныйдоступ')ax1.plot(block_sizes, random_times, marker='o', label='Случайныйдоступ')ax1.plot(block_sizes, execution_times, marker='o', label='Среднее')#Добавлениелегендыax1.legend()# Подписиосейизаголовокax1.set_ylabel('Времядоступа (сек)')ax1.set_title('Зависимостьвременидоступаотразмераблока')# Графикэффективностиhardware_speed = sequential_timeefficiency_values = [time / hardware_speed for time in execution_times]sequential_efficiency = [time / hardware_speed for time in sequential_times]reverse_efficiency = [time / hardware_speed for time in reverse_times]random_efficiency = [time / hardware_speed for time in random_times]ax2.plot(block_sizes, sequential_efficiency, marker='o', label='Последовательныйдоступ')ax2.plot(block_sizes, reverse_efficiency, marker='o', label='Обратныйдоступ')ax2.plot(block_sizes, random_efficiency, marker='o', label='Случайныйдоступ')ax2.plot(block_sizes, efficiency_values, marker='o', label='Среднее')ax2.set_xlabel('Размерблока (байт)')ax2.set_ylabel('Эффективность')ax2.set_title('Зависимостьэффективностиотразмераблока')#Добавлениелегендыax2.legend()# Размещениеподписейосейизаголовканаоднойфигуреplt.tight_layout()# Отображениеграфикаplt.show()# РасчетКПДфайловойсистемыкакотношенияизмереннойпроизводительностикпроизводительности «железа»efficiency = optimal_time / hardware_speedprint("\n===========================================")print("=== КПДфайловойсистемы ===")print("===========================================")print(f"КПД: {efficiency:.2%}")# Статистическаяобработкаданныхпримногократномизмеренииnum_measurements = 100 # Количествоизмеренийblock_size = optimal_block_sizemeasurements = []for _ in range(num_measurements): measurement = sequential_access(block_size)measurements.append(measurement)mean = np.mean(measurements)std_dev = np.std(measurements)distribution_type = "Нормальное" if std_dev > 0 else "Детерминированное"print("\n===========================================")print("===== Статистическаяобработкаданных =====")print("===========================================")print(f"Среднеевремядоступа: {mean:.5f} сек")print(f"Стандартноеотклонение: {std_dev:.5f} сек")print(f"Типраспределения: {distribution_type}")
2) Блочные системы хранения данных: когда и чем они лучше [Электронный ресурс] Режим доступа: https://itelon.ru/blog/blochnye-sistemy-khraneniya-dannykh-kogda-i-chem-oni-luchshe/
3) Генерация случайных байтов средствами OS [Электронный ресурс] Режим доступа: https://docs-python.ru/standart-library/modul-os-python/generator-sluchajnyh-bajtov-osnove-modulja-os/
4) Функция time() модуля time в Python [Электронный ресурс] Режим доступа: https://docs-python.ru/standart-library/modul-time-python/funktsija-time-modulja-time/
5) Визуализация данных с matplotlib [Электронный ресурс] Режим доступа: https://cpp-python-nsu.inp.nsk.su/textbook/sec4/ch8
6) Визуализация в Python: matplotlib [Электронный ресурс] Режим доступа: https://newtechaudit.ru/vizualizacziya-v-python-matplotlib/