0

私は2台のマシン(Intel Atom(TM)CPU D525)を持っており、それぞれが異なるOS(1つのWindows 7と1つのubuntu 10.04)を実行しています。

Windows 7 マシンから Ubuntu マシンにイメージのスタックを送信したいと考えています。

私は今それを行うためにマルチスレッドを使用しています。私は以下のコードを添付しました:

public class RshScp implements Runnable
{

private StreamHandlers streamHandlers = new StreamHandlers(); 
private String screenFileName;
private int clientIndex;
private SingletonServer ss = null;

public RshScp(String screenFileName, int clientIndex, SingletonServer ss)
{
    this.screenFileName = screenFileName;
    this.clientIndex = clientIndex;
    this.ss = ss;
} 

public void run()
{
    sendFileToClient();
}

public void sendFileToClient()
{
    try 
    {   
        DisplayClient dc = null;
        dc = ss.getClient(clientIndex);          

        String execution = sshFileRSH(dc.getHostName(), dc.getUserName(), screenFileName, dc.getRemoteDirectory(), dc.getLocalDirectory()); 
        log.write(execution);
        Process p1 = Runtime.getRuntime().exec(execution);              
        InputStreamReader isr = new InputStreamReader(p1.getInputStream());
        streamHandlers.checkStreamOutput("From RshScp", isr);
    } catch(Exception e){}
}

//Function to set the RSH SCP command
private String sshFileRSH(String hostName, String userName, String localFileNames, String remoteDirName, String localJobDirectory)
{
    String fileTransferCommand = "scp " + localFileNames;
    //String fileTransferCommand = "rsync --partial --progress --rsh=ssh " + localFileNames[0] + " " + localFileNames[1] + " " + localFileNames[2];

    String destinationCommand = userName + "@" + hostName + ":" + remoteDirName;

    String executionCommand = "";
     executionCommand = fileTransferCommand + " " + destinationCommand;

    return executionCommand;            
} // end function

}//end while class

ファイルを複数のクライアントに送信しようとすると、速度が遅いことがわかりました。接続してクライアントにファイルを送信するのに 5 秒かかります。また、画像が失われることもあります。

マルチスレッドを遅くする実際に何が起こっているか知っている人はいますか? 接続と送信を高速化できるソリューションはありますか?

4

4 に答える 4

1

ネットワークを介して他のマシンにバイトを実際に送信する興味深いコードが提供されていないため、正確に判断するのは困難です。しかし、これは私が提案するものです:

  • ネットワークの速度を調べて、画像を他のマシンに送信して結果を受け取るまでにかかる時間を調べます
  • そこから、マシン間で処理を分散することが実際に価値があるかどうかを判断します
  • 計算がそれだけの価値があることを示唆している場合は、他のマシンにデータを送信する方法をばかげたナンセンスで過度に複雑にしないでください。
于 2012-05-10T03:36:28.463 に答える
1

マルチスレッドを遅くする実際に何が起こっているか知っている人はいますか? 接続と送信を高速化できるソリューションはありますか?

マコトが言ったように、最初のボトルネックは I/O である可能性が高い

マルチスレッドは、「使用」されていない I/O の「待機」時間がある場合に意味があります。

たとえば、スレッドが I/O アクションで「ブロック」している間にプログラムが実行する作業がある場合、別のスレッドを追加することは理にかなっています。

たとえば、イメージを読み取ってファイルに書き出す場合、「コンシューマ プロデューサー」ジョブで 2 つのスレッドを使用すると、パフォーマンスがわずかに向上する可能性があります (1 つは読み取りとバッファへの書き込み、もう 1 つはバッファからの読み取りとBlockingQueueなどを使用してファイルに書き込みます)

于 2012-05-10T03:36:38.053 に答える
0

The most likely cause of your problem is that your parallel file transfer commands are causing network congestion problems. It sounds like your problems may be compounded by the "buffer bloat" phenomenon.

What can you do about it?

Well the simplest thing would be reduce the number of parallel network connections until the problem goes way. If necessary, do the transfers one at a time.

If you were really keen, you could use a packet sniffer on your network and see if you could spot a problem. But you'd need to know how to interpret the network traffic.

Anyway, the chances are that the problem is just that you are saturating your network link. The only fix for that is to get a faster connection ... or don't try to send as much at the same time.

于 2012-05-10T04:53:26.793 に答える
0

「接続してクライアントにファイルを送信するのに 5 秒かかります」

1つのスレッドでどのくらいの時間がかかりますか?

「そして、それでも画像が失われることがあります」-現在、TCPベースの転送で懸念されています。50 個のスレッドがある場合でも、正しく実装されたシステムでは発生しません。

典型的なシステムでは、転送速度はネットワークによって制限されます (他の多くの人がすでに投稿したように)。マルチスレッド転送は、絶え間なく接続と切断を行うプロトコルを使用して小さなファイルを複数のマシンにコピーする場合に最も効果的です。このような場合、ネットワーク遅延の影響を軽減でき、大幅な高速化が期待できます。

わずか 2 台のマシン間で大きなファイルを転送する場合、接続/切断の待ち時間を回避することによってもたらされる改善は、ハードディスクが複数のファイルへのオーバーラップ書き込みを実行するため、ディスク シークの増加によって圧倒される可能性が非常に高くなります。

まず - 転送を修正してください! 不適切な数のスレッドでもデータが失われることはありません。

于 2012-05-10T07:44:33.697 に答える