fbpx

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

206 просмотра
0
0 Комментариев

Мне нужно было написать свою реализацию 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

[/apcode]

Также программа при 1 процессе использует его на 100%, а при 2х и более использует их на 60%.
Никак не могу понять почему.

Процессор: Intel CORE I5 (2 физических, 2 виртуальных ядра)


Добавить комментарий

0 Answers

Python Опубликовано 20.03.2019
Напишите свой ответ на данный вопрос.
Scroll Up