@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%.
Никак не могу понять почему.
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 1
Я не обладаю хоть какими то знаниями в питоне, но мне кажется, что потоки надо еще принудительно разнести по ядрам.
Также, учитывайте, что "виртуальные" ядра, как вы выразились, это избыточные элементы логики на физических. Т.о. производительность логических ядер не всегда равна физическим и, как правило, (за исключением редких случаев, например когда поток, выполняемый на физическом ядре, находится в ожидании долгое время), гораздо ниже.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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