b.l0g.jp     About     Archive     Feed

topコマンドでロードアベレージを見る

Linuxにおいて、システムの全体的な負荷状況を知りたい時、リアルタイムの状況を知るにはtopコマンド、ある程度の期間に渡る傾向をつかむにはsar(sysstat)の結果を確認するのが一般的だろう。

そのサーバ上で動作するアプリケーションの動作が遅いなどといったパフォーマンス劣化がある時、まず最初に見るべきがロードアベレージの値。これは「CPUの処理を待っているタスクの数」であり、ほとんど何も処理を行っていない時には0になる。

topコマンドの表示内容

  
top - 16:04:44 up 15 days, 21:40, 2 users, load average: 0.00, 0.00, 0.00
  
Tasks: 108 total, 2 running, 105 sleeping, 0 stopped, 1 zombie
  
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si
  
Mem: 8113608k total, 8082584k used, 31024k free, 69652k buffers
  
Swap: 8385920k total, 352k used, 8385568k free, 6008888k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  
1 root 16 0 1848 552 472 S 0.0 0.0 0:01.32 init
  
2 root RT 0 0 0 0 S 0.0 0.0 0:17.52 migration/0
  
3 root 34 19 0 0 0 S 0.0 0.0 0:00.40 ksoftirqd/0
  
4 root RT 0 0 0 0 S 0.0 0.0 0:15.31 migration/1
  
5 root 34 19 0 0 0 S 0.0 0.0 0:00.32 ksoftirqd/1
  
6 root RT 0 0 0 0 S 0.0 0.0 0:11.21 migration/2
  
7 root 34 19 0 0 0 S 0.0 0.0 0:00.17 ksoftirqd/2
  
8 root RT 0 0 0 0 S 0.0 0.0 0:15.26 migration/3
  
9 root 34 19 0 0 0 S 0.0 0.0 0:00.25 ksoftirqd/3
  
10 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/0
  
11 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/1
  
12 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/2
  
13 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/3
  
14 root 7 -10 0 0 0 S 0.0 0.0 0:00.00 khelper
  
15 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid
  
95 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
  
96 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/1
  

1行目の右端に表示されているのがロードアベレージの値。前述の通りCPUの処理を待っているタスクの数がロードアベレージなので、値が大きければ大きいほどCPUの処理を待っているタスクが多いということになり、それだけサーバのレスポンスが落ちることになる。ただし、単に計算を待っているだけではなく、IOの処理を待っている場合もこの値が大きくなるので、ロードアベレージが大きいことが即CPUが遅いことになるわけではない。CPUそのもの、メモリ、ディスク、それ以外、の何が原因で遅いか調査する必要がある。

なお、topでのロードアベレージの表示は、左から、1分、5分、15分間の平均値になっている。つまり、左の方が値が大きければ、直近の数分間で急に負荷が上がっていることを表す。

言わずもがなだが下半分には、CPUの使用率順に並んだプロセス一覧が表示されるので、ここからCPU負荷が高かったりメモリの使用量が多いアプリケーションが何なのかは大体つかめる。topからなんとなくのあたりをつけたあと、何がボトルネックになっているかを探すには、sarコマンドで過去のパフォーマンスデータを確認していく。

logrotateのローテート世代数を減らす時の注意

本当は「山に行きました!」というブログを投稿したいところなのだが、さっぱり行ける雰囲気がないので、腹いせに技術系の投稿を続けてる。

logrotateを使ってログのローテートを行っている状況で、ログファイルの総容量が大きくなり、世代数を減らさざるを得ないときのこと。「rotate 世代数」の指定を減らしても、古い世代数は削除されない。

具体的には、以下の例。当初logrotate.confで以下の設定をしていたとする。

  
\# see "man logrotate" for details
  
\# rotate log files daily
  
daily

\# keep 10 days worth of backlogs
  
rotate 10

\# create new (empty) log files after rotating old ones
  
create

\# uncomment this if you want your log files compressed
  
#compress

\# RPM packages drop log rotation information into this directory
  
include /etc/logrotate.d
  

この場合、1日1回ローテートされたファイルが10回分保存される。例えば以下のように。

  
ls -v /var/log/httpd/access_log*
  
access\_log access\_log.4 access_log.8
  
access\_log.1 access\_log.5 access_log.9
  
access\_log.2 access\_log.6 access_log.10
  
access\_log.3 access\_log.7
  

ここで、アクセスログ1ファイルずつの容量が増えてきて、ディスク空き容量が減ってきた場合、保存する世代数を減らして対処する場合、「rotate 世代数」の世代数を減らしても、古い世代が一斉に削除されるわけではない。

rotate 5とした場合、次のローテート後には以下のようになる。

  
access\_log access\_log.4 access_log.9
  
access\_log.1 access\_log.5 access_log.10
  
access\_log.2 access\_log.7
  
access\_log.3 access\_log.8
  

つまり、6世代目が消えるだけで、7世代目以降は自動的には削除されないため、手動で削除する必要がある。

これだけ。これが分からなくて危なくディスク使用率が100%になるところだった。

さくらVPSのCentOSにsymfony 1.4.xの環境を構築する

自分でWebサービスを作ってみようと思い立ってsymfonyを勉強し始めて数ヶ月。

しばらく前の話だが、借りていたサーバの使用期限が終わってしまったので、さくらVPSを契約。そこにsymfony 1.4.x(1.4.8)をインストールするときの手順をまとめておく。特にさくらVPSに特化した内容はないので、普通にCentOS上にsymfony 1.4をインストールする手順と同じのはず。

<事前準備・参考>

以下のサイトを参考にして、不要なパッケージの削除、サービス停止、ファイアウォールやSSHなど、基本的なインターネット公開サーバの設定を済ませておく。

http://tanaka.sakura.ad.jp/archives/001065.html

http://www.ideaxidea.com/archives/2010/11/sakura_vps_settings.html

<PHP5.3を配布しているremiリポジトリを有効にする>

このブログ執筆時点のさくらVPSのデフォルトOSはCentOS 5.5(x86_64)だが、これには

PHP5.1.6が含まれており、symfony 1.4.xが動作しないので、最新版5.3をインストール。

PHP5.3のRPMパッケージはremiというリポジトリから配布されているので、yumのリポジトリに設定を追加。

  
\# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
  
\# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
  

<PHP5.3インストール>

  
\# yum install -enablerepo=remi php php-domxml php-devel php-mysql
  

php.iniに以下を追記。追記しないとdate()の使用で警告が出る。

  
date.timezone = "Asia/Tokyo"
  

mb_string関連の関数を使用するために必要なのでphp-mbstringもインストール。

  
\# yum install -enablerepo=remi php-mbstring
  

コンソールで文字を色付けするのに必要なのでphp-processもインストール。

  
\# yum install -enablerepo=remi php-process
  

symfonyで必要なものがそろっているか確認するスクリプトを実行。

  
\# wget http://sf-to.org/1.4/check.php
  
\# php check_configuration.php
  
\***\***\***\***\***\***\***\***\***\*****
  
\* \*
  
\* symfony requirements check \*
  
\* \*
  
\***\***\***\***\***\***\***\***\***\*****

php.ini used by PHP: /etc/php.ini

\*\* WARNING \*\*
  
* The PHP CLI can use a different php.ini file
  
* than the one used with your web server.
  
* If this is the case, please launch this
  
* utility from your web server.
  
\*\* WARNING \*\*

\*\* Mandatory requirements \*\*

OK PHP version is at least 5.2.4 (5.3.3)

\*\* Optional checks \*\*

OK PDO is installed
  
OK PDO has some drivers installed: mysql, sqlite, sqlite2
  
OK PHP-XML module is installed
  
OK XSL module is installed
  
OK The token\_get\_all() function is available
  
OK The mb_strlen() function is available
  
OK The iconv() function is available
  
OK The utf8_decode() is available
  
OK The posix_isatty() is available
  
[[WARNING]] A PHP accelerator is installed: FAILED
  
\*\\*\* Install a PHP accelerator like APC (highly recommended) \*\**
  
OK php.ini has short\_open\_tag set to off
  
OK php.ini has magic\_quotes\_gpc set to off
  
OK php.ini has register_globals set to off
  
OK php.ini has session.auto_start set to off
  
OK PHP version is not 5.2.9
  

<pearインストール>

※ pearでのインストールは推奨されていないが、簡単なのでこれで済ませる

  
\# yum install -enablerepo=remi php-pear
  
\# pear upgrade-all
  

<symfonyインストール>

  
\# pear channel-discover pear.symfony-project.com
  
\# pear install symfony/symfony
  

以下のコマンドでバージョンが表示されたらインストール成功。

  
\# symfony -V
  
symfony version 1.4.8 (/usr/share/pear/symfony)
  

/usr/share/pear/symfonyにインストールされる

<APCインストール>

PHPのアクセラレータであるAPCをインストールしておく。入れなくても動作するが、symfonyでは導入が推奨されているのと、入れただけで高速になるとのことなのでインストール。

  
\# yum install httpd-devel
  
\# yum install -enablerepo=remi php-pecl-apc
  

<httpd起動>

  
\# chkconfig httpd on
  
Syntax OK
  
\# service httpd start
  

ブラウザから http://(サーバのIPアドレス)/ を確認し、phpinfoでapcが読み込まれていることを確認。

※ phpinfoはコマンドラインから以下を実行しても確認できる

  
php 'phpinfo();'
  

<MySQLインストール>

  
\# yum install -enablerepo=remi mysql-server
  

<MySQL設定>

my.cnfに以下を追記して文字コードをUTF-8に

  
[mysqld]
  
default-character-set=utf8
  
character\_set\_server=utf8
  
skip-character-set-client-handshake
  
[mysql]
  
default-character-set=utf8
  

statusコマンドおよび”show variables like ‘char%’;”でUTF-8になっていることを確認(過去エントリも参照)

パスワードを設定

  
\# mysqladmin -u root password パスワード
  

データベース作成

  
\# mysql -uroot -p
  
mysql> create database データベース名;
  

<postfixインストール>

  
\# yum remove sendmail
  
\# yum install postfix
  

/etc/postfix/main.cf を編集

  
\# chkconfig postfix on
  
\# service postfix start
  

メール送信のテスト

  
\# mail -s test あて先
  

※ 本登録前のお試し期間中はOP25Bが有効なので、VPS上のサーバからメールを送信することはできない