- - PR -
Linux 2.4でのメモリ管理方式について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-29 21:17
量が少なくてもバカにならないですよ。 スワップから読み込む場合、読み込みが完了しないと処理を次に進める ことができません。読む必要があるのが1ページ(4096バイト)だけ だとしても、読み込み開始から完了までは数ミリ秒、運が悪いと 10ミリ秒程度待つことになります。CPUにとってはとてつもなく長い 待ち時間です。 もちろん、CPUが読み込み完了をじっと待っていなければならないことは ありませんが、他に出来ることがなければ待つしかなくなるわけで。
IOzone と Bonnie(Bonnie++)が定番ですね。 私はBonnieを使ったことはありませんが。
何を測っているのか知りませんが、シーケンシャルアクセス性能なら HDDの内周部と外周部とで2倍程度異なるのは普通です。 それから、HDDのみかけのシリンダ番号やLBAの値がそのままディスク 表面上の位置を表すわけではないことにも注意が必要です。 シリンダ番号何番はディスク上のどこに相当するのか、ということが 確実に分かるのは、通常はHDDのベンダだけです。 追記。 サーバ用HDDのベンチとして定番になっているIometerのことを忘れていました。 それと、普通のサーバではシーケンシャルアクセス性能はわりと どうでもよいです。重要なのは複数同時アクセスを受けた際にI/Oを さばける回数(IOPS)のほうで。念のため。 [ メッセージ編集済み 編集者: ぽんす 編集日時 2005-10-30 19:10 ] | ||||||||||||
|
投稿日時: 2005-11-01 09:30
ご回答を頂き、ありがとうございます。
なるほど。HDDからのデータ待ちの状態になるわけですね。 全体的にパフォーマンス測定を行いつつ、再現試験を行って みます・・・。
確かに内周部と外周部では速度が変わりますね。これを考えると、 単純にベンチマークをとって速度が倍半分というわけにはいかない という事ですね。
了解しました。ランダムアクセス性能に注視したいと思います。 どうもありがとうございました。 | ||||||||||||
|
投稿日時: 2005-11-11 15:13
vmstat, mpstat, iostat, top, freeのコマンドを5秒毎に実行した状態で
再現試験を実施しました。 結果として、1 - 2 MB/s 以上のスワップのIn/Outが一時的に発生する事で、 iowaitがかなり発生している事が確認出来ました。 以前スワップのIn/Outを確認した際には、監視ソフトにより5分毎の 数値しか取得していなかったため、ピークの値が確認できておりません でした。 その後、スワップを無効(swapoff -a)にして試験を実施したところ、(当然) スワップのIn/Outは発生せず、そこそこ快適に動作したように思います。 結果としてスワップをOFFにした運用を考えておりますが、何か問題等は 考えられますでしょうか。もちろん、実メモリの搭載量以上のメモリが 要求された際に失敗する事は存じております。 # そもそもスワップIn/Outが発生すると使い物にならない事は # 今回の問題で判明致しました・・・・。 | ||||||||||||
|
投稿日時: 2005-11-24 20:30
昔の本を読むと、「スワップを使わないようにしようなどと考えるのは
間違いだ」というようなことが書かれていたりします。 ですが、現在では絶対に間違ってるというわけでもないと個人的には 思います。OSのメモリ管理がうまく働いていない兆候があって、なおかつ メモリ不足が発生しないことに自信があるならば、スワップを使わない というのも「アリ」じゃあないでしょーか。 本当にメモリが足りなくなった場合、プロセスが起動できないという ようなわかりやすい症状だけでなく、「コンパイラがエラーを吐く」 といった一見不可解な症状が起こったりもするので、その点が 注意でしょうか。 | ||||||||||||
|
投稿日時: 2005-11-25 13:43
ぽんす様
いつもご回答を頂き、ありがとうございます。 スワップをオフにした状態 (swapoff -a) で複数人 (先日は一人) で負荷試験を 実施しました所、アプリケーションが固まりました。 (操作しているソフトの画面 が真っ白になる) コンテキストスイッチに時間がかかっているのかと思いましたが、いくら待っても 切り替わりませんでした。 先日一人で順番に操作を行った際にはこのような問題は発生しませんでしたが、 複数人で同時に操作を行うと発生しましたので、やはりスワップをオフにした 状態では、ぽんす様からご指摘を頂きましたように「一見不可解な症状が起こった」 と思われます。 ただし、どうも「本当にメモリが足りなくなった」のではなく、freeによると 実メモリの使用量は 6GB 中の 2.2GB 程度であり、それ以外は Cache や Buffer に使われておりました。どうもスワップを使わない場合の Kernel 2.4 のメモリ 管理等に何らかの問題があるのでは、と感じております。 さて、スワップが存在した時には今回のような問題が発生した事はありませんでした ので、メモリ上にスワップを作成しようと考えております。 以下のように tmpfs を作成しようとしておりますが、スワップとして利用する事が 出来ません。 # 100MB の /ram を作成。 mount -t tmpfs -o size=100m tmpfs /ram # メモリ上にスワップファイルを作成 dd if=/dev/zero of=/ram/swapfile bs=1024 count=100000 # ファイルをスワップに設定する。 mkswap -c /ram/swapfile Setting up swapspace version 1, size = 102395 kB # ファイルの種別を確認。 file /ram/swapfile /ram/swapfile: Linux/i386 swap file (new style) # スワップに追加する。 swapon /ram/swapfile swapon: /ram/swapfile 無効な引数です 尚、この際に /var/log/messages に以下のログが出力されておりました。 rw_swap_page: bad swap file Unable to find swap-space signature このような操作は通常行わないと思われますが、どなたか解決方法をご存知であれば 教えていただけませんでしょうか。 | ||||||||||||
|
投稿日時: 2005-11-25 14:48
以下の件ですが、解決できました。
strace で追っていくと、 stat64("/ram/swapfile", {st_mode=S_IFREG|0600, st_size=102400000, ...}) = 0 swapon("/ram/swapfile") = -1 EINVAL (Invalid argument) と出ておりました。これはブロックデバイスでない場合に出力されるメッセージ のようです。 tmpfs はブロックデバイスとしてアクセスできないので、代わりに /dev/ram を 使う事でブロックデバイスとしてアクセス出来る事が判明しました。 最大容量の変更には起動時のパラメータ (grub.conf) を変更する必要があるよう なので、時間を調整して作業を行ってみようと思います。 | ||||||||||||
|
投稿日時: 2005-11-30 13:06
1GBのRAMディスクを作成し、その上にスワップ用のスワップファイルをddにて作成
しようとすると、kernelが暴走し停止 (再起動以外では復旧不能) が発生しました。 o 作業内容 以下の作業を実施しました。 - grub.conf の設定変更 1GB の RAM ディスクを利用する為に、/etc/grub.conf を以下のように 設定しました。 kernel ... ramdisk_size=104857 (最後に ramdisk_size を追加) ~~~~~~~~~~~~~~~~~~~ - 再起動 再起動を行いました。 - スワップ領域の作成 別途添付するスクリプトを以下のように実行しました。 ./ramdisk start - 障害内容 当初、上記スクリプト中で MB=1024 としておりました所、dd にて ファイルに /dev/zero を書き込む際にOSの停止が発生しました。 ある容量 (600 - 700MB 以上?) を超えて dd でファイルに書き込もう とすると OS の反応が鈍くなるといった感じで、/var/log/messages には何もログは出力されておりませんでした。 その後再起動を行いました。 次に、MB=700 とした所、dd によるファイルへの書き込みは正常に 完了しました。すぐにスワップ領域を削除 (./ramdisk stop) し ました。(このため、以下の MB=750 のような問題が発生するかどうか は不明です) 最後に、MB=750 とした所、dd によるファイルへの書き込みは 正常に完了し、スワップ領域の追加が行えましたが、1 分程で上記 と同様に暴走しました。このため、再起動を行いました。 以上、当方の認識としては、grub.conf にて確保した領域は全て RAM ディスクとして利用が可能であり、その中にスワップファイル を作成してスワップとして利用する事は可能であると考えており ましたが、操作方法等で何か問題等ございますでしょうか。 ちなみに、上記作業の前に、OS 標準の RAM ディスクの容量 (8MB) 上に dd にてスワップファイルを作成した際には、今回のような問題 は発生しませんでしたので、メモリ容量が多すぎると問題が発生する 可能性も考えております。 以上、何か情報がございましたら、ご教示頂けますようお願いいたします。 ----- #!/bin/bash # # ramdisk This file is executed by init to set a ramdisk up. # # chkconfig: 2345 99 00 # description: post-startup hook for ramdisk . /etc/rc.d/init.d/functions PATH=$PATH:/sbin DEVICE=/dev/ram MNT=/mnt/ram MB=700 KB=`expr $MB \\* 1024 \\* 9 / 10` SWAP=/mnt/ram/swap case "$1" in start) echo -n "Adding SWAP on $SWAP: " /sbin/mkfs.ext3 -m 0 -b 1024 $DEVICE /bin/mount -t ext3 $DEVICE $MNT /bin/dd if=/dev/zero of=$SWAP bs=1024 count=$KB /sbin/mkswap $SWAP /sbin/swapon $SWAP echo ;; stop) echo -n "Removing SWAP on $SWAP: " /sbin/swapoff $SWAP /bin/rm -f $SWAP /bin/umount $MNT echo ;; restart) $0 stop $0 start ;; *) echo "Usage: ramdisk {start|stop|restart}" exit 1 esac exit 0 ----- | ||||||||||||
|
投稿日時: 2005-12-12 12:45
ramfsがスワップとして利用できるようになっているのかどうか知りませんが...
メモリ上にスワップを作るというのはそもそもおかしな話で、なんのために そうしているのかわからないような複雑な構成はやめておいたほうがよいと思います。 おまけ。 Linuxではddで書き込むときでもブロックデバイスとして扱うので、 バッファの対象となります。このため、巨大なファイルをddで書き込んでいると メモリの使用量が増えてシステムが極端に重くなる、といった状況が 発生することがあります。他のUnix系OSでは起こらない、Linux独特の欠点です。 |