2011-10-30 6 views
2

私は約11Mのネームサーバーについて質問し、どれが生きているかを知る必要があります。 Javaでは、非同期ソケットを使用してudp-requestsを送信し、複数のスレッドを使用するまではすべてokです。速度は比例して上昇しますが、高性能な16コアクラスタを使用していますが、肯定的な応答は劇的に減少します。 スレッドごとに別々のチャネルを作成し、このような現象が起きる理由が分かりません。誰も私が間違っていることを説明することができますし、スレッドで別の非同期ソケットを使用するのは大丈夫ですか?Java Asyncソケットマルチスレッドのパフォーマンス

ここにいくつかのコードがあります。だから、それらのそれぞれは、次の手順を実行し、私は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データグラムまたはTCPソケットを使用していますか?なぜ1,100万のネームサーバーをポーリングしようとしていますか?

関連する問題