def tmp_dir_report(jobs, tmpdirs, sched_cfg, width, start_row=None, end_row=None, prefix=''): '''start_row, end_row let you split the table up if you want''' tab = tt.Texttable() headings = ['tmp', 'ready', 'phases'] tab.header(headings) tab.set_cols_dtype('t' * len(headings)) tab.set_cols_align('r' * (len(headings) - 1) + 'l') for i, d in enumerate(sorted(tmpdirs)): if (start_row and i < start_row) or (end_row and i >= end_row): continue phases = sorted(job.job_phases_for_tmpdir(d, jobs)) ready = manager.phases_permit_new_job(phases, sched_cfg) row = [ abbr_path(d, prefix), 'OK' if ready else '--', phases_str(phases) ] tab.add_row(row) tab.set_max_width(width) tab.set_deco(tt.Texttable.BORDER | tt.Texttable.HEADER) tab.set_deco(0) # No borders return tab.draw()
def tmp_dir_report(jobs, tmpdirs, sched_cfg, width, start_row=None, end_row=None, prefix=""): """start_row, end_row let you split the table up if you want""" tab = tt.Texttable() headings = ["tmp", "count", "ready", "phases", "youngest", "eldest"] tab.header(headings) tab.set_cols_dtype("t" * len(headings)) tab.set_cols_align("r" * (len(headings) - 1) + "l") for i, d in enumerate(sorted(tmpdirs)): if (start_row and i < start_row) or (end_row and i >= end_row): continue dir_jobs = [j for j in jobs if j.tmpdir == d] job_age = [j.get_time_wall() for j in dir_jobs] phases = sorted(job.job_phases_for_tmpdir(d, jobs)) ready = manager.phases_permit_new_job(phases, sched_cfg) row = [ abbr_path(d, prefix), len(dir_jobs), "Y" if ready else "N", phases_str(phases), plot_util.time_format(min(job_age)) if job_age else "N/A", plot_util.time_format(max(job_age)) if job_age else "N/A", ] tab.add_row(row) tab.set_max_width(width) tab.set_deco(tt.Texttable.BORDER | tt.Texttable.HEADER) tab.set_deco(0) # No borders return tab.draw()
def maybe_start_new_plot(dir_cfg, sched_cfg, plotting_cfg): jobs = job.Job.get_running_jobs(dir_cfg['log']) wait_reason = None # If we don't start a job this iteration, this says why. youngest_job_age = min(jobs, key=job.Job.get_time_wall).get_time_wall() if jobs else MAX_AGE global_stagger = int(sched_cfg['global_stagger_m'] * MIN) if (youngest_job_age < global_stagger): wait_reason = 'stagger (%ds/%ds)' % ( youngest_job_age, global_stagger) else: tmp_to_all_phases = [ (d, job.job_phases_for_tmpdir(d, jobs)) for d in dir_cfg['tmp'] ] eligible = [ (d, phases) for (d, phases) in tmp_to_all_phases if phases_permit_new_job(phases, sched_cfg) ] rankable = [ (d, phases[0]) if phases else (d, (999, 999)) for (d, phases) in eligible ] if not eligible: wait_reason = 'no eligible tempdirs' else: # Plot to oldest tmpdir. tmpdir = max(rankable, key=operator.itemgetter(1))[0] # Select the dst dir least recently selected dir2ph = dstdirs_to_youngest_phase(jobs) unused_dirs = [d for d in dir_cfg['dst'] if d not in dir2ph.keys()] dstdir = '' if unused_dirs: dstdir = random.choice(unused_dirs) else: dstdir = max(dir2ph, key=dir2ph.get) logpath = Path(dir_cfg['log']) logfile = PureWindowsPath(logpath / datetime.now().strftime('%Y-%m-%d-%H.%M.%S.log')) #logfile = os.path.join(Path(dir_cfg['log']),) print(logfile) plot_args = [r'C:\Users\Wofl\AppData\Local\Chia-Blockchain\app-1.0.3\resources\app.asar.unpacked\daemon\chia2.exe','plots', 'create', '-k', str(plotting_cfg['k']), '-r', str(plotting_cfg['n_threads']), '-u', str(plotting_cfg['n_buckets']), '-b', str(plotting_cfg['job_buffer']), '-t', tmpdir, '-d', dstdir ] if 'e' in plotting_cfg and plotting_cfg['e']: plot_args.append('-e') if 'tmp2' in dir_cfg: plot_args.append('-2') plot_args.append(dir_cfg['tmp2']) # logfile = repr(logfile) logmsg = ('Starting plot job: %s ; logging to %s' % (' '.join(plot_args), logfile)) #print(logfile) #print(logmsg) # start_new_sessions to make the job independent of this controlling tty. p = subprocess.Popen(plot_args, stdout=open(logfile, 'w'), stderr=subprocess.STDOUT, start_new_session=True) psutil.Process(p.pid) #.nice(ABOVE_NORMAL_PRIORITY_CLASS) # print( psutil.Process(p.pid).cmdline()) # x = psutil.Process(p.pid) # x.nice(15) return (True, logmsg) return (False, wait_reason)
def maybe_start_new_plot(dir_cfg, sched_cfg, plotting_cfg): jobs = job.Job.get_running_jobs(dir_cfg['log']) wait_reason = None # If we don't start a job this iteration, this says why. youngest_job_age = min( jobs, key=job.Job.get_time_wall).get_time_wall() if jobs else MAX_AGE global_stagger = int(sched_cfg['global_stagger_m'] * MIN) if (youngest_job_age < global_stagger): wait_reason = 'stagger (%ds/%ds)' % (youngest_job_age, global_stagger) else: tmp_to_all_phases = [(d, job.job_phases_for_tmpdir(d, jobs)) for d in dir_cfg['tmp']] eligible = [(d, phases) for (d, phases) in tmp_to_all_phases if phases_permit_new_job(phases, sched_cfg)] rankable = [(d, phases[0]) if phases else (d, (999, 999)) for (d, phases) in eligible] if not eligible: wait_reason = 'no eligible tempdirs' else: # Plot to oldest tmpdir. tmpdir = max(rankable, key=operator.itemgetter(1))[0] # Select the dst dir least recently selected dir2ph = dstdirs_to_youngest_phase(jobs) # Throw out dirs that are not allowed in current config dir2ph = dict([(k, v) for k, v in dir2ph.items() if k in dir_cfg['dst']]) unused_dirs = [d for d in dir_cfg['dst'] if d not in dir2ph.keys()] dstdir = '' if unused_dirs: dstdir = random.choice(unused_dirs) else: dstdir = max(dir2ph, key=dir2ph.get) logfile = os.path.join( dir_cfg['log'], datetime.now().strftime('%Y-%m-%d-%H:%M:%S.log')) plot_args = [ 'chia', 'plots', 'create', '-k', str(plotting_cfg['k']), '-r', str(plotting_cfg['n_threads']), '-u', str(plotting_cfg['n_buckets']), '-b', str(plotting_cfg['job_buffer']), '-t', tmpdir, '-d', dstdir ] if 'e' in plotting_cfg and plotting_cfg['e']: plot_args.append('-e') if 'farmer_key' in plotting_cfg: plot_args.append('-f') plot_args.append(plotting_cfg['farmer_key']) if 'pool_key' in plotting_cfg: plot_args.append('-p') plot_args.append(plotting_cfg['pool_key']) if 'tmp2' in dir_cfg: plot_args.append('-2') plot_args.append(dir_cfg['tmp2']) logmsg = ('Starting plot job: %s ; logging to %s' % (' '.join(plot_args), logfile)) # start_new_sessions to make the job independent of this controlling tty. p = subprocess.Popen(plot_args, stdout=open(logfile, 'w'), stderr=subprocess.STDOUT, start_new_session=True) psutil.Process(p.pid).nice(15) return (True, logmsg) return (False, wait_reason)