У меня проблема с тестированием веб-сервера 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.