Ticket #2782: jobqueue_dynamic.patch

File jobqueue_dynamic.patch, 3.7 KB (added by oa@…, 14 years ago)

after first job, start new ones only if idle time remains - replaces mythtv_jobqueue_2.patch

  • libs/libmyth/util.h

     
    6161long long getDiskSpace(const QString&,long long&,long long&);
    6262bool getUptime(time_t &uptime);
    6363bool getMemStats(int &totalMB, int &freeMB, int &totalVM, int &freeVM);
     64bool getCPUStats(int &totalTime, int &idleTime);
    6465
    6566#endif // UTIL_H_
  • libs/libmyth/util.cpp

     
    472472
    473473    return true;
    474474}
     475
     476bool getCPUStats(int &totalTime, int &idleTime)
     477{
     478#ifdef __linux__
     479        bool found = false;
     480    char line[256];
     481        FILE *stat = fopen("/proc/stat", "r");
     482        if (stat)
     483        {
     484        while ( (found = fgets(line, sizeof line, stat)) && strncmp(line, "cpu ", 4) )
     485                ;
     486
     487        fclose(stat);
     488        }
     489       
     490    if (found)
     491        {
     492            char what[32];
     493            unsigned long user_time, nice_time, system_time, idle_time, wait_time = 0;
     494            sscanf(line, "%s %lu %lu %lu %lu %lu", what, &user_time, &nice_time,
     495                &system_time, &idle_time, &wait_time);
     496
     497        unsigned long total_time = user_time + nice_time + system_time + idle_time + wait_time ;
     498            static unsigned long last_total_time = 0, last_idle_time = 0;
     499            totalTime = total_time - last_total_time;
     500            last_total_time = total_time;
     501            idleTime = idle_time - last_idle_time;
     502            last_idle_time = idle_time;
     503            return true;       
     504        }
     505        else
     506        {
     507                VERBOSE(VB_IMPORTANT, "cpuCPUAvail(): can't read /proc/stat");
     508                return false;
     509        }
     510#else
     511        VERBOSE(VB_IMPORTANT, "getCPUAvail(): Unknown platform. "
     512                        "How do I get CPU stats?");
     513        return false;
     514#endif
     515}
  • libs/libmythtv/jobqueue.cpp

     
    231231                jobsRunning++;
    232232            }
    233233
     234            int totalTime, idleTime;
    234235            message = QString("Currently Running %1 jobs.")
    235236                              .arg(jobsRunning);
    236237            if (!inTimeWindow)
     
    241242                                   .arg(queueStartTimeStr);
    242243                VERBOSE(VB_JOBQUEUE, LOC + message);
    243244            }
     245            else if (jobsRunning > 0 && getCPUStats(totalTime, idleTime) &&
     246                    (idleTime * 100 / totalTime) < 25)
     247            {
     248                // don't permit more than one job if there's no free CPU
     249                message += QString(" CPU near full capacity (%1% idle), "
     250                                   "will not start more jobs")
     251                                   .arg(idleTime * 100 / totalTime);
     252                VERBOSE(VB_JOBQUEUE, LOC + message);
     253                atMax = true;
     254            }
    244255            else if (jobsRunning >= maxJobs)
    245256            {
    246257                message += " (At Maximum, no new jobs can be started until "
     
    257268                atMax = false;
    258269            }
    259270
    260 
    261271            for (unsigned int x = 0;
    262                  (x < jobs.size()) && (jobsRunning < maxJobs); x++)
     272                 x < jobs.size(); x++)
    263273            {
    264274                id = jobs[x].id;
    265275                chanid = jobs[x].chanid;
     
    431441                }
    432442
    433443                // never start or claim more than one job in a single run
    434                 if (startedJobAlready)
     444                if (startedJobAlready || atMax)
    435445                    continue;
    436446
    437447                if ((inTimeWindow) &&
     
    470480            }
    471481        }
    472482
    473         if (startedJobAlready)
    474             sleep(5);
    475         else
    476             sleep(sleepTime);
     483        sleep(sleepTime);
    477484    }
    478485}
    479486