2011-10-30 50 views
2

我需要質疑11M名稱服務器並找出其中哪些活着。在Java中,我使用異步套接字發送udp-requests,一切正常,直到我嘗試使用多個線程。雖然我使用了高性能的16核羣集,但速度卻成比例地上升,但積極響應急劇下降。 我爲每個線程創建了一個單獨的通道,並且沒有明顯的原因說明發生這種情況的原因。任何人都可以解釋我做錯了什麼,是否可以在線程中使用不同的異步套接字?Java異步套接字多線程性能

這是一些代碼。所以我有很多與ID線程,它的主機列表,他們每個人做到以下幾點:

@Override 
public void run() { 
    DatagramChannel channel = null; 
    try { 
     channel = DatagramChannel.open(); 
     InetSocketAddress isa = new InetSocketAddress(Settings.LOCAL_PORT+id); 
     channel.socket().bind(isa); 
     channel.configureBlocking(false); 
     Selector selector = Selector.open(); 
     channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); 
     ByteBuffer outBuffer = ByteBuffer.wrap(Settings.QUERY); 
     ByteBuffer inBuffer = ByteBuffer.allocate(200); 
     while (true) {   
      selector.select(); 
      Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); 
      while (iterator.hasNext()) {     
       SelectionKey key = iterator.next(); 
       iterator.remove(); 
       if (!key.isValid()) { 
        continue; 
       } 
       if (key.isReadable()) { 
        inBuffer.clear(); 
        channel.receive(inBuffer); 
        inBuffer.flip(); 
        inCounter++; 
        //some analize of response 
        continue; 
       } 
       if (key.isWritable()) { 
        if (outCounter < hosts.size()) { 
         channel.send(outBuffer, new InetSocketAddress(hosts.get(outCounter), Settings.DNS_PORT)); 
         outBuffer.flip(); 
         outCounter++; 
        } 
       } 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (channel != null) 
       try { 
        channel.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       }      
     } 

    } 
} 
+1

我們的心靈能力並不是那麼好。有些代碼可能會有幫助 –

回答

0

由於UDP是一種不可靠的協議,你必須要小心,不要超負荷您的系統或網絡緩衝區否則數據包將丟失。如何做到這一點可能會對許多因素敏感,所以我不會感到驚訝的是,這樣做有點不同可以提高您的回覆率。

您使用UDP Datagrams還是TCP Socket?爲什麼要試圖輪詢一千一百萬個域名服務器?