我有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秒连接并将文件发送到客户端。有时它仍然会丢失图像。
是否有人知道实际发生的事情会使多线程变慢?是否有任何解决方案可以使其连接和发送更快?
答案 0 :(得分:1)
嗯,很难说清楚,因为你没有给我们一些有趣的代码,它实际上将网络中的字节发送到另一台机器。但这就是我的建议:
答案 1 :(得分:1)
是否有人知道实际发生的事情会使多线程变慢? 是否有任何解决方案可以使其连接和发送更快?
正如Makoto所说,第一个瓶颈很可能是I / O
多线程在你所拥有的地方有意义等待"未使用的I / O时间"
e.g。如果程序有一些工作要做,而你的线程是"阻止"在I / O操作上,然后添加另一个线程可能有意义
例如,如果您阅读图像并将其写入文件,如果您在"消费者生产者中使用2个线程,则可能会略微提高性能。 job(一个读取并放入缓冲区,一个从缓冲区读取并写入文件,例如使用BlockingQueue)
答案 2 :(得分:0)
问题的最可能原因是并行文件传输命令导致网络拥塞问题。听起来你的问题可能会因"buffer bloat"现象而加剧。
你能做些什么?
最简单的事情是减少并行网络连接的数量,直到问题发生。如有必要,一次进行一次转移。
如果您非常热衷,可以在网络上使用数据包嗅探器,看看是否可以发现问题。但是您需要知道如何解释网络流量。
无论如何,问题可能只在于您正在使网络链接饱和。唯一的解决方法是获得更快的连接...或者不要尝试同时发送更多。
答案 3 :(得分:0)
'它使用5秒钟连接并将文件发送到客户端'
Ho wlong用一个线程吗?
'有时它仍然会丢失图像' - 现在这让任何基于TCP的转移都令人担忧。即使您有50个线程,也不会在正确实现的系统上发生。
在典型系统中,传输速率受网络限制(已由许多其他人发布)。通过连续连接和断开连接的协议将小文件复制到多台计算机时,多线程传输可以提供最大的改进。在这种情况下,可以减轻网络延迟的影响,并可以预期大幅加速。
在仅在两台计算机之间传输大型文件的情况下,由于硬盘执行重叠写入多个文件,因此通过增加磁盘搜索很可能会淹没因避免连接/断开延迟而产生的任何改进。
首先 - 修复您的转移!即使线程数量不合适,数据也不应丢失!