Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Why CPU usage increase to 100% ?
Forum Updated to NodeBB v4.3 + New Features

Why CPU usage increase to 100% ?

Scheduled Pinned Locked Moved Mobile and Embedded
15 Posts 4 Posters 5.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SGaistS SGaist

    Hi,

    How fast are you getting these data ?

    H Offline
    H Offline
    Hiloshi
    wrote on last edited by Hiloshi
    #3

    Dear @SGaist ,

    Baud rate is 115200, the sensor will send 32bytes data to RPi3 for every 800ms automatically.

    Thanks,

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #4

      Doesn't looks like that's the culprit then. What else are you doing with that application ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      H 2 Replies Last reply
      2
      • SGaistS SGaist

        Doesn't looks like that's the culprit then. What else are you doing with that application ?

        H Offline
        H Offline
        Hiloshi
        wrote on last edited by
        #5

        Dear @SGaist ,

        It should be nothing else in the application. But in order to make sure everything is under control, I will make a new project and put UART communication only then test again.

        Thanks,

        1 Reply Last reply
        1
        • SGaistS SGaist

          Doesn't looks like that's the culprit then. What else are you doing with that application ?

          H Offline
          H Offline
          Hiloshi
          wrote on last edited by
          #6

          Dear @SGaist ,

          I create a new project for the test: https://github.com/hiloshi/CPUTest , I still see the CPU usage increase to 100%.
          The CPU usage is https://www.dropbox.com/s/ki42n1ee32vi7r5/UARTCPU.txt?dl=0

          If I only add UART, the CPU usage will not exceed 1%, however, after I add QChart,QSplineSeries,etc.
          (Line 38-63: CPUTest/mainwindow.cpp )
          The CPU usage start increase, even I only do axisX()->setTitleText(s), not really draw curve.

          Is there something wrong with "Mychart->axisX()->setTitleText(s);" ?
          or shouldn't draw "QChart" inside the UART slot ?

          Any suggestions would be very appreciate~

          1 Reply Last reply
          1
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #7

            You should try to profile your application in order to determine where the hop spots are in your application.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            H 1 Reply Last reply
            2
            • SGaistS SGaist

              You should try to profile your application in order to determine where the hop spots are in your application.

              H Offline
              H Offline
              Hiloshi
              wrote on last edited by
              #8

              Dear @SGaist ,

              When MainWindow create, system will also new a serialport instance and connect to UART receiver:

              serial = new QSerialPort(this);
              connect(serial, &QSerialPort::readyRead, this, &MainWindow::UART_Receiver2);
              

              Then I put two widget on the mainwindow by QTCreater, one is pushbutton, another is tabWidget.
              Inside the pushbutton, two major task will be done:

              1. UART initialize (ttyUSB0, 115200/8N1N)
              2. QSplineSeries, QSplineSeries and QChartView initialize. then put this QChartView to a new tab,
               MyvLayout->addWidget(MychartView);
               Mywidget->setLayout(MyvLayout);
              ui->tabWidget->addTab(Mywidget,"Chart");
              

              In the meanwhile, tab3 will be generated and show a blank diagram.
              System waiting UART input, sensor will output 32byes data to RPi3 every 800ms.

              Inside the UART Receive slot is:

              
                  UART_Read_Buffer = UART_Read_Buffer + serial->readAll().toHex();
              
                  if(UART_Read_Buffer.count()>63)
                  {
              
                  //--------------------------------------------   
                      elapse_time++;
                      QString s = QString::number(elapse_time);        
                      Mychart->axisX()->setTitleText(s);    
                  //-------------------------------------------
                      UART_Read_Buffer.clear();
              }
              

              System will keep receive data, I will show numbers of received data and display on axisX().
              Therefore, this value will increase by 1 after every 32bytes.

              Then I can monitor the CPU usage increase to 100%.

              If comment out Mychart->axisX()->setTitleText(s); , the CPU usage will not keep increase.
              So I think maybe there are something wrong with the way I use QChartView.

              Any help will be appreciate,

              jsulmJ 1 Reply Last reply
              0
              • H Hiloshi

                Dear @SGaist ,

                When MainWindow create, system will also new a serialport instance and connect to UART receiver:

                serial = new QSerialPort(this);
                connect(serial, &QSerialPort::readyRead, this, &MainWindow::UART_Receiver2);
                

                Then I put two widget on the mainwindow by QTCreater, one is pushbutton, another is tabWidget.
                Inside the pushbutton, two major task will be done:

                1. UART initialize (ttyUSB0, 115200/8N1N)
                2. QSplineSeries, QSplineSeries and QChartView initialize. then put this QChartView to a new tab,
                 MyvLayout->addWidget(MychartView);
                 Mywidget->setLayout(MyvLayout);
                ui->tabWidget->addTab(Mywidget,"Chart");
                

                In the meanwhile, tab3 will be generated and show a blank diagram.
                System waiting UART input, sensor will output 32byes data to RPi3 every 800ms.

                Inside the UART Receive slot is:

                
                    UART_Read_Buffer = UART_Read_Buffer + serial->readAll().toHex();
                
                    if(UART_Read_Buffer.count()>63)
                    {
                
                    //--------------------------------------------   
                        elapse_time++;
                        QString s = QString::number(elapse_time);        
                        Mychart->axisX()->setTitleText(s);    
                    //-------------------------------------------
                        UART_Read_Buffer.clear();
                }
                

                System will keep receive data, I will show numbers of received data and display on axisX().
                Therefore, this value will increase by 1 after every 32bytes.

                Then I can monitor the CPU usage increase to 100%.

                If comment out Mychart->axisX()->setTitleText(s); , the CPU usage will not keep increase.
                So I think maybe there are something wrong with the way I use QChartView.

                Any help will be appreciate,

                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by
                #9

                @Hiloshi You could try to increase less often - for example after every 128 bytes.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                H 1 Reply Last reply
                2
                • K Offline
                  K Offline
                  kuzulis
                  Qt Champions 2020
                  wrote on last edited by
                  #10
                  1. Just do not use QtCharts, use Qwt instead and you will be surprised with performance changing.
                  2. Do not use UART_Read_Buffer, because data already buffered inside of QSP (just use serial->bytesAvailable() to know how much data ready for read).

                  PS: You can simplify the MainWindow::UART_Receiver2 slot:

                  void MainWindow::UART_Receiver2()
                  {
                      QByteArray dummy = serial->readAll();
                  }
                  

                  to check, how much CPU usage will be in this case..

                  H 1 Reply Last reply
                  2
                  • jsulmJ jsulm

                    @Hiloshi You could try to increase less often - for example after every 128 bytes.

                    H Offline
                    H Offline
                    Hiloshi
                    wrote on last edited by
                    #11

                    Dear @jsulm ,

                    Thank you very much.

                    I change 128 to decrease draw speed of the QChart. The result is become 65minutes to 100%.
                    https://www.dropbox.com/s/dmi8d84p48qjug1/UARTCPU2.txt?dl=0

                    Hmmm....

                    1 Reply Last reply
                    0
                    • K kuzulis
                      1. Just do not use QtCharts, use Qwt instead and you will be surprised with performance changing.
                      2. Do not use UART_Read_Buffer, because data already buffered inside of QSP (just use serial->bytesAvailable() to know how much data ready for read).

                      PS: You can simplify the MainWindow::UART_Receiver2 slot:

                      void MainWindow::UART_Receiver2()
                      {
                          QByteArray dummy = serial->readAll();
                      }
                      

                      to check, how much CPU usage will be in this case..

                      H Offline
                      H Offline
                      Hiloshi
                      wrote on last edited by
                      #12

                      Dear @kuzulis ,

                      Thanks for the suggestions, I will test Qwt and change uart read method.

                      I was wondering why CPU usage keep increase. Even if QChart spend 60% CPU power, it should not keep increase to 100%, isn't it ?

                      1 Reply Last reply
                      0
                      • K Offline
                        K Offline
                        kuzulis
                        Qt Champions 2020
                        wrote on last edited by kuzulis
                        #13

                        Even if QChart spend 60% CPU power, it should not keep increase to 100%, isn't it ?

                        Try to do tests without of QtCharts, just with pure UART_Receiver2 slot(), as I wrote before, to look on CPU loading. And then, try to add something other code...

                        PS: QtCharts - is a bad choose, as it is too slow and also consume many CPU resources. F.e. from my experience, with Qwt I have ~4-5% CPU loading, but with QtCharts I have ~20-50% CPU loading. And I have similar proportions in RAM consuming - QtCharts eat a RAM in ~5-10 times more than Qwt. Besides, has a memory leaks...

                        1 Reply Last reply
                        1
                        • H Offline
                          H Offline
                          Hiloshi
                          wrote on last edited by
                          #14

                          Dear @kuzulis ,

                          I make some test as below:

                          1. RPi3+Debian+QSerialPort(800ms)+QTabWidget+QChart-->20mins to 100%
                          2. RPi3+Debian+QSerialPort(800ms)+QChart -->about 20mins to 100%
                          3. RPi3+Debian+QTimer(1000ms)+QChart --> 35ms to 100%
                          4. Corei5+WIN8+QTimer(1000ms)+QChart--> test over 1hr under 20%

                          My conclusion in the rough is QChart maybe has something wrong on Armv7 or debian....

                          I will continue to test Qwt.

                          1 Reply Last reply
                          0
                          • H Offline
                            H Offline
                            Hiloshi
                            wrote on last edited by
                            #15

                            Dear @kuzulis ,

                            After testing Qwt for the same project, the CPU usage stable under 3%.
                            It is huge difference compare to the QChart performance.

                            Thanks for the suggestion.

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved