학습 목적으로 Erlang에 간단한 TCP 프록시를 작성했습니다. 그것은 작동하지만 나는 많은 동시 요청을 만들기 위해 ab (Apache Bench)를 사용할 때 이상한 성능 저하를 경험합니다. 그 자체가 성능 하락 자체가 아니라 나를 경이롭게 만듭니다. 백엔드는 웹 서버로서 nginx입니다. 내 프록시가 ab와 nginx 사이에 앉아있다.얼랭 (Erlang) TCP 프록시가 많은 동시 요청을 받았을 때 성능이 그렇게 떨어지는 이유는 무엇입니까?
이것은 내 프록시 코드입니다. 내 프록시에서 64 개 연속 요청을 발사
-module(proxy).
-export([start/3]).
start(InPort, OutHost, OutPort) ->
{ok, Listen} = gen_tcp:listen(InPort, [binary, {packet, 0}, {active, once}]),
spawn(fun() -> connect(Listen, OutHost, OutPort) end).
connect(Listen, OutHost, OutPort) ->
{ok, Client} = gen_tcp:accept(Listen),
spawn(fun() -> connect(Listen, OutHost, OutPort) end),
{ok, Server} = gen_tcp:connect(OutHost, OutPort, [binary, {packet, 0}, {active, once}]),
loop(Client, Server).
loop(Client, Server) ->
receive
{tcp, Client, Data} ->
gen_tcp:send(Server, Data),
inet:setopts(Client, [{active, once}]),
loop(Client, Server);
{tcp, Server, Data} ->
gen_tcp:send(Client, Data),
inet:setopts(Server, [{active, once}]),
loop(Client, Server);
{tcp_closed, _} ->
ok
end.
나는 아주 좋은 결과를 얻을.
ab -n 64 127.0.0.1:80/
Concurrency Level: 1
Time taken for tests: 0.097 seconds
Complete requests: 64
Failed requests: 0
Write errors: 0
Total transferred: 23168 bytes
HTML transferred: 9664 bytes
Requests per second: 659.79 [#/sec] (mean)
Time per request: 1.516 [ms] (mean)
Time per request: 1.516 [ms] (mean, across all concurrent requests)
Transfer rate: 233.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 1
Processing: 1 1 0.5 1 2
Waiting: 0 1 0.4 1 2
Total: 1 1 0.5 1 2
Percentage of the requests served within a certain time (ms)
50% 1
66% 2
75% 2
80% 2
90% 2
95% 2
98% 2
99% 2
100% 2 (longest request)
nginx에 대해 Apache Bench를 직접 사용하는 것보다 약간 느립니다.
하지만 프록시에서 64 개 동시 요청을 발사 성능은
ab -n 64 -c 64 127.0.0.1:80/
Concurrency Level: 64
Time taken for tests: 2.011 seconds
Complete requests: 64
Failed requests: 0
Write errors: 0
Total transferred: 23168 bytes
HTML transferred: 9664 bytes
Requests per second: 31.82 [#/sec] (mean)
Time per request: 2011.000 [ms] (mean)
Time per request: 31.422 [ms] (mean, across all concurrent requests)
Transfer rate: 11.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 31 121.7 0 501
Processing: 3 1135 714.4 1001 2006
Waiting: 3 1134 714.3 1000 2005
Total: 3 1167 707.8 1001 2006
Percentage of the requests served within a certain time (ms)
50% 1001
66% 1502
75% 2003
80% 2004
90% 2005
95% 2005
98% 2005
99% 2006
100% 2006 (longest request)
/문제가 어디에서 무엇 미친 떨어? 낮은 성능을 기대했지만 왜 이렇게 많이 했습니까? 초당 요청을보십시오!
많은 수고 보인 것 같지 않습니다. 나는 + A를 사용하여 많은 스레드를 사용합니다. 나는 심지어 SMP를 시도했지만 결과는 거의 동일합니다.
제 설정 : Windows 7 64, Intel QuadCore, 8GB RAM. 우분투에서 128 개의 동시 요청을 사용하여 비슷한 결과를 얻었습니다.
편집 : 새로운 통찰력이 포함됩니다. 총 요청 수는 중요하지 않습니다. 동시 요청 수입니다.
코드없이 도움을 하드 조금씩처럼, 더 높은 값으로 시도해야 추측, 5입니다. 우리가 알고있는 모든 것에 대해 당신은 모든 것을 순차적으로 썼습니다. –
@Matt : 더 많은 코드가 필요합니까? :) 코드를보세요. 순차적이지 않습니다. –
죄송합니다. Jan, 전에 코드를 보지 못했습니다! –