最近、このWebサーバーが突発的に高負荷状態になることが多くなってきたため、Radiko の録音・エンコードとWebサービスへのアクセス集中が重なると、一気にとんでもない遅さになることがあります。
バックグランドでcron実行していて特にCPUパワーを消費する Radiko の録音とエンコードは、開始から終了まで5時間くらい掛かっているので、このジョブの優先順位をHTTPDよりも下げようかと考えました。
Unixには nice というコマンドがあり、これを使えばプロセス優先順位を下げることが出来ます。
ということは、昔から知ってはいたのですが、プロセス優先順位に手を着けなくちゃならなくなるほど、Unixシステムが常時遅くなることは今までなかったため実際に使用したことはありませんでした。
オンラインマニュアルで、nice コマンドの使い方を確認し、こんな感じでコマンドを発行すればいいと確認しました。
EXAMPLES Execute utility ‘date’ at priority 5 assuming the priority of the shell is 0: nice -n 5 date
これは簡単。コマンドの前に「nice -n 5」(5はスケジューリング値)を書き足せばおしまい。
の、はずでしたが、試してみたところ
> nice -n 5 ffmpeg .......... nice: Badly formed number.
「Badly formed number.」と出てコマンドを実行できません。
悩みました。そして、google 検索してわかりました。
csh には、ビルトイン nice コマンドがあるんだそうです。
> which nice nice: shell built-in command. > whereis nice nice: /usr/bin/nice /usr/share/man/en.UTF-8/man1/nice.1.gz
「nice -n X」という書式で実行可能なのは /usr/bin/nice の方で、ビルトインコマンドの方ではないようです。
試しに、
/usr/bin/nice -n 5 ffmpeg......
と実行してみたところ、エラーは出なくなりました。
スクリプトの編集は、ffmpeg コマンドの前に、niceコマンドのフルパスで指定して無事に完了しました。
csh 系は、niceコマンドの他、alias など内蔵コマンドとかぶることがあるので、慣れない基本的なコマンドを使うとこういうことがたびたび起きます。
さて、音声データエンコードの方は優先順位を下げることでWebサーバーを優先させましたが、サーバーのパワー不足は全然解決していません。CPUかマザーボードのリプレースしか根本対策となる手段が無いため、いずれにせよ近日中にしばらくサーバーを止めないといけなさそうです。はぁ。