綾小路龍之介の素人思考

[linux] atdの-lオプションでマルチコア、マルチプロセッサ用のload factorを設定

マルチコア、マルチプロセッサではatdのload factorを正しく設定したほうがbatchプロセスが効率化されそうな気がする。

manpageによると-lオプションを指定しなかった場合のload factorのデフォルトは0.8。SMPのようなマルチコア、マルチプロセッサの場合、load averageが0.8ということは1つのCPU以外は殆ど仕事していないということになる。これでは効率が悪いので-lでload factorオプションを指定する。例えばOSから2個のプロセッサが有るように見える場合は、2-1よりもload factorを大きくすると良い。今回は1.8にする。load factorは以下のようにして指定する。

atd -l 1.8

/etc/init.d/atdを編集してstart_daemonの引数にオプション -l 1.8等とすれば問題ないのだけど、これがベストな方法か判断ができないということ。まずは/etc/init.d/の配下にあるデーモン起動スクリプトでオプション追加の定石を学ぶ。grepで起動スクリプトを走査し、start_daemonに引数を与えているスクリプトを探すとexim4のそれが見つかる。

# grep -A 4 start_daemon /etc/init.d/*
/etc/init.d/atd:        start_daemon $DAEMON
/etc/init.d/atd-        log_end_msg $?
/etc/init.d/atd-    ;;
/etc/init.d/atd-  stop)
/etc/init.d/atd-        log_daemon_msg "Stopping deferred execution scheduler" "atd"
--
/etc/init.d/exim4:      start_daemon -p "$PIDFILE" \
/etc/init.d/exim4-        "$DAEMON" -bd "-q${QFLAGS}${QUEUEINTERVAL}" \
/etc/init.d/exim4-        ${COMMONOPTIONS} \
/etc/init.d/exim4-        ${QUEUERUNNEROPTIONS} \
/etc/init.d/exim4-        ${SMTPLISTENEROPTIONS}
--
/etc/init.d/exim4:      start_daemon -p "$PIDFILE" \
/etc/init.d/exim4-        "$DAEMON" -bd \
/etc/init.d/exim4-        ${COMMONOPTIONS} \
/etc/init.d/exim4-        ${SMTPLISTENEROPTIONS}
/etc/init.d/exim4-      log_progress_msg "exim4_listener"
/etc/init.d/exim4:      start_daemon -p "$QRPIDFILE" \
/etc/init.d/exim4-        "$DAEMON" -oP $QRPIDFILE \
/etc/init.d/exim4-        "-q${QFLAGS}${QUEUEINTERVAL}" \
/etc/init.d/exim4-        ${COMMONOPTIONS} \
/etc/init.d/exim4-        ${QUEUERUNNEROPTIONS}
--
/etc/init.d/exim4:      start_daemon -p "$QRPIDFILE" \
/etc/init.d/exim4-        "$DAEMON" -oP $QRPIDFILE \
/etc/init.d/exim4-        "-q${QFLAGS}${QUEUEINTERVAL}" \
/etc/init.d/exim4-        ${COMMONOPTIONS} \
/etc/init.d/exim4-        ${QUEUERUNNEROPTIONS}
--
/etc/init.d/exim4:      start_daemon -p "$PIDFILE" \
/etc/init.d/exim4-        "$DAEMON" -bd \
/etc/init.d/exim4-        ${COMMONOPTIONS} \
/etc/init.d/exim4-        ${SMTPLISTENEROPTIONS}
/etc/init.d/exim4-      log_progress_msg "exim4_listener"

/etc/init.d/exim4の内容から、start_daemonに与えているオプションは"$DAEMON"以下に続く変数に格納されていることがわかる。例えばCOMMONOPTIONS変数の定義されている部分を/etc/init.d/exim4のなかから探すと見つからない。

# grep COMMONOPTIONS /etc/init.d/exim4
        ${COMMONOPTIONS} \
        ${COMMONOPTIONS} \
        ${COMMONOPTIONS} \
        ${COMMONOPTIONS} \
        ${COMMONOPTIONS} \

/etc/default配下のファイルにデフォルト起動オプションが書かれていることが良くあるので、/etc/init.d/exim4の中から/etc/defaultを探すと以下のような内容がヒットする。つまり、/etc/default/exim4が有る場合はこれを読み込むということだ。

# grep "/etc/default" /etc/init.d/exim4
[ -f /etc/default/exim4 ] && . /etc/default/exim4

そこで/etc/default/exim4から設定項目を抜き出すと以下のようになる。この中でCOMMONOPTIONS変数が定義されていることがわかる。

# grep -v '^$' /etc/default/exim4 | grep -v '#'
EX4DEF_VERSION=''
QUEUERUNNER='combined'
QUEUEINTERVAL='30m'
COMMONOPTIONS=''
QUEUERUNNEROPTIONS=''
QFLAGS=''
SMTPLISTENEROPTIONS=''

そこで、今回はexim4の方法を踏襲してみる。オプションは変数OPTIONSで与えて、変数の定義は/etc/default/atdで行い、これを/etc/init.d/atdから読み込むことにする。以下のようにして/etc/default/atdにOPTION変数を定義させる。

# echo "OPTIONS='-l 1.8'" >> /etc/default/atd
# cat /etc/default/atd
OPTIONS='-l 1.8'

/etc/init.d/atdを編集して、以下の最終行を追加する。これで/etc/default/atdがある場合はこれを読み込む。

# vi /etc/init.d/atd
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/atd
[ -f /etc/default/atd ] && . /etc/default/atd

同様に、start_daemonにOPTION引数を指定する。

        start_daemon $DAEMON $OPTIONS

diffを取ると以下のようになる。

# diff /etc/init.d/atd.old /etc/init.d/atd
18a19
> [ -f /etc/default/atd ] && . /etc/default/atd
27c28
<       start_daemon $DAEMON
---
>       start_daemon $DAEMON $OPTIONS

この後にデーモンを再起動する。

# /etc/init.d/atd restart
Stopping deferred execution scheduler: atd.
Starting deferred execution scheduler: atd.

最後にpsで引数を確認すると-l 1.8が追加されていることがわかる。

 ps ax | grep /atd
 4500 ?        Ss     0:00 /usr/sbin/atd -l 1.8

最後にbatchで追加して走ったかどうかを確認する。

$ batch
warning: commands will be executed using /bin/sh
at> date
at> <EOT>
job 4 at Sun Apr 10 03:26:00 2011

リファレンス

  1. Manpage of ATD
  2. linux batch - Google 検索
  3. Linux の at, batch コマンド
  4. 【 batch 】 自動的にジョブを実行する - Linuxコマンド集:ITpro
  5. debian デーモン 引数 - Google 検索
  6. メモ代わり : Ubuntuのsnmpdのオプション引数の設定。
  7. /etc/default/atd - Google 検索
  8. Bug#480238: No easy way to pass parameters to atd
  9. [ubuntu] atd does not read config - Ubuntu Forums
  10. atd does not read config
  11. Linuxユーザのためのチップス: /etc/defaultにあるファイルは何か?
  12. /etc/default - Google 検索
  13. Bug #527723 in at (Ubuntu): “atd doesn't increase limit load factor on smp systems (upstart)”
  14. atd "load factor" - Google 検索
  15. Man page of ATD
  16. start_daemon - Google 検索
  17. start_daemon man page

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-11-24T03:35:33+09:00
  2. Modified: 2009-11-24T03:35:33+09:00
  3. Generated: 2017-02-20T23:09:18+09:00