1 Commits

Author SHA1 Message Date
e8b7c46d06 lab6 2023-12-18 12:24:48 +03:00
7 changed files with 39 additions and 91 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,30 +0,0 @@
# Отчет по лабораторной работе №6
Выполнил студент гр. ИСЭбд-41 Казаков Е.В.
## Создание приложения
Выбрал язык Pythone.
Приложение на вход получает кол-во поток, далее у нас происходит последовательный расчет детерминанта. После чего выводит всё в консоль
![](1.png)
## Бенчмарки
Протестируем обычный и параллельный алгоритм матрицах 100х100, 300х300 и 500х500.
Матрицы 100х100
![](2.png)
Матрицы 300х300
![](3.png)
Матрицы 500х500
![](4.png)
Вывод: Чем больше у нас кол-во данных, тем разница между параллельным и последовательных становится меньше Как видно из скриншотов для матрицы 500x500 параллельный алгоритм завершил быстрее чем, последовательный.

View File

@@ -1,61 +0,0 @@
import numpy as np
import time
from multiprocessing import Pool
def determinant(matrix):
return np.linalg.det(matrix)
def parallel_determinant(matrix, num_threads):
size = matrix.shape[0]
step = size // num_threads
pool = Pool(processes=num_threads)
blocks = []
for i in range(0, size, step):
blocks.append(matrix[i:i+step, i:i+step])
dets = pool.map(determinant, blocks)
return np.prod(dets)
def benchmark(num_threads):
matrix1 = np.random.rand(100, 100)
start_time = time.time()
det1 = determinant(matrix1)
end_time = time.time()
execution_time = end_time - start_time
print("Матрица 100x100:", matrix1)
print("Детерминант матрицы 100x100:", det1)
print("Последовательное время выполнения:", execution_time, "сек")
start_time = time.time()
detp1 = parallel_determinant(matrix1, num_threads)
end_time = time.time()
execution_time = end_time - start_time
print("Пареллельное время выполнения:", execution_time, "сек")
matrix2 = np.random.rand(300, 300)
start_time = time.time()
det2 = determinant(matrix2)
end_time = time.time()
execution_time = end_time - start_time
print("Матрица 300x300:", matrix2)
print("Детерминант матрицы 300x300:", det2)
print("Последовательное время выполнения:", execution_time, "сек")
start_time = time.time()
detp2 = parallel_determinant(matrix2, num_threads)
end_time = time.time()
execution_time = end_time - start_time
print("Пареллельное время выполнения:", execution_time, "сек")
matrix3 = np.random.rand(500, 500)
det3 = determinant(matrix3)
end_time = time.time()
execution_time = end_time - start_time
print("Матрица 500x500:", matrix3)
print("Детерминант матрицы 500x500:", det3)
print("Последовательное время выполнения:", execution_time, "сек")
start_time = time.time()
detp3 = parallel_determinant(matrix3, num_threads)
end_time = time.time()
execution_time = end_time - start_time
print("Пареллельное время выполнения:", execution_time, "сек")
if __name__ == "__main__":
print("Введите кол-во поток")
n = int(input())
benchmark(n)

View File

@@ -0,0 +1,39 @@
# Отчет по лабораторной работе №7
Выполнил студент гр. ИСЭбд-41 Казаков Е.В.
## Вопросы
Написать небольшое эссе (буквально несколько абзацев) своими словами. А помогут Вам в этом вопросы из списка:
1.Какие алгоритмы и методы используются для балансировки нагрузки?
2.Какие открытые технологии существуют для балансировки нагрузки?
3.Как осуществляется балансировка нагрузки на базах данных?
4.Реверс-прокси как один из элементов балансировки нагрузки.
## Эссе
1. Алгоритмы и методы балансировки нагрузки
- Раунд-робин: Запросы распределяются между серверами в равных долях, каждый сервер получает запрос в порядке очереди.
- Взвешенный раунд-робин: Запросы распределяются между серверами с учетом их пропускной способности или нагрузки, чтобы более мощные серверы получали больше запросов.
- IP хэширование: Используется IP-адрес клиента для распределения запросов. Каждый клиент получает один и тот же сервер при повторном обращении.
- Алгоритмы предсказывающего анализа: Используются статистические данные и анализ прошлых запросов для предсказания оптимального распределения нагрузки.
2. Открытые технологии балансировки нагрузки
- Nginx: Легкий веб-сервер, способный работать как прокси-сервер и балансировщик нагрузки.
- HAProxy: Балансировщик нагрузки с открытым исходным кодом, специализирующийся на высокой доступности и производительности.
- Apache HTTP Server с модулем mod_proxy_balancer: Популярный веб-сервер, позволяющий выполнить балансировку нагрузки с помощью модуля mod_proxy_balancer.
- Microsoft Network Load Balancing (NLB): Решение для балансировки нагрузки в среде Windows, встроенное в ОС Windows Server.
3. Балансировка нагрузки на базах данных
Балансировка нагрузки на базах данных может быть достигнута с использованием следующих методов:
- Репликация: Создание дубликатов баз данных для распределения нагрузки между серверами.
- Шардинг: Разбиение данных на отдельные серверы, каждый из которых отвечает за определенную часть информации.
- Кластеризация: Совместное использование ресурсов нескольких серверов для достижения более высокой производительности и отказоустойчивости.
4. Реверс-прокси как один из элементов балансировки нагрузки
Реверс-прокси является компонентом, который обрабатывает входящие запросы от клиентов и перенаправляет их на соответствующие серверы. Он может быть сконфигурирован для выполнения балансировки нагрузки, решая такие задачи, как:
- Распределение запросов между несколькими серверами.
- Мониторинг состояния серверов и исключение недоступных серверов из пула.
- Кеширование ответов для улучшения производительности.