コマンドラインから設定する

topの結果をlogに出力する - Code Design

top -b -d 60 > /log/top.log

-b オプションはバッチモード。結果を標準出力に出力する。
-d オプションは動作間隔。単位は秒(小数点以下も2桁まで指定可能。マイナスは不可)。省略するとデフォルト設定で起動する。間隔を短くしすぎるとログが膨大になりすぎるのでここでは60秒で設定。監視目的ならば短い方が良いかと(平均を把握しやすいので)。


本当なら記録するファイルは決めておいて、単位時間でローテーションさせるのが普通だと思うんだけど、とりあえずこれでも動いたので参考までに。

top -b -d 60 > /log/top.log_`date +%y%m%d`

「top.log_090609」というファイル名でログが保存される。

cronで設定する

もし定常的にログを保存することにするのであれば、cronで設定した方がいいかも。

topコマンドを定期的に実行し、実行結果を収集する方法 | Miracle Linux Support

その場合の記述はこんな感じなんだろうなぁ(上記リンク先を参考に)。

*/10 * * * * root /usr/bin/top -b -n 2 -d 10 >> top.log
*/10 * * * * root /usr/bin/top -b -n 2 -d 10 >> top.log_`date '+\%y\%m\%d'`

10分に1回topを起動し、10秒間隔でデータを取得して保存する設定。確かに10秒間隔の方が「たまたまその瞬間だけ高かった(低かった)」というのを回避しやすいし、それを2回セットにして10分間隔で行うことでログが大きくなりすぎるのも回避できそう。
(追記: crontab内には「%」を記述できない。バックスラッシュを付けるか別ファイルに書き出す)



関連リンク

Manpage of TOP
topコマンドの内部オプション - よかろうもん!



蛇足

現在業務で使用しているサーバのLoad Averageが半端無く高いので(Symfonyベースのプログラムがフルに使われてると40余裕で超えたりする…通常時でもコア数は超えてる)、スケールアウトは当然考慮に入れつつもまだ出来る余地はあると信じて徹底的な負荷対策を行っているところ。ログ取るまでもなく、週明け3日くらいの昼休み時間と午後19時以降午前2時くらいまでが壊滅的にやばくて、毎日サーバセンターから電話が掛かってくるんだけども…すみません、すみません。どんなに頑張ってもhttpリクエストが捌ききれないんです。。