💬

さくらレンタルサーバーで重い処理がkillされる場合のnice値に関するお話

2021/09/19に公開

何の話か

さくらレンタルサーバーでLaravelを利用する際に、composerを使う必要がありますが、
composerを実行すると途中で止まってしまうことがあります(ありました)。
composerのように処理時間が長くなるプロセスは、強制的にkillされるというアレです。

この時、niceコマンドを使って、プロセスの優先順位を下げて実行してあげることで、killされなくなる、というTipsがネットを検索すると見つけられます。

本記事は、そのnice値の設定で利用するniceコマンドについて気になる点を調べた結果のメモです。

niceコマンドについて

優先度を指定してコマンドを実行するためのコマンドがniceコマンドです。

@ITさんの記事などで、niceコマンドの解説を読むことができます。
https://atmarkit.itmedia.co.jp/ait/articles/1708/10/news008.html

気になる点とは

優先度を下げる場合の最大値はいくつなの?という話です。

@ITさんの記事では19が最低優先度となっていますが、ネットの記事ではnice +20 ~と、+20を指定しているものもあります。
nice値を指定した効果は得られているので、最大値がいくつであろうと気にしなくても良いのですが、こういうちょっとした違いをなんとなくのまま放置しておくのは良くない!ということで、調べてみます。

確かめる

  • 方法
    実際にコマンドを実行して確かめてみます。
    nice値を指定してsleepを実行し、その時のnice値をps -lの「NI」で確認します。

さくらレンタルサーバー

  • FreeBSD 11.2-RELEASE-p14
  • niceはbuilt-in-commandで、この場合コマンドのオプション指定方法が異なる

nice値 未指定

% sleep 1 & ; ps -l -p `pgrep sleep`
[1] 2705
 UID  PID  PPID CPU PRI NI  VSZ  RSS MWCHAN STAT TT     TIME COMMAND
1009 2705 86968   0  20  0 4240 2048 nanslp SC    0  0:00.00 sleep 1

未指定の場合は、NIはゼロです。

nice値 20を指定

% nice +20 sleep 1 & ; ps -l -p `pgrep sleep`
[1] 2787
 UID  PID  PPID CPU PRI NI  VSZ  RSS MWCHAN STAT TT     TIME COMMAND
1009 2787 86968   0  40 20 4240 2048 nanslp SNC   0  0:00.00 sleep 1

20を指定した場合は、NIは20となります。

nice値 21を指定すると…

% nice +21 sleep 1 & ; ps -l -p `pgrep sleep`
[1] 2806
 UID  PID  PPID CPU PRI NI  VSZ  RSS MWCHAN STAT TT     TIME COMMAND
1009 2806 86968   0  40 20 4240 2048 nanslp SNC   0  0:00.00 sleep 1

試しに、21を指定してみても、NIは20です。
FreeBSDでは、20が最大(最低優先度)のようです。

補足

/usr/bin/nice を直接実行した場合も結果は同じ

% /usr/bin/nice -n +21 sleep 1 & ; ps -l -p `pgrep sleep`
[1] 24434
 UID   PID  PPID CPU PRI NI  VSZ  RSS MWCHAN STAT TT     TIME COMMAND
1009 24434 24115   0  40 20 4240 2048 nanslp SNC   0  0:00.00 sleep 1

Ubuntu 20.04 LTS

nice値 未指定

$ (sleep 1 &); ps -l -p `pgrep sleep`
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000   69436       1  0  80   0 -  1807 hrtime pts/0    00:00:00 sleep

Ubuntuでも未指定の場合のNIはゼロです。

nice値 20を指定

$ (nice -n 20 sleep 1 &); ps -l -p `pgrep sleep`
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000   69440       1  0  99  19 -  1807 hrtime pts/0    00:00:00 sleep

20を指定した場合、NIは19となりました。
というわけで、19が最大(最低優先度)のようです。

おわりに

Ubuntuの場合、nice --helpで表示されるヘルプに指定値は-20から19までという記載があります。

nice --help
Usage: nice [OPTION] [COMMAND [ARG]...]
Run COMMAND with an adjusted niceness, which affects process scheduling.
With no COMMAND, print the current niceness.  Niceness values range from
-20 (most favorable to the process) to 19 (least favorable to the process).

Mandatory arguments to long options are mandatory for short options too.
  -n, --adjustment=N   add integer N to the niceness (default 10)
      --help     display this help and exit
      --version  output version information and exit

NOTE: your shell may have its own version of nice, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report nice translation bugs to <https://translationproject.org/team/>
Full documentation at: <https://www.gnu.org/software/coreutils/nice>
or available locally via: info '(coreutils) nice invocation'

さくらレンタルサーバーでは、niceのヘルプは見られず、niceコマンドのマニュアルには最大値は載っていません。
FreeBSD 11.2 : man nice

結果として、ディストリビューションによってちょっとした違いがある、ということが分かっただけで、その理由などは何もわからないというお話でした。
きっと、「-20から19ってなんだよ。-20から20でいいだろ。」という理由から生まれた違いなのではないか、と勝手に想像しています。

以上です。

Discussion