|
20Qter豆
我有一个应用,从一块DE1-SoC板上传数据到PC机。DE1-SoC板上是双核ARM-A9,运行Linux;PC端是Win10。两边程序都用QT5编写,通过QTcpSocket从ARM传输大小为512MB的数据块到PC,ARM为服务器,PC为客户端。问题的现象为:服务器运行后,启动客户端传输数据,第一次(第一个512MB)速度很快,约20秒传输完成;第2次速度变慢,大都在40-80秒左右,偶有20秒,也有160秒;第3次以后基本上都在160-180秒。退出客户端程序,重新运行,第一次又很快,到第三次又到160秒以上,重复性很好。数据没有错误,只是速度降低。ARM服务器和PC客户端都是10-100-1000Mb自适应网口,交换机和网线都是1000Mb的。
我分析可能与PC端QTcpSocket的数据缓冲区有关,第一次缓冲区是空的或连续的,所以速度快;后来缓冲区分散了,操作系统需要不停分配和收集所以慢了。于是设置数据缓冲区大小为512M,可没有作用,现象依旧。
请各位大侠分析分析,是不是这个原因,有何解决方法? 请不吝指教
附PC端相关程序片段:
void MainWindow::receiveData() //接收数据
{
if( bytesReceived == 0 )
{
trans_cnt = 0;
trans_time.restart();
}
qint64 bytesAva = datSocket->bytesAvailable();
if( bytesAva<1024*1024 ) return;
trans_cnt++;
bytesReceived += datSocket->read(pDat_buf+bytesReceived, 1024*1024 );
ui->progressBar->setValue( bytesReceived );
if( bytesReceived==dat_buf_size )
{
pageNum = transNum;
ui->pushBtn_Save->setEnabled(1);
replot_QWT();
Trans_End();
ui->label_Trans_CNT->setNum( trans_cnt );
ui->label_Trans_time->setNum( trans_time.elapsed() );
}
}
void MainWindow::network_init() // 网络初始化
{
datSocket = new QTcpSocket(this);
// datSocket->setReadBufferSize(512*1024*1024);
datSocket->setSocketOption(
QAbstractSocket::ReceiveBufferSizeSocketOption,
1024*1024*512 ); //给套接字申请一个512M的内存空间
dataTransfer = 0;
bytesReceived = 0;
ui->progressBar->setMaximum(DAT_BUF_SIZE);
ui->progressBar->setValue(0);
connect(datSocket, SIGNAL(connected()), this, SLOT(on_datConnected ()) );
connect(datSocket, SIGNAL(disconnected()), this, SLOT(on_datDisconnect()) );
connect(datSocket, SIGNAL(readyRead()), this, SLOT(receiveData()) );
connect(datSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT (datError(QAbstractSocket::SocketError)));
}
另外,程序在数据小于1M时不予处理,以减小数据处理的开销。如果不这样,几十个字节就调用一次,将运行几十万次。
这能否通过设置参数在操作系统层面实现?
|
|