Тестирование python сервера разветвленных сокетов с apache bench (ab) зависает по последнему запросу - PullRequest
0 голосов
/ 07 января 2020

У меня проблема с тестированием веб-сервера python, который я написал. Я сделал это с помощью сокетов и разветвления для параллельных запросов

def reapChildren():
  while activeChildren:
    pid, stat = os.waitpid(0, os.WNOHANG)
    if not pid: break
    activeChildren.remove(pid)

while True:
  (clientsocket, address) = sock.accept()
  reapChildren()
  child_pid = os.fork()

  if child_pid == 0:
    req = parseHTTP(clientsocket)
    res = Response(clientsocket)
    handler.handleRequest(req, res)

    clientsocket.close()
    os._exit(0)
  else:
    activeChildren.append(child_pid)

Это работает нормально, если я отправляю запросы, используя curl, но когда я пытаюсь с ab, я испытываю некоторые странные поведения. При запуске теста с 1 одновременным запросом.

ab -n 2 - c 1 localhost: 5000 / test

Принимаются только первые запросы и время ожидания истекло , При выполнении теста с> 1 одновременными запросами все они принимаются, кроме самого последнего. Пример:

ab -n 100 -c 2 localhost:5000/test

This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)...^C

Server Software:        
Server Hostname:        localhost
Server Port:            5000

Document Path:          /test
Document Length:        3 bytes

Concurrency Level:      2
Time taken for tests:   1.748 seconds
Complete requests:      99
Failed requests:        0
Total transferred:      6700 bytes
HTML transferred:       300 bytes
Requests per second:    56.63 [#/sec] (mean)
Time per request:       35.315 [ms] (mean)
Time per request:       17.657 [ms] (mean, across all concurrent requests)
Transfer rate:          3.74 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     1    1   0.4      1       3
Waiting:        1    1   0.3      1       3
Total:          1    1   0.4      1       3

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      2
  95%      2
  98%      3
  99%      3
 100%      3 (longest request)

Здесь я нажал Ctrl + C рано, чтобы не истекло время ожидания. Я видел этот пример сокет-сервера в сети и уже довольно давно пытаюсь заставить его работать. Кажется, все в порядке, может быть, это проблема с ab?

Удаление разветвляющей части заставляет ее работать с ab, но мне нужно использовать fork.

...