2017-02-10 47 views
1

你好同胞Erlangers :)Yaws - socket_closed_remotely

只是另一個Erlang愛好者在這裏玩的語言。我有一個非常簡單的YAWS應用程序模塊,可以在單個客戶端訪問時正常工作。但是,當我嘗試產生多個併發客戶端時,其中一些客戶端開始接收錯誤(即使這些客戶端的數量很低,例如10)。任何想法可能導致它?

龍虎鬥代碼:

APP模塊

out(Arg) -> 
    io:format("got something!\n"), 
    Method = extract_method(Arg), 
    handle(Method, Arg). 

客戶

client(SenderPID) -> 
case httpc:request(
    put, 
    { 
    "http://localhost:8080/storageunit", 
    [], 
    "application/x-www-form-urlencoded", 
    "" 
    }, [], []) of 
    { error, Reason } -> io:format("Server responded with an error: ~p.\n", [Reason]); 
    { ok, _ } -> ok 
    end, 
    SenderPID ! 'FINISHED'. 

client_spawner(_SenderPID, 0) -> io:format("Done.\n"); 
client_spawner(SenderPID, Times) -> 
    spawn(concurrent, client, [SenderPID]), 
    client_spawner(SenderPID, Times - 1). 

我得到的錯誤:

Server responded with an error: socket_closed_remotely.

信息的最後一條是:

  • 10個併發客戶端 - 從2到5個錯誤,平均
  • 100-100000併發客戶端 - 平均

我想50級%的錯誤我處理代碼導致它,但在客戶端收到httpc錯誤的情況下,服務器甚至不會對「有東西!」做出反應。

我確定我錯過了一些微不足道的東西,你能幫忙嗎?

問候, 彼得

+2

如果沒有更多關於服務器端處理/ 2的詳細信息,很難回答這個問題。我建議檢查Yaws日誌,看看有沒有相關的。此外,請確保您的Yaws收聽積壓設置足夠高,以確保您正在嘗試的內容,並確保適當地設置客戶端和服務器的文件描述符的最大數量。 –

+0

謝謝。看,問題是句柄/ 2甚至沒有被調用。我在github上讀過某處(某些回購中的一些舊問題),認爲它可能是由inets使用的配置文件造成的。我計劃探索一下。 –

+0

是的,剛剛確認。即使我完全將句柄/ 2排除在外,我仍然遇到同樣的問題。 –

回答

1

一定有什麼問題我最初的代碼。我從頭開始重寫了這個模塊,它給了我預期的結果。下面的代碼:

-module(annoying_client). 
-export([annoy/0, client/1, client_spawner/2]). 

client(SenderPID) -> 
    case httpc:request("http://www.google.com") of 
    { error, Reason } -> io:format("Error. Reason: ~p\n", [Reason]); 
    { ok, _ } -> io:format("ok\n") 
    end, 
    SenderPID ! 'FINISHED'. 

client_spawner(_SenderPID, 0) -> io:format("Done.\n"); 
client_spawner(SenderPID, Times) -> 
    spawn(?MODULE, client, [SenderPID]), 
    client_spawner(SenderPID, Times - 1). 

annoy() -> 
    inets:start(), 

    spawn(?MODULE, client_spawner, [self(), 100]), 
    wait_for_all_jobs(1), 

    inets:stop(), 
    init:stop(). 

wait_for_all_jobs(NumberOfFinishedJobs) -> 
    receive 'FINISHED' -> 
    if 
     NumberOfFinishedJobs < 100 -> 
     wait_for_all_jobs(NumberOfFinishedJobs + 1); 
     true -> 
     io:format("All jobs finished.\n") 
    end 
    end. 

它的工作原理就像兩個魅力:

  • 谷歌
  • 當地香草偏航

GET和看跌期權。當我跨越2000個併發請求的門檻時,問題就開始了,但我猜測這是由本地和遠程獲得的數字來判斷的。在2000年提出請求的情況,我得到大致爲:

  • 6的錯誤,同時要求google.com
  • 500錯誤,同時要求當地偏航

我得到的錯誤:

Error. Reason: socket_closed_remotely 

Error. Reason: {failed_connect,[{to_address,{"www.google.com",80}}, {inet,[inet],system_limit}]} 

DoS保護?配置不正確?無論如何,我對目前的結果感到滿意。可能會嘗試其他Erlang網絡服務器來獲得一些性能數字。

謝謝大家。