Skip to content
Snippets Groups Projects
Commit 28f9df11 authored by Moe Jette's avatar Moe Jette
Browse files

Modify select/linear to achieve better load leveling with gang scheduler

parent 9f1e6b31
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,7 @@ documents those changes that are of interest to users and admins. ...@@ -17,6 +17,7 @@ documents those changes that are of interest to users and admins.
command. command.
-- Add HealthCheckInterval and HealthCheckProgram configuration parameters. -- Add HealthCheckInterval and HealthCheckProgram configuration parameters.
-- Add SlurmDbdAddr and SlurmDbdPort configuration parameters. -- Add SlurmDbdAddr and SlurmDbdPort configuration parameters.
-- Modify select/linear to achieve better load leveling with gang scheduler.
* Changes in SLURM 1.3.0-pre9 * Changes in SLURM 1.3.0-pre9
============================= =============================
......
...@@ -89,7 +89,8 @@ static void _free_node_cr(struct node_cr_record *node_cr_ptr); ...@@ -89,7 +89,8 @@ static void _free_node_cr(struct node_cr_record *node_cr_ptr);
static void _init_node_cr(void); static void _init_node_cr(void);
static int _job_count_bitmap(struct node_cr_record *node_cr_ptr, static int _job_count_bitmap(struct node_cr_record *node_cr_ptr,
struct job_record *job_ptr, struct job_record *job_ptr,
bitstr_t * bitmap, bitstr_t * jobmap, int job_cnt); bitstr_t * bitmap, bitstr_t * jobmap,
int run_job_cnt, int tot_job_cnt);
static int _job_test(struct job_record *job_ptr, bitstr_t *bitmap, static int _job_test(struct job_record *job_ptr, bitstr_t *bitmap,
uint32_t min_nodes, uint32_t max_nodes, uint32_t min_nodes, uint32_t max_nodes,
uint32_t req_nodes); uint32_t req_nodes);
...@@ -449,7 +450,7 @@ extern int select_p_job_test(struct job_record *job_ptr, bitstr_t *bitmap, ...@@ -449,7 +450,7 @@ extern int select_p_job_test(struct job_record *job_ptr, bitstr_t *bitmap,
uint32_t req_nodes, int mode) uint32_t req_nodes, int mode)
{ {
bitstr_t *orig_map; bitstr_t *orig_map;
int i, j, rc = EINVAL, prev_cnt = -1; int max_run_job, j, sus_jobs, rc = EINVAL, prev_cnt = -1;
int min_share = 0, max_share = 0; int min_share = 0, max_share = 0;
uint32_t save_mem = 0; uint32_t save_mem = 0;
...@@ -492,24 +493,32 @@ extern int select_p_job_test(struct job_record *job_ptr, bitstr_t *bitmap, ...@@ -492,24 +493,32 @@ extern int select_p_job_test(struct job_record *job_ptr, bitstr_t *bitmap,
} }
orig_map = bit_copy(bitmap); orig_map = bit_copy(bitmap);
for (i=min_share; i<=max_share; i++) { for (max_run_job=min_share; max_run_job<=max_share; max_run_job++) {
j = _job_count_bitmap(node_cr_ptr, job_ptr, orig_map, bitmap, i); for (sus_jobs=0; ((sus_jobs<5) && (rc != SLURM_SUCCESS));
if ((j == prev_cnt) || (j < min_nodes)) sus_jobs++) {
continue; if (max_run_job == max_share)
prev_cnt = j; sus_jobs = 999;
if ((mode == SELECT_MODE_RUN_NOW) && (i > 0)) { j = _job_count_bitmap(node_cr_ptr, job_ptr,
/* We need to share. orig_map, bitmap,
* Try to find suitable job to share nodes with. */ max_run_job,
rc = _find_job_mate(job_ptr, bitmap, max_run_job + sus_jobs);
min_nodes, max_nodes, req_nodes); if ((j == prev_cnt) || (j < min_nodes))
continue;
prev_cnt = j;
if ((mode == SELECT_MODE_RUN_NOW) && (max_run_job > 0)) {
/* We need to share.
* Try to find suitable job to share nodes with */
rc = _find_job_mate(job_ptr, bitmap, min_nodes,
max_nodes, req_nodes);
if (rc == SLURM_SUCCESS)
break;
}
rc = _job_test(job_ptr, bitmap, min_nodes, max_nodes,
req_nodes);
if (rc == SLURM_SUCCESS) if (rc == SLURM_SUCCESS)
break; break;
continue;
} }
rc = _job_test(job_ptr, bitmap, min_nodes, max_nodes,
req_nodes);
if (rc == SLURM_SUCCESS)
break;
continue;
} }
bit_free(orig_map); bit_free(orig_map);
slurm_mutex_unlock(&cr_mutex); slurm_mutex_unlock(&cr_mutex);
...@@ -524,9 +533,10 @@ extern int select_p_job_test(struct job_record *job_ptr, bitstr_t *bitmap, ...@@ -524,9 +533,10 @@ extern int select_p_job_test(struct job_record *job_ptr, bitstr_t *bitmap,
*/ */
static int _job_count_bitmap(struct node_cr_record *node_cr_ptr, static int _job_count_bitmap(struct node_cr_record *node_cr_ptr,
struct job_record *job_ptr, struct job_record *job_ptr,
bitstr_t * bitmap, bitstr_t * jobmap, int job_cnt) bitstr_t * bitmap, bitstr_t * jobmap,
int run_job_cnt, int tot_job_cnt)
{ {
int i, count = 0, total_jobs; int i, count = 0, total_jobs, total_run_jobs;
struct part_cr_record *part_cr_ptr; struct part_cr_record *part_cr_ptr;
uint32_t job_memory = 0; uint32_t job_memory = 0;
...@@ -554,7 +564,7 @@ static int _job_count_bitmap(struct node_cr_record *node_cr_ptr, ...@@ -554,7 +564,7 @@ static int _job_count_bitmap(struct node_cr_record *node_cr_ptr,
} }
} }
if ((job_cnt != NO_SHARE_LIMIT) && if ((run_job_cnt != NO_SHARE_LIMIT) &&
(node_cr_ptr[i].exclusive_jobid != 0)) { (node_cr_ptr[i].exclusive_jobid != 0)) {
/* already reserved by some exclusive job */ /* already reserved by some exclusive job */
bit_clear(jobmap, i); bit_clear(jobmap, i);
...@@ -562,23 +572,27 @@ static int _job_count_bitmap(struct node_cr_record *node_cr_ptr, ...@@ -562,23 +572,27 @@ static int _job_count_bitmap(struct node_cr_record *node_cr_ptr,
} }
total_jobs = 0; total_jobs = 0;
total_run_jobs = 0;
part_cr_ptr = node_cr_ptr[i].parts; part_cr_ptr = node_cr_ptr[i].parts;
while (part_cr_ptr) { while (part_cr_ptr) {
if (job_cnt == 0) if (run_job_cnt == 0) {
total_jobs += part_cr_ptr->run_job_cnt; total_run_jobs += part_cr_ptr->run_job_cnt;
else if (part_cr_ptr->part_ptr == job_ptr->part_ptr) { total_jobs += part_cr_ptr->tot_job_cnt;
total_jobs += part_cr_ptr->run_job_cnt; } else if (part_cr_ptr->part_ptr == job_ptr->part_ptr) {
total_run_jobs += part_cr_ptr->run_job_cnt;
total_jobs += part_cr_ptr->tot_job_cnt;
break; break;
} }
part_cr_ptr = part_cr_ptr->next; part_cr_ptr = part_cr_ptr->next;
} }
if ((job_cnt != 0) && (part_cr_ptr == NULL)) { if ((run_job_cnt != 0) && (part_cr_ptr == NULL)) {
error("_job_count_bitmap: could not find " error("_job_count_bitmap: could not find "
"partition %s for node %s", "partition %s for node %s",
job_ptr->part_ptr->name, job_ptr->part_ptr->name,
node_record_table_ptr[i].name); node_record_table_ptr[i].name);
} }
if (total_jobs <= job_cnt) { if ((total_run_jobs <= run_job_cnt) &&
(total_jobs <= tot_job_cnt)) {
bit_set(jobmap, i); bit_set(jobmap, i);
count++; count++;
} else { } else {
...@@ -1414,7 +1428,7 @@ static int _will_run_test(struct job_record *job_ptr, bitstr_t *bitmap, ...@@ -1414,7 +1428,7 @@ static int _will_run_test(struct job_record *job_ptr, bitstr_t *bitmap,
orig_map = bit_copy(bitmap); orig_map = bit_copy(bitmap);
/* Try to run with currently available nodes */ /* Try to run with currently available nodes */
i = _job_count_bitmap(node_cr_ptr, job_ptr, orig_map, bitmap, max_share); i = _job_count_bitmap(node_cr_ptr, job_ptr, orig_map, bitmap, max_share, max_share);
if (i >= min_nodes) { if (i >= min_nodes) {
rc = _job_test(job_ptr, bitmap, min_nodes, max_nodes, rc = _job_test(job_ptr, bitmap, min_nodes, max_nodes,
req_nodes); req_nodes);
...@@ -1460,7 +1474,7 @@ static int _will_run_test(struct job_record *job_ptr, bitstr_t *bitmap, ...@@ -1460,7 +1474,7 @@ static int _will_run_test(struct job_record *job_ptr, bitstr_t *bitmap,
_rm_job_from_nodes(exp_node_cr, tmp_job_ptr, _rm_job_from_nodes(exp_node_cr, tmp_job_ptr,
"_will_run_test", 1); "_will_run_test", 1);
i = _job_count_bitmap(exp_node_cr, job_ptr, orig_map, bitmap, i = _job_count_bitmap(exp_node_cr, job_ptr, orig_map, bitmap,
max_share); max_share, max_share);
if (i < min_nodes) if (i < min_nodes)
continue; continue;
rc = _job_test(job_ptr, bitmap, min_nodes, max_nodes, rc = _job_test(job_ptr, bitmap, min_nodes, max_nodes,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment