はじめに
PBS Professionalでnon prime time queue (NPTQ)を作成する方法を残しておきます。
ここでnon prime time (NPT)とは、平日夜間・早朝、土日、祝日等の勤務時間外のことです。NPTQに登録されたジョブは、NPTになると実行されます。そのため、計算負荷のかかるジョブをNPTQに登録することで、勤務時間中に計算サーバ―が占有されることを回避できます。例えばデフォルトのキューをworkq、NPTQをnp_queueとすると、長くて数十分で終わるような計算はデフォルトのworkqに登録し、数時間かかるような計算はnp_queueに登録するという運用を行うことになります。
多数のユーザーが使用するような大学のスパコンなどではもっと高度な運用が行われていますが、会社で数十人が使用するレベルならばprime time queue(PTQ)とNPTQを設定し、ユーザーの使用リソース制限を加えれば十分満足できるサーバー運用ができます。
NPTQの作成
PBS Professionalでは、npから始まるキュー名をつけるとnon prime time queueとなります。
$ qmgr -c "create queue np_queue"
NPTの設定
NPTは$PBS_HOME/sched_priv/holidays
で設定します。
# Year
YEAR 2022
# 平日、土日、祝日のNPTの指定
# Day of week, PT start, NPT start
weekday 0800 1900
saturday none all
sunday none all
# 祝日
# Days from the begging of the year, Month, Day, Holiday name
1 Jan 1 New Year's Day
10 Jan 10 Coming-of-Age Day
...
祝日のリストは、Pythonのholidaysパッケージなどを使って作成できます。holidaysを使って会社独自の休日(年末年始休暇など)を追加することも可能です。
import holidays as hd
import datetime as dt
import pandas as pd
HOLIDAY_NAMES = {
"元日": "New Year's Day",
"成人の日": "Coming-of-Aged Day",
"建国記念の日": "National Foundation Day",
"天皇誕生日": "Emperor's Birthday",
"春分の日": "Vernal Equinox Day",
"昭和の日": "Showa Day",
"憲法記念日": "Constitution Day",
"みどりの日": "Greenery Day",
"こどもの日": "Children's Day",
"海の日": "Marine Day",
"山の日": "Mountain Day",
"敬老の日": "Respect for the Aged Day",
"秋分の日": "Autumnal Equinox Day",
"スポーツの日": "Sports Day",
"文化の日": "Culture Day",
"勤労感謝の日": "Labor Thanksgiving Day",
"振替休日": "Substitute Holiday"
}
if __name__=="__main__":
holidays_jp = hd.JP(years=2022)
# Translate from Japanese to English
holidays = {}
for date, name in holidays_jp.items():
holidays[date] = HOLIDAY_NAMES[name]
df = pd.DataFrame(holidays, columns=["date", "name"])
df["days"] = df["date"].apply(lambda x: (x - dt.date(2022, 1, 1)).days + 1)
df["day"] = df["date"].apply(lambda x: x.strftime("%d"))
df["month"] = df["date"].apply(lambda x: x.strftime("%b"))
with open(Path("holidays"), mode="w") as f:
f.write(f"YEAR 2022\n")
f.write("weekday 0800 1900\n"
"saturday none all\n"
"sunday none all\n")
for row in df.itertuples():
f.write(f"{row.days} {row.month} {row.day} {row.name}\n")