[apparmor] [PATCH] [parser] Fix jobs not scaling up to meet available resources when cpus are brought online during compilation
Seth Arnold
seth.arnold at canonical.com
Tue Apr 5 20:22:19 UTC 2016
On Tue, Apr 05, 2016 at 12:37:07PM -0700, John Johansen wrote:
> Enable dynamically scaling max jobs if new resources are brought online
>
> BugLink: http://bugs.launchpad.net/bugs/1566490
>
> This patch enables to parser to scale the max jobs if new resources are
> being brought online by the scheduler.
>
> It only enables the scaling check if there is a difference between the
> maximum number of cpus (CONF) and the number of online (ONLN) cpus.
>
> Instead of checking for more resources regardless, of whether the online
> cpu count is increasing it limits its checking to a maximum of
> MAX CPUS + 1 - ONLN cpus times. With each check coming after fork spawns a
> new work unit, giving the scheduler a chance to bring new cpus online
> before the next check. The +1 ensures the checks will be done at least
> once after the scheduling task sleeps waiting for its children giving
> the scheduler an extra chance to bring cpus online.
>
> Signed-off-by: John Johansen <john.johansen at canonical.com>
This feels more complicated than it could be but I must admit I can't
suggest any modifications to the algorithm to simplify it.
Acked-by: Seth Arnold <seth.arnold at canonical.com>
Thanks
>
> === modified file 'parser/parser_main.c'
> --- a/parser/parser_main.c 2016-01-15 01:26:26 +0000
> +++ b/parser/parser_main.c 2016-04-05 07:27:06 +0000
> @@ -89,6 +89,12 @@
> long jobs_max = -8; /* 8 * cpus */
> long jobs = JOBS_AUTO; /* default: number of processor cores */
> long njobs = 0;
> +long jobs_scale = 0; /* number of chance to resample online
> + * cpus. This allows jobs spawning to
> + * scale when scheduling policy is
> + * taking cpus off line, and brings
> + * them back with load
> + */
> bool debug_jobs = false;
>
> struct timespec cache_tstamp, mru_policy_tstamp;
> @@ -898,6 +904,16 @@
> RESULT(WORK); \
> break; \
> }*/ \
> + if (jobs_scale) { \
> + long n = sysconf(_SC_NPROCESSORS_ONLN); \
> + if (n > jobs) { \
> + /* reset sample chances - potentially reduce to 0 */ \
> + jobs_scale = jobs_max + 1 - n; \
> + jobs = n; \
> + } else \
> + /* reduce scaling chance by 1 */ \
> + jobs_scale--; \
> + } \
> if (njobs == jobs) { \
> /* wait for a child */ \
> if (debug_jobs) \
> @@ -959,11 +975,18 @@
> {
> /* jobs and paralell_max set by default, config or args */
> long n = sysconf(_SC_NPROCESSORS_ONLN);
> + long maxn = sysconf(_SC_NPROCESSORS_CONF);
> if (n == -1)
> /* unable to determine number of processors, default to 1 */
> n = 1;
> + if (maxn == -1)
> + /* unable to determine number of processors, default to 1 */
> + maxn = 1;
> + if (n < maxn)
> + /* the bigger the difference the more sample chances given */
> + jobs_scale = maxn + 1 - n;
> jobs = compute_jobs(n, jobs);
> - jobs_max = compute_jobs(n, jobs_max);
> + jobs_max = compute_jobs(maxn, jobs_max);
>
> if (jobs > jobs_max) {
> pwarn("%s: Warning capping number of jobs to %ld * # of cpus == '%ld'",
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20160405/85e72512/attachment.pgp>
More information about the AppArmor
mailing list