找回密码
 立即注册
收起左侧

第2次数据传输时,网络速度降低,如何处理?

0
回复
5997
查看
[复制链接]
累计签到:56 天
连续签到:1 天
来源: 2018-2-25 10:57:33 显示全部楼层 |阅读模式
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时不予处理,以减小数据处理的开销。如果不这样,几十个字节就调用一次,将运行几十万次。
这能否通过设置参数在操作系统层面实现?



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了