0

我有 2 台机器(Intel Atom(TM) CPU D525),每台都运行不同的操作系统(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

有谁知道导致多线程变慢的实际情况?是否有任何解决方案可以使其连接和发送更快?

正如 Makoto 所说,第一个瓶颈很可能是 I/O

多线程在您有“等待”时间的 I/O 未“使用”的情况下是有意义的

例如,如果程序在您的线程“阻塞”I/O 操作时有一些工作要做,那么添加另一个线程可能是有意义的

例如,如果您读取图像并将它们写入文件,如果您在“消费者生产者”作业中使用 2 个线程(一个读取并放入缓冲区,一个从缓冲区读取并写入文件,例如使用BlockingQueue

于 2012-05-10T03:36:38.053 回答
0

'它使用 5 秒连接并将文件发送到客户端'

一根线需要多长时间?

“有时它仍然会丢失图像”——现在这对任何基于 TCP 的传输都令人担忧。即使您有 50 个线程,它也不会在正确实现的系统上发生。

在典型系统上,传输速率受网络限制(正如许多其他人已经发布的那样)。当通过不断连接和断开连接的协议将小文件复制到多台机器时,多线程传输可以提供最大的改进。在这种情况下,可以减轻网络延迟的影响,并且可以预期会有很大的加速。

在仅在两台机器之间传输大文件的情况下,由于硬盘对多个文件执行重叠写入,因此避免连接/断开延迟所产生的任何改进很可能会被增加的磁盘寻道所淹没。

首先 - 修复您的转移!即使线程数不合适,数据也不应该丢失!

于 2012-05-10T07:44:33.697 回答
0

问题的最可能原因是您的并行文件传输命令导致网络拥塞问题。听起来“缓冲区膨胀”现象可能会使您的问题更加复杂。

你能为这个做什么?

那么最简单的事情就是减少并行网络连接的数量,直到问题解决。如有必要,一次进行一项转移。

如果你真的很热衷,你可以在你的网络上使用一个数据包嗅探器,看看你是否能发现问题。但是您需要知道如何解释网络流量。

无论如何,问题可能只是您的网络链接饱和。唯一的解决办法是获得更快的连接......或者不要尝试同时发送太多。

于 2012-05-10T04:53:26.793 回答