Задать вопрос
@MrKrot

Почему в моей реализации prefork сервера, с увеличением количества форкнутых процессов RPS падает?

Мне нужно было написать свою реализацию prefork сервера:
import os
import socket

class WebServer:
    pids = []

    def __init__(self, n_cpu, address, listeners, buffer, handler):
        self.cpu_count = n_cpu
        self.address = address
        self.listeners = listeners
        self.buffer = buffer
        self.handler = handler
        self.server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

    def exec(self):
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server.bind(self.address)
        self.server.listen(self.listeners)
        for i in range(self.cpu_count):
            pid = os.fork()

            if pid != 0:
                self.pids.append(pid)
            else:
                print("Created worker PID: {}".format(os.getpid()))
                while True:
                    client, client_addr = self.server.accept()
                    request = client.recv(self.buffer)
                    if len(request.strip()) == 0:
                        client.close()
                        continue

                    response = self.handler.handle(request)

                    client.send(response.build())
                    client.close()

        self.server.close()

        for pid in self.pids:
            os.waitpid(pid, 0)

Также можете посмотреть на гитхабе: https://github.com/kiryanenko/TP-Highload/tree/1.0

При AB тестировании обнаружил печальный факт, что с увеличением количества форкнутых процессов RPS падает:
n_cpu | RPS
-------------
1     | 3301
2     | 2140
3     | 1762
4     | 1709

Также программа при 1 процессе использует его на 100%, а при 2х и более использует их на 60%.
Никак не могу понять почему.
  • Вопрос задан
  • 146 просмотров
Подписаться 2 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
Я не обладаю хоть какими то знаниями в питоне, но мне кажется, что потоки надо еще принудительно разнести по ядрам.
Также, учитывайте, что "виртуальные" ядра, как вы выразились, это избыточные элементы логики на физических. Т.о. производительность логических ядер не всегда равна физическим и, как правило, (за исключением редких случаев, например когда поток, выполняемый на физическом ядре, находится в ожидании долгое время), гораздо ниже.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы