- PR -

Linux 2.4でのメモリ管理方式について

投稿者投稿内容
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2005-10-29 21:17
引用:

しるしるさんの書き込み (2005-10-27 10:32) より:
また、swapの存在するディスクはRAID5であるため、確かに「高速」ではない
ですが、たかだか500KB/s程度で問題があるとも考えにくいですし。


量が少なくてもバカにならないですよ。
スワップから読み込む場合、読み込みが完了しないと処理を次に進める
ことができません。読む必要があるのが1ページ(4096バイト)だけ
だとしても、読み込み開始から完了までは数ミリ秒、運が悪いと
10ミリ秒程度待つことになります。CPUにとってはとてつもなく長い
待ち時間です。
もちろん、CPUが読み込み完了をじっと待っていなければならないことは
ありませんが、他に出来ることがなければ待つしかなくなるわけで。

引用:

尚、ディスクのベンチマークを取って、RAID5なディスクと通常のディスクの
速度比較を行っておりますが、お勧めの祖父地はございますでしょうか。
現在はhdparmやbonnie++、iozone、hdbench を試しております。


IOzone と Bonnie(Bonnie++)が定番ですね。
私はBonnieを使ったことはありませんが。

引用:

私感としては、bonnie++が良い(デフォルトで実メモリの倍のファイルを
利用してテストを行う)と思われますが、実行するディレクトリが異なる
(/dev/sda1 と /dev/sda2 等) と結果が倍以上異なる事があったりして、
いまいちです・・・。


何を測っているのか知りませんが、シーケンシャルアクセス性能なら
HDDの内周部と外周部とで2倍程度異なるのは普通です。

それから、HDDのみかけのシリンダ番号やLBAの値がそのままディスク
表面上の位置を表すわけではないことにも注意が必要です。
シリンダ番号何番はディスク上のどこに相当するのか、ということが
確実に分かるのは、通常はHDDのベンダだけです。

追記。
サーバ用HDDのベンチとして定番になっているIometerのことを忘れていました。

それと、普通のサーバではシーケンシャルアクセス性能はわりと
どうでもよいです。重要なのは複数同時アクセスを受けた際にI/Oを
さばける回数(IOPS)のほうで。念のため。

[ メッセージ編集済み 編集者: ぽんす 編集日時 2005-10-30 19:10 ]
しるしる
常連さん
会議室デビュー日: 2005/10/25
投稿数: 24
投稿日時: 2005-11-01 09:30
ご回答を頂き、ありがとうございます。

引用:

量が少なくてもバカにならないですよ。
スワップから読み込む場合、読み込みが完了しないと処理を次に進める
ことができません。読む必要があるのが1ページ(4096バイト)だけ
だとしても、読み込み開始から完了までは数ミリ秒、運が悪いと
10ミリ秒程度待つことになります。CPUにとってはとてつもなく長い
待ち時間です。
もちろん、CPUが読み込み完了をじっと待っていなければならないことは
ありませんが、他に出来ることがなければ待つしかなくなるわけで。



なるほど。HDDからのデータ待ちの状態になるわけですね。
全体的にパフォーマンス測定を行いつつ、再現試験を行って
みます・・・。

引用:

何を測っているのか知りませんが、シーケンシャルアクセス性能なら
HDDの内周部と外周部とで2倍程度異なるのは普通です。

それから、HDDのみかけのシリンダ番号やLBAの値がそのままディスク
表面上の位置を表すわけではないことにも注意が必要です。
シリンダ番号何番はディスク上のどこに相当するのか、ということが
確実に分かるのは、通常はHDDのベンダだけです。



確かに内周部と外周部では速度が変わりますね。これを考えると、
単純にベンチマークをとって速度が倍半分というわけにはいかない
という事ですね。

引用:

それと、普通のサーバではシーケンシャルアクセス性能はわりと
どうでもよいです。重要なのは複数同時アクセスを受けた際にI/Oを
さばける回数(IOPS)のほうで。念のため。



了解しました。ランダムアクセス性能に注視したいと思います。
どうもありがとうございました。
しるしる
常連さん
会議室デビュー日: 2005/10/25
投稿数: 24
投稿日時: 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が発生すると使い物にならない事は
# 今回の問題で判明致しました・・・・。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2005-11-24 20:30
昔の本を読むと、「スワップを使わないようにしようなどと考えるのは
間違いだ」というようなことが書かれていたりします。
ですが、現在では絶対に間違ってるというわけでもないと個人的には
思います。OSのメモリ管理がうまく働いていない兆候があって、なおかつ
メモリ不足が発生しないことに自信があるならば、スワップを使わない
というのも「アリ」じゃあないでしょーか。

本当にメモリが足りなくなった場合、プロセスが起動できないという
ようなわかりやすい症状だけでなく、「コンパイラがエラーを吐く」
といった一見不可解な症状が起こったりもするので、その点が
注意でしょうか。
しるしる
常連さん
会議室デビュー日: 2005/10/25
投稿数: 24
投稿日時: 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/10/25
投稿数: 24
投稿日時: 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/10/25
投稿数: 24
投稿日時: 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
-----
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2005-12-12 12:45
ramfsがスワップとして利用できるようになっているのかどうか知りませんが...
メモリ上にスワップを作るというのはそもそもおかしな話で、なんのために
そうしているのかわからないような複雑な構成はやめておいたほうがよいと思います。

おまけ。
Linuxではddで書き込むときでもブロックデバイスとして扱うので、
バッファの対象となります。このため、巨大なファイルをddで書き込んでいると
メモリの使用量が増えてシステムが極端に重くなる、といった状況が
発生することがあります。他のUnix系OSでは起こらない、Linux独特の欠点です。

スキルアップ/キャリアアップ(JOB@IT)