1 |
Author: zmedico |
2 |
Date: 2008-07-29 14:34:55 +0000 (Tue, 29 Jul 2008) |
3 |
New Revision: 11263 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
During the first minute of entering the main scheduler loop, if --load-average |
9 |
is enabled then limit the rate that new jobs are spawned, so that the load |
10 |
average measurement has time to respond to the new load introduced by the |
11 |
new jobs. The time between spawning new jobs is proportional to the number |
12 |
of currently running jobs. |
13 |
|
14 |
|
15 |
Modified: main/trunk/pym/_emerge/__init__.py |
16 |
=================================================================== |
17 |
--- main/trunk/pym/_emerge/__init__.py 2008-07-29 13:01:38 UTC (rev 11262) |
18 |
+++ main/trunk/pym/_emerge/__init__.py 2008-07-29 14:34:55 UTC (rev 11263) |
19 |
@@ -8860,6 +8860,17 @@ |
20 |
|
21 |
self._max_load = myopts.get("--load-average") |
22 |
|
23 |
+ # The load average takes some time to respond when new |
24 |
+ # jobs are added, so we need to limit the rate of adding |
25 |
+ # new jobs when emerge first starts. |
26 |
+ self._main_loop_init_delay_period = 60 |
27 |
+ self._job_delay_factor = 0.5 |
28 |
+ |
29 |
+ # State variables |
30 |
+ self._main_loop_init_delay = None |
31 |
+ self._previous_job_start_time = None |
32 |
+ self._main_loop_start_time = None |
33 |
+ |
34 |
self._set_digraph(digraph) |
35 |
|
36 |
# This is used to memoize the _choose_pkg() result when |
37 |
@@ -9625,6 +9636,8 @@ |
38 |
self._config_pool[settings["ROOT"]].append(settings) |
39 |
|
40 |
def _main_loop(self): |
41 |
+ self._main_loop_init_delay = self._max_load is not None |
42 |
+ self._main_loop_start_time = time.time() |
43 |
|
44 |
# Only allow 1 job max if a restart is scheduled |
45 |
# due to portage update. |
46 |
@@ -9656,6 +9669,26 @@ |
47 |
self._status_display.display() |
48 |
return remaining |
49 |
|
50 |
+ def _job_delay(self): |
51 |
+ """ |
52 |
+ @rtype: bool |
53 |
+ @returns: True if job scheduling should be delayed, False otherwise. |
54 |
+ """ |
55 |
+ |
56 |
+ if self._main_loop_init_delay and self._jobs: |
57 |
+ |
58 |
+ current_time = time.time() |
59 |
+ |
60 |
+ if current_time - self._main_loop_start_time > \ |
61 |
+ self._main_loop_init_delay_period: |
62 |
+ self._main_loop_init_delay = False |
63 |
+ |
64 |
+ elif current_time - self._previous_job_start_time < \ |
65 |
+ self._job_delay_factor * self._jobs: |
66 |
+ return True |
67 |
+ |
68 |
+ return False |
69 |
+ |
70 |
def _schedule_tasks_imp(self): |
71 |
""" |
72 |
@rtype: bool |
73 |
@@ -9669,6 +9702,9 @@ |
74 |
if not self._pkg_queue or self._failed_pkgs: |
75 |
return (False, state_change) |
76 |
|
77 |
+ if self._job_delay(): |
78 |
+ return (True, state_change) |
79 |
+ |
80 |
if self._choose_pkg_return_early or \ |
81 |
not self._can_add_job(): |
82 |
return (True, state_change) |
83 |
@@ -9691,12 +9727,14 @@ |
84 |
|
85 |
elif pkg.built: |
86 |
self._jobs += 1 |
87 |
+ self._previous_job_start_time = time.time() |
88 |
self._status_display.running = self._jobs |
89 |
task.addExitListener(self._extract_exit) |
90 |
self._task_queues.jobs.add(task) |
91 |
|
92 |
else: |
93 |
self._jobs += 1 |
94 |
+ self._previous_job_start_time = time.time() |
95 |
self._status_display.running = self._jobs |
96 |
task.addExitListener(self._build_exit) |
97 |
self._task_queues.jobs.add(task) |