私は約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();
}
}
}
}
私たちの精神力はそれほど大きくありません。いくつかのコードが役に立ちます。 –