引越しでおトクなインターネット回線は?>>

logrotateでログが整理された後、
httpサーバーが再起動されますが、
その後、WEBサイトが見れなくなります。

/etc/init.d/httpd status で見るとrunning ですが、止まっています。
/etc/init.d/httpd restart すると回復します。



/etc/logrotate.d/httpdの中の再起動部分でおかしくなっています。

/var/log/httpd/*log {
missingok
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
}



/bin/kill のところです。

毎回おかしくなる訳ではなく、たまになると言う頻度、httpd restart で回復します。
どういう対応すれば良いでしょうか。。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

どもです、がるです。



> 「/etc/init.d/httpd」とapachectlではapachectlの方が良いのでしょうか?
これは…難しいですねぇ。
私は、ソースコンパイルでinstallするのと、ディストリビューションの関係などからもともと/etc/rc.d/init.dがないので、起動ファイルのほうでapachectl使うほうなのですが。
RedHatなどのディストリであれば、init.d/httpdを使うことで特に問題が出た、って話しも耳にしないので。
起動、停止、再起動などの手順を一本化できれば、選択は自由であるように思います。

> どちらも入れていないので、statusが機能しません。
> ですので使用を避けていました。
status…一応あるのは知っているのですが、そういえば使ったことがあまりないような(苦笑

> あと、apacheのマニュアルでは緩やかな再起動(USR1、graceful)なども推奨されています。
> /etc/init.d/httpd graceful
> はどうなのでしょうか?
ちと今手元にないので、init.d/httpdが graceful引数を持ってるかわからないのですが、持っていると仮定して。
kill -USER1は、避けたほうが無難です。っていうのも(まぁまず無いのですが)シグナルが変更になる可能性が0ではないので。
一方で、graceful引数は「状況次第では積極的に使う」感じになるかと。
判断基準としては
・セキュリティホールとかアタックに対する緊急対策の場合はrestartまたはstop/start
・性能改善などの緊急ではない場合はgraceful
というのが基準になるかと思います。
このあたりは「常にこっち」ではなく、それぞれの特性に合わせて、って感じになるかと思うです。

以上、何かの参考にでもなれば幸いです。
    • good
    • 0
この回答へのお礼

大変参考になりました。
ありがとうございました。

お礼日時:2006/07/05 09:36

がるです。


killprocに関しては…例えば
http://www.ksknet.net/cat24/killproc.html
をご覧いただけると。

端的にいうと、killは「コマンドの一つ」であり、killprocは「起動スクリプト内で用いられることの多い、定義されたファンクション(定義は大抵 /etc/rc.d/init.d/function )」というのが大きく異なります。

で、本題です(…よね?)。

> アパッチの再起動に関しては
> 直接/bin/kill
> /etc/init.d/httpd
> apachectl
とりあえず、直killはあんまりお勧めいたしません。
私は起動もapachectl使うので停止もapachectlしてますが、起動で/etc/init.d/httpdを使っているのであれば停止も/etc/init.d/httpdを使われたほうがより好ましいように思われます。

で…これは個人的見解なのですが。
実はあんまりrestartって信用してないので(苦笑
もし「起動する、概ね数秒程度の、Webの停滞に問題が無い」ようであれば、
/etc/init.d/httpd stop
/etc/init.d/httpd start
がベストであるように思われます。

次点は
/etc/init.d/httpd restart
です。

/etc/init.d/httpd reload
は「設定ファイルの読み直し」というニュアンスが強いので(実際どうかは不明ですが)、あまり好ましくないように思います。

この回答への補足

> 実はあんまりrestartって信用してないので(苦笑

そういう事もあるのですか、
でもうちの「/etc/init.d/httpd」では

case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $httpd
RETVAL=$?
;;
restart)
stop
start
;;

という風になってますので、「stop&start」と「restart」はほぼ完全に等価です。

「/etc/init.d/httpd」とapachectlではapachectlの方が良いのでしょうか?

うちのapachectlは内部でステータス判定にlinksかlynxの入っている方でアクセスしに行きます。

LYNX="lynx -dump"
if [ -x /usr/bin/links ]; then
LYNX="links -dump"
elif [ -x /usr/bin/lynx ]; then
LYNX="lynx -dump"
else
LYNX="none"
fi

どちらも入れていないので、statusが機能しません。
ですので使用を避けていました。

if [ "$LYNX" = "none" ]; then
echo "The 'links' package is required for this functionality."
exit 8
fi

 :
 略
 :


status)
checklynx
$LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '
;;


linksは必要なのでしょうか?

apachectlを使えるならそちらを使うに越したことがないのでしょうか?


あと、apacheのマニュアルでは緩やかな再起動(USR1、graceful)なども推奨されています。

/etc/init.d/httpd graceful

はどうなのでしょうか?

補足日時:2006/06/30 17:58
    • good
    • 0

がるです。

いくつか補足っぽいものを。
んっと、killでの記載が「お決まり」との事なのですが。
いくつかの理由から、/etc/rc.dを使ったほうがよりよろしいかと思われます。
とりあえず端的に、各種デーモンは、いくつか起動方法があります。で、起動と終了(またはrestart)を「異なる手段で行う」と、異なる手段での起動/停止方法の同期を人間がいちいちとる必要があるために(かつ大抵は複数ファイルに渡るために)、結構面倒になります。
一方で、startとstopを同一のファイルから行えば、よっぽどのことが無い限り、大抵は「startと整合性の取れたstop」をすることが出来ます。

具体例としては。「つい」間違えて
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null`

/bin/kill `cat /var/run/httpd.pid 2>/dev/null`
とやって停止させてしまうと。起動マクロによっては「pidファイルが残ったままだからまだ残プロセスがあるから起動しない」みたいな、ちょっと面倒な状況もおきえます(で、こんな簡単なことに「焦っているために」気づかないってのが世の常です(苦笑))。

一方で、同一のマクロでstartとstopを行えば、そのマクロでバグが無い限り、そういったトラブルは可能な限り防げるので。

また、技術の世界において「周りと一緒だから多分大丈夫」は厳禁です。理由は述べるまでもないのですが、基本的に「理由はきちんとした理論の上に立脚する」ものだからです。

あと、
> killとkillprocの使い訳が分りません。
> また、一旦終わらせて改めて開始する場合と -HUPで再起動する場合の使い分けもわかりません。
ですが。killproc については、Googleあたりで検索するといくつか出てきます。
killのHUPについては、
http://www.linux.or.jp/JM/html/procps/man1/kill. …
をご覧いただけるとよろしいかと。
通例「restartと概ね等価」な実装をすることが多いのですが、そのあたりは純粋にアプリ依存なので。

この回答への補足

killproc は沢山ヒットしますが、「killとはここが違う」とか「こう使い分ける」とかが理解できるページには到達できませんでした。

アパッチの再起動に関しては
直接/bin/kill
/etc/init.d/httpd
apachectl
があります。
またシグナルに関して
TERM して改めて起動するべきか?
HUP にするべきか?
USR1 にするべきか?

それらの組み合わせから候補を挙げると以下になりますが、ログローテ後のリスタートとしてどれが適切なのか?
判断に困っています。


(1)/bin/killでHUP(一般的?)
/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true

(2)/etc/init.d/httpdでTERM
/etc/init.d/httpd restart

(3)/etc/init.d/httpdでHUP
/etc/init.d/httpd reload

(4)apachectlでTERM
/usr/sbin/apachectl restart

(5)apachectlでUSR1
/usr/sbin/apachectl graceful


どうしたものでしょうか。

補足日時:2006/06/30 12:35
    • good
    • 0

すべてのプロセスが無くなる前に起動しようとして失敗していた経験があります。

特にSSL使用時。
起動に失敗したときは、httpdプロセスがひとつだけ残っている状態でした。

そのときは「apachectl stop」と「apachctl start」の間に、2秒waitを入れることで解決させました。

この回答への補足

なるほど、そういう場合もあるのですね。
しかし、今回は終了して改めて別プロセスで開始でなく、
プロセスIDに対して再起動をかけている訳ですので微妙に違うのかもしれません。
情報ありがとう御座いました。

補足日時:2006/06/30 00:09
    • good
    • 0

こんばんは。



logrotete.d/httpd の/bin/killの行ですが、
FedoraCore VineLinux CentOS などすべて同じ記述ですし、特に問題ないと思いますが。

私の以前の体験ですが、logrotateの処理中に、/var のパーティションの空き領域が
0%になって、その後のApacheが起動できなかったトラブルがあります。
ディスクの空き領域は十分でしょうか?


>毎回おかしくなる訳ではなく、たまになると言う頻度、httpd restart で回復します。
>どういう対応すれば良いでしょうか。。

いずれにせよ、おかしかった時のログファイルにエラーがはかれていないか確認するのが
問題解決の第一歩ですが、ログを見たことないのでしょうか?

この回答への補足

私はターボ10です。
パーティションの容量は確認しましたが大丈夫でした。
ログも見ましたがこの部分に関して特に自分が分かる範囲での手掛かりはありませんでした。
ログ整理のスクリプトに失敗した事でログを見ないといけないというのは皮肉なものですね。。

補足日時:2006/06/29 23:45
    • good
    • 0

がると申します。


logrotateはあまり使わないのですが(自分でシェル書いたほうが以下略)。
気に掛かるのは、killのところです。
昨今のディストリビューションを使われているのであれば、恐らくはkillコマンドでHUPシグナル送るよりも、丁寧に(というか起動ルートを一本化する意味合いを込めて)
/etc/init.d/httpd stop
/etc/init.d/httpd start
(または /etc/init.d/httpd restart)
としておくほうが整合性が取れると思うのですがどうでしょうか?

直接の原因かは微妙なのですが、ちと気になったので。

この回答への補足

killのところは自分で書いたのではなくディストリビューションの範囲でインストールした結果そうなっているようです。

/bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true

という書き方もお決まりのようです。
いっそこの部分を
/etc/init.d/httpd restart
に書き換えてやろうかと思ったのですが、
お決まりを崩して大丈夫なのかと心配だったので書き込んでみました。

それと疑問なのが
logrotateのなかのhttpの再起動はネット検索でヒットするどれもがkillで行われていますが、/etc/init.d/httpdのなかの起動、停止はkillprocです。

killとkillprocの使い訳が分りません。

また、一旦終わらせて改めて開始する場合と -HUPで再起動する場合の使い分けもわかりません。

この辺をご指導頂けませんでしょうか。

補足日時:2006/06/29 23:32
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qlogrotateの再起動

先日、使用していたサーバの
/var/log内のデータが溢れてしまい
Syslog、cronなどが止まってしまいました。

現在は、Syslog、cronなどは再起動をかけたので動いているのですが
logrotateがされず、このままだとまたあふれてしまう可能性があります…。
(あふれる前は動いていたのですが、Syslogのデータを/var/log/ないで行っており、整理をしなかったので溢れてしまいました)

私の考えでは、cronを再起動させれば動くものだとばかり思っていたのですが
うまくいかず、どうしたらいいのか困っています。

どなたか、同じような経験をされた方、対処法をご存知の方ご教授頂けないでしょうか?
よろしくお願いします。

Aベストアンサー

lowrider_2005 さんの回答で十分と思いますが、

> 私の考えでは、cronを再起動させれば動くものだとばかり思っていた
> のですがうまくいかず、どうしたらいいのか困っています。

logrotate は設定した条件が満たされた場合にログのローテーションを行
います。ログがあふれそうで緊急にローテーションさせたいというときに
は、

# logrotate -f /etc/logrotate.conf

のように '-f' をつけて logrotate コマンドを実行すると強制的に
ローテーションします。

QNTPで同期が始まらない

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntpq -pの結果は下記となります。

remote refid st t when poll reach delay offset jitter
==============================================================================
133.100.9.2 .INIT. 16 u - 64 0 0.000 0.000 4000.00
130.69.251.23 .GPS. 1 u 27 64 377 8.015 -99970. 17262.6

同期ができれば「remote」列に「*」が表示されると思っています。
何か設定が足りないでしょうか?。
尚、「/vat/log/message」をtailしてますが特にエラーは無さそうです。

よろしくお願いします。

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntp...続きを読む

Aベストアンサー

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハードウエアclockを合わせます。
http://www.linux.or.jp/JM/html/util-linux/man8/hwclock.8.html

○ntpdの動作
ntpによる時刻調整は、調整幅が通常128mSと小さいので、1時間は様子をましょう。
2時間程度経過しても、時刻修正の兆候が見られない場合ハードウェアの不良も考えられます。

時刻調整の兆候としては、
・logファイルに 一時間毎に調整したメッセージが書かれる。
Jan 7 21:57:40 ntpd[91145]: offset 0.000994 sec freq -190.802 ppm error 0.000076 poll 8
・ntpq -p の出力の最初の桁に"*,+"が付く。また、reach が377になる。
% ntpq -np
remote refid st t when poll reach delay offset jitter
+192.168.0.102 GPS_NMEA(0) 2 u 3 32 377 0.926 -0.330 0.023
*192.168.0.192 GPS_NMEA(1) 2 u 10 32 377 0.747 -0.336 0.023
192.168.0.9 PPS(1) 2 u 3 32 377 0.757 6.559 0.161


○その他
・PC起動時には、システムクロックを計測してその後の動作の基準にしていますが、
CMOSバッテリ不足やハードウェアに何らかの異常があるととんでもない時刻を示すことがあります。(要修理です)
・BIOSの時計も起動時の初期時刻として使われてしまうので、ある程度合わせておいた方がいいです。

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハ...続きを読む

Qレッドハットのバージョン確認方法

自分のサーバで使用しているREDHATのバージョン確認はどうすればいいのでしょうか?

more /etc/issue
とやっても英文しか出てきませんでした。

uname -all
でもカーネルのバージョンは出るのですが、REDHATのバージョンは出ませんでした。

Aベストアンサー

> more /etc/issue
> とやっても英文しか出てきませんでした。

その英文にはRedHatのバージョンは書いてなかったのですか?
書いていなかったとしたら、管理者により編集されている可能性
がありますね。

cat /etc/redhat-release

ではいかがでしょう?
やっぱり英文ですけど。

rpm -q redhat-release

でもいいかも

Qunix の exit 1, exit 0について

unixの超初心者です。
viで作るプログラムで、if 構文の中に、exit 0 とexit 1がありますが、exit 0は、正常終了。
exit 1は、異常終了と言葉では理解してますが、よくわかりません。
(1)じぶんの理解では、exit 0がif文がとりあえず終わったと、
そして、exit 1は、後にも続くかも?みたいに理解してるんですが、elseの後なので(elseがあっても入ってない時がある)。
どうでしょうか?
(2)それと これは fiの前に入れるものなんでしょうか?
最後のexit 0は fiの後に入れてるようですが?間違い?
(3)if,else,fi. if,else,fi. if,else,fiと続く場合exit 1 を入れてないif 文もありますが、どうちがうんでしょう?
(4)exit だけの場合との違いは、何なんでしょうか?
すごく混乱してます、よろしくお教えください。

Aベストアンサー

exit にあたると、その時点で処理は終了されます。
なのでIF文の分岐でExitがあれば、そこで終了。
その下のロジックは処理されません。
Exit 0 と後ろにつける数字は終了ステータスを示します。

通常は0 を正常として、1を警告、2をエラーなどにします。
これを実行元に返し、プログラムが正常に終了したかどうかの判断元にします。
例えば、2が返された場合は、システム管理者にメールを送付するなどのアラートなんかにも使われます。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

QVMWare仮想ソケット数とソケットあたりのコア数

VMWareバージョン5.0から仮想OSに割り当てるCPUの設定で仮想ソケット数とソケットあたりのコア数というのがあり、それぞれを掛けた値が仮想OS毎のコア合計数となる様です。
以下の内容について教えていただけませんでしょうか。

(1)ソケット数とコア数がどのようなものなのかというのが解っていません。
どのように算出された計算値からこれを設定すればいいのか教えていただけますでしょうか。

(2)コア合計数を2としたい場合仮想ソケット数を2にし、ソケットあたりのコア数を1にする
 のでしょうか?それとも逆に仮想ソケット数を1にし、ソケットあたりのコア数を2にすれば
 良いでしょうか?

宜しくお願い致します。

Aベストアンサー

ちょっとかじった程度の技術者です。
専門家ではないので参考程度に。

(1)コアはCPUの中にあり、実際に計算をする部分になります。
複数のコアを持っているCPUは同時に複数の処理をする事ができます。

コア数はCPUによって決まっていて、1つのCPUに2つとか4つとか複数のコアが
搭載されている場合があります。(例:デュアルコア=2個、クアッドコア=4個)

ソケットとはCPUを搭載する部分の事で、1つのソケットに1つのCPUが載ります。

という事で、例えば「クアッドコアのCPUを2個搭載」した場合、
・コア数=4
・ソケット数=2
となり、仮想OSに割り当てられる仮想CPUは「4×2=8個」となります。

(2)仮想ソケット数については「どの様な挙動をさせたいか」「OSの制限」
などによって異なると思います。

デュアルコアCPUが1個搭載されているような挙動を期待しているなら
仮想ソケット数を1に、コア数を2に。
シングルコアのCPUが2個搭載されている様な挙動を期待しているなら
仮想ソケット数を2に、コア数を1に。

OSの制限についてですが、OSによってはソケット数が決まっているケースがあります。
WindowsXPの場合はCPUが2個までしか載せられなかったと思います。
その時は仮想ソケット数は「2」までしか設定できない事になり、仮想CPUを4つに
設定したい時は仮想ソケット数を2に、コア数を2に設定する事になります。

という事でこの場合は「環境と希望による」という回答になると思います。

ちょっとかじった程度の技術者です。
専門家ではないので参考程度に。

(1)コアはCPUの中にあり、実際に計算をする部分になります。
複数のコアを持っているCPUは同時に複数の処理をする事ができます。

コア数はCPUによって決まっていて、1つのCPUに2つとか4つとか複数のコアが
搭載されている場合があります。(例:デュアルコア=2個、クアッドコア=4個)

ソケットとはCPUを搭載する部分の事で、1つのソケットに1つのCPUが載ります。

という事で、例えば「クアッドコアのCPUを2個搭載」した場合、
・コア数...続きを読む

QNTP の TCPポートは?

NTPは123/UDPでようは足りると思うのですが、
WELL KNOWN PORTとかいろいろな資料に「123/TCP」ポートが割当たってます。
ntpd,ntpdate等でNTPを使う場合、実際には123/TCPは使われているのでしょうか?

Aベストアンサー

RFC1305では「ntpには123/udpを割り当てる」となっていますが、RFC1700では「123 ntp」となっており、「123/udp」と明示されているわけではありません。
よって、「123/tcp ntp」が間違っている(または使えない)という明確な根拠にはなりません。

「現状では『123/tcp ntp』を実装するための定義が存在しない」程度に考えた方が良いと思います。

ただ、将来的にRFC2030のSNTPが(IPv6対応などの点で)主流になる可能性があるので、「123/tcp ntp」は定義されない可能性もあります。

Q常時稼動サーバでのapache再起動

UNIX系OSではないのですがこのカテゴリの回答者の方ならお詳しいと
思うので質問します。

任意の設定変更後、反映させる為にapache(httpd)を
再起動させなければいけないですよね?
常時稼動でクライアントも常時接続しているような状況の場合
どの様にしているのでしょうか?

Aベストアンサー

apachectlコマンドが実装されているなら、

apachectl graceful

です。
restartとの違いは、gracefulでは、すでに開いているコネクションは切断されない、ということです。
僕はhttpd.confの設定変更後は

apachectl configtest
> OK
apachectl graceful

というような感じで設定を反映させています。

参考URL:http://httpd.apache.org/docs-2.0/programs/apachectl.html

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qtopコマンドで表示されるVIRT、RESおよびSWAPの意味について

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。

topコマンドの出力結果は下の通りです。
この検証用サーバでは暫定的にパーティション設定でスワップ領域を作成していません。
しかしtopコマンドではVIRTとRESの数値は差異があり、SWAP項目も大きな値を示しているプロセスがあります。

スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、SWAPはゼロとなると予想していたのですがどうしてならないのですか?

top - 03:35:44 up 36 min, 3 users, load average: 0.13, 0.17, 0.20
Tasks: 90 total,  1 running, 89 sleeping,  0 stopped,  0 zombie
Cpu(s): 0.0%us, 1.3%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st
Mem:  515340k total,  452152k used,  63188k free,  18132k buffers
Swap:    0k total,    0k used,    0k free,  347404k cached

 PID USER    PR NI VIRT RES SHR S %CPU %MEM  TIME+ SWAP COMMAND
 4602 tomcat  25  0 645m 28m 6996 S 0.0 5.8  0:04.12 616m java
 2227 root   34  19 25656 10m 2108 S 0.0 2.0  0:00.12 14m yum-updatesd
 1680 root   17  0 11580 9964 240 S 0.0 1.9  0:00.02 1616 restorecond
 1936 haldaemo 18  0 5472 3676 1688 S 0.0 0.7  0:01.20 1796 hald
 2499 root   18  0 10540 2916 1504 S 0.0 0.6  0:00.03 7624 httpd
 3672 root   15  0 10064 2888 2308 S 0.7 0.6  0:02.50 7176 sshd
 3927 root   20  0 9916 2880 2308 S 0.0 0.6  0:00.34 7036 sshd
 2054 root   18  0 10116 2328 1696 S 0.0 0.5  0:00.04 7788 cupsd
 2500 apache  25  0 10540 2088 640 S 0.0 0.4  0:00.00 8452 httpd

どうしてもズレるので画像を添付してます。

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。
...続きを読む

Aベストアンサー

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます。

・プロセスが確保したメモリのうち、まだ一回もアクセスして
 いない部分。
  ⇒アクセスしたときに初めて物理メモリが割り当てられ、
   RESにも計上されていきます。
  (javaのRESに比べてかなり大きいVIRTは、これによるものと
   思われます。大きなヒープサイズを指定していませんか?)

・プロセスが ファイルを仮想メモリ空間にmmap(2) したが、
 まだ一回もアクセスしていない部分。
  ⇒Linux(UNIX) には、あたかもメモリをアクセスするかのように
   ファイルを読み書きできる mmap(2) という機能があり、
   かなり多用されています。mmap直後のファイルは、
   VIRTには計上されますが、物理メモリには読み込まれずRESには計上
   されません。ファイルをmmapした仮想メモリ空間にアクセスした
   部分が、物理メモリに読み込まれRESに計上されます。

> スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、
> SWAPはゼロとなると予想していたのですがどうしてならないのですか?

実は、SWAPとして表示される数値は、単に VIRT と RES の差です。

VERT(仮想メモリ総量)の中には、物理メモリ(RES)やスワップ領域の
使用量だけなく上記で挙げたような仮想空間の部分の合計が含まれ
ますから、スワップ領域がゼロでも、上記で挙げたような空間が
SWAP として表れているのです。

個人的にはこの数値をSWAPと呼ぶのは、かなり不適切だと思いますが、
多くのLinuxディストリビューションのtopコマンドで表示される
SWAP欄は、そういう計算をしているということです。

参考URL:http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます...続きを読む


人気Q&Aランキング

おすすめ情報