空きメモリの確保の仕方(メモリーチューニング)(kernel2.6)

linux kernel2.6 での メモリーチューニングの方法。大容量物理メモリの場合、ほとんどがページキャッシュ・ファイルキャッシュ。
必要な処置
?A.早めにダーティーページを掃除させる
?B.できるだけスワップさせない
?C.最低空き容量を大きくする。
? →ファイルキャッシュがたまらない
?  →1つのプロセス分の空きメモリを空けていれば、プロセス起動時にスワップしない。
?   →メモリが必要になった瞬間の、スワップによるスローダウンが防げる
A.早めにダーティーページを掃除させる
?pdflushがダーティーページの掃除を行う
? vm.dirty_ratio > ダーティーページの割合 > vm.dirty_background_ratio
? のときpdflushがバックグラウンドで掃除
? ダーティーページの割合 > vm.dirty_ratio
? のときdflushがフォワグラウンドで掃除
 なので、vm.dirty_ratio vm.dirty_background_ratioの値を小さくすれば
 こまめに掃除をし、メモリが空く可能性がある。
 (メモリが必要になったときに、一括で長時間スローダウンすることが
   防げる可能性がある)

 しかし、これだけではダーティーページだけでページキャッシュは開放されない
B.最低空き容量を大きくする。
?空きメモリ容量が vm.min_free_kbytes を下回ったとき
 ページキャッシュは開放される。

  vm.min_free_kbytesの値を大きくすれば、
  ページキャッシュの総量を減らせる。

 極端な話、アプリで最大300MBメモリを使用するなら、
 この値を307200(=300MB*1024)にしておけばスワップしない(バッファキャッシュがあるぞとかスワップアウトのアルゴリズムが・・・とか細かいことは抜きして)



C.できるだけスワップさせない
?vm.swappiness を減らせばスワップしにくくなる。
  (何かのパーセンテージらしい・・・)



[追記]
/proc/sys/vm/drop_caches に値を放り込めば、
キャッシュが即時開放されるらしい(Kernel2.6.16 以降(CentOS5/RHEL5以降))
echo "3" >  /proc/sys/vm/drop_caches
1・・・ページキャッシュのみを解放
2・・・ダーティページとinodeキャッシュを解放
3・・・ ページキャッシュとダーティページとinode
を解放
実行前にsyncを実行したほうがいいらしい。

2はいいとして、1と3をしたら直後にパフォーマンス悪くなりそう・・・
(コマンドを実行するごとにメッセージファイルを読みにいったりしてるの知ってますか?)

kernel2.4の頃みたいに直接キャッシュサイズを指定できたらここまで悩まんでもいいのに・・・


	

DB2 テーブルスペース設計メモ

DB2のテーブルスペース設計に関するメモです。
○容量
テーブルスペースに格納する全テーブル及び全インデックスの合計容量が必要
・テーブル容量とインデックス容量の合計
・テーブル容量
1ページあたりのレコード数=(ページサイズ - ページヘッダー76バイト)/(レコード長 + レコードヘッダー10バイト)
※但しレコード数は255が最大
データ格納ページ数=(見積もり件数/1ページあたりのレコード数)*1.1
テーブル容量=データ格納ページ数*ページサイズ
※ページサイズ
4K、8K、16K、32のいずれか
・列数(項目数)
4K・・・500
それ以上・・・1024
756 列以上を表す IXF データ・ファイルをインポートすることはできません。
・レコード長
レコード長が(ページサイズ - (ページヘッダー+α))を超えてはいけない。
* 4kの場合、行の最大長は 4005 バイト。
* 8k の場合、行の最大長は 8101 バイト。
* 16k の場合、行の最大長は 16 293 バイト。
* 32k の場合、行の最大長は 32 677 バイト。
・テーブルサイズ
4K ・・・ 64GB
8K ・・・128GB
16K・・・256GB
32K・・・512GB
・インデックスサイズ
1インデックス容量=(項目長の合計+8バイト)*見積もり件数
インデックス容量=1インデックス容量+1インデックス容量+…..
・REORGするなら、さらにコピーを作成する容量が必要(テーブルスペース内の最大テーブルがもう1個入る容量)
○エクステントサイズ
* 25Mbytes未満の場合は、エクステント・サイズを8にします
* 25~250Mbytesの間の場合は、エクステント・サイズを16にします
* 250~2Gbytesの間の場合は、エクステント・サイズを32にします
* 2Gbytesを超える場合は、エクステント・サイズを64にします
OLAPデータベース、主にスキャンされる表(照会のみ)、
急速に増大する表の場合は、より大きな値を使用します。
表スペースがディスク・アレイ上(RAID)に存在する場合は、
エクステント・サイズをストライプ・サイズ(すなわち、
アレイ内の1つのディスクに書き込まれるデータのサイズ)に設定します。
○プリフェッチサイズ
・RAIDでない場合
プリフェッチ・サイズ=(複数の物理ディスク上に存在する表スペースのコンテナ数)×エクステント・サイズ
・RAIDの場合
プリフェッチ・サイズ=エクステント・サイズ×(アレイ内のパリティ・ディスク以外のディスクの数)
○その他
・マスタ系と詳細データ系に分ける(バッファプールのため)
・さらにデータ更新の種類((IMPORT/INSERT/UPDATE/DELETE) と LOAD)に分ける(トランザクションログ管理のため)
※故に最低4つあれば望ましい

ディスク使用率

コマンド

iostat -d -x 3

ビジーの基準

  • %util が 100%に近ければビジー
  • svctm 50(ミリ秒)以上
  • 平均I/O要求サイズ(avgrq-szフィールド) 平均待機時間(awaitフィールド)が高いとI/O待ちの可能性

平均サービス時間(svctmフィールド)

iostat 秒数 測定回数
avg-cpu: %user %nice %sys %idle

出力項目の説明

  • AIX版 iostat

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

  • %user—アプリケーション使用率
  • %nice—
  • %sys—カーネルのCPU使用率
  • %idle—CPUの未使用率
  • tps—
  • Blk_read/s—ディスクの読み込み量(ブロック/秒)
  • Blk_wrtn/s—ディスクの書き込み量 Blk_read—ディスクの読み込み総量(ブロック)
  • Blk_wrtn—ディスクの書き込み総量
  • linux版 iostat -xの項目説明

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s avgrq-sz await svctm%util

  • rrqm/s—秒毎にマージされた読み込み要求数
  • wrqm/s—秒毎にマージされた書き込み要求数
  • r/s—読み込み要求数/秒 w/s—書き込み要求数
  • rsec/s—読み込みセクタ数/秒
  • wsec/s—書き込みセクタ数/秒
  • rkB/s—読み込み量(KB)/秒
  • wkB/s—書き込み量(KB)/秒
  • avgrq-sz—I/O要求の平均サイズ(セクタ)
  • avgqu-sz—I/O要求の平均待ち数
  • await—I/O要求の平均待ち時間(ミリ秒)
  • svctm—I/O要求の平均処理時間(ミリ秒)
  • %util—I/O要求におけるCPU消費量(%)

VNCを使わずLinuxデスクトップのGUIアプリを使用する方法

linux/unixのディスプレイがないマシンで、GUIインストールしかできない場合に有効
クライアント(Windows)にはcygwin(X Windowあり)が必要
1.クライアント側のセットアップ・クライアント(Windows) cygwin bash console起動

#X Window起動
$ startx
# 外部マシンからのXの接続許可
$ xhost <LinuxマシンのIPアドレス> #無条件に許可するためにはアドレス部分を+にする

2.Linuxマシン側のセットアップ・Linuxマシン

$ export DISPLAY=<WindowsクライアントのIPアドレス>:0

3.確認・Linuxマシン(exportした端末で)

$ xload

Windowsクライアント側に画面が出たら成功

linux スワップ領域追加(ファイル)

linuxでのスワップ領域追加(ファイル)
1.スワップ領域用のファイルを用意 128MBのスワップ領域を用意する
# dd if=/dev/zero of=/var/tmp/swapfile1 bs=1024k count=128 読み込んだブロック数は 128+0 書き込んだブロック数は 128+0 # chmod 600 /var/tmp/swapfile1
2.スワップ領域として準備する
# mkswap /var/tmp/swapfile1 スワップ空間バージョン 1 を設定します、サイズ = 134213632 バイト
3.スワップ領域を有効にする
# free total used free shared buffers cached Mem: 253248 250176 3072 1852 53340 128648 -/+ buffers/cache: 68188 185060 Swap: 522072 72836 449236 # swapon /var/tmp/swapfile1 # free total used free shared buffers cached Mem: 253248 246164 7084 1852 53536 124348 -/+ buffers/cache: 68280 184968 Swap: 653136 72836 580300
4.スワップ領域を解除する
# swapoff /var/tmp/swapfile1 # free total used free shared buffers cached Mem: 253248 249248 4000 1852 53680 128648 -/+ buffers/cache: 66920 186328 Swap: 522072 72836 449236
※スワップが使われているときは、解放されるまで待つ おまけ.スワップの使用状況確認
$ cat /proc/swaps Filename Type Size Used Priority /dev/hda2 partition 787176 120780 -1

ループバックマウント

ディスクのすべてをパーティション割りしてしまっている状況化で、
ファイルシステムの移行のテストとかしたい場合。
ファイルをファイルシステムデバイスとしてしまう方法。
空ファイルを作成(ファイルシステムデバイスにするファイル)

# dd if=/dev/zero of=/var/tmp/mounttest1 count=1 bs=1024k

この例では1GBの領域を/var/tmp/mounttest1に作成
空いてるループバックデバイスの確認

# losetup -f
/dev/loop0

先ほど作成したファイルをループバックファイルとして、ループバックデバイスに関連づける

# losetup /dev/loop0 /var/tmp/mounttest1

おまけ:ファイルシステム作成

# mke2fs /dev/loop0
mke2fs 1.26 (3-Feb-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
128 inodes, 1024 blocks
51 blocks (4.98%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
128 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

マウント

# mount /dev/loop0 /app2

linux システムバックアップリストア(ext2/ext3 dump restore)

linux ext2/ext3ファイルシステム使用時のシステムバックアップリストア方法
こちらにメンテナンスされた(最新版の)文章があります。リンク先をご覧ください。
■ 前提条件

  • レスキューCD(インストールCD)を利用する
  • バックアップイメージは他サーバーのNFSエクスポート領域に配置
  • ファイルシステムはext2またはext3を使用

■ バックアップ
ローカルディスクの全ファイルシステムをバックアップ

# sync #念のため
# dump -0f – <ファイルシステムデバイス> | gzip -c > /backup/<イメージ名>

パーティション構造、lvm構造とかも記録しておく

#fdisk -l
#df
#cat /etc/fstab
# pvdisplay
# lvdisplay

■ リストア
1.インストールCDからブート
起動パラメータは

linux rescue       (レスキューモード)

ネットワークはメニューで設定しない。
後ほどコマンドで設定

# ifconfig eth0 ipaddr 192.168.1.xxx netmask 255.255.255.0

ファイルシステムはマウントしない
インストール済みLINUXを/mnt/sysimageに・・・   → スキップする
シェル起動完了


※ディスク交換した場合ディスクのパーティションを定義

# fdisk

/bootになるパーティションにはブートフラグを立てる。
lvm領域はタイプを8e(LinuxLVM)にする
lvm定義

# lvm pvcreate <デバイス>
# lvm vgcreate <vg名> <pvデバイスファイル>    ※vg名は以前のvg名とあわせる(vmlinuzの中に記録されている??)
# lvm lvcreate –size lv容量 –name lv名 <VG名>

ファイルシステム作成(+スワップ領域作成)

# mke2fs -j <ファイルシステムデバイス>    ※ラベルが設定されていた場合ラベルも設定する
# mkswap <ファイルシステムデバイス>

※上記作業中に中断(電源落とす)して、再開した場合
vgが有効化されていないので有効化する

# lvm vgchagne -ay


2.バックアップイメージを置いたNFS領域をマウント
/backup 以下にバックアップイメージを置いたNFS領域をマウント

# mkdir /backup
# mount -t nfs <NFSサーバーエクスポートディレクトリ> /backup

大抵のディストリビューションのrescueモードはnfsマウントしかできないはず・・・
(家庭用NASでsmbfsのみのものがよくあるので注意!)
3.リストア
”復旧させるファイルシステムのルートディレクトリ”に移動して、リストアする。
一番最初に、/にマウントするファイルシステムを/restoreにマウントし、リストア。その後、/boot などにマウントするファイルシステムを/restore以下に復活しているマウントポイントにマウントしてリストアする。
/tmpになるファイルシステムはリストアしないがrestoreコマンドで使用する(下記参照)ので/restore/tmpなどにマウントすると吉。

# mkdir /restore
# mount -t ext3 -o nouser_xattr <ファイルシステムデバイス> /restore/<従来のマウントポイント>
# cd /restore/<従来のマウントポイント>
# gzip -dc /backup/<バックアップイメージ> | restore -r -T <大容量ファイルが格納できるディレクトリ> -f –
(mountから繰り返し)
# sync

※mountするときは、ファイルシステムタイプを必ず指定すること。rescueモードでは自動的にファイルシステムタイプを認識しない。(よって、ext3でもタイプを指定しなければext2でマウントされてしまう → バックアップイメージが2G超だとrestoreがフリーズする)
※restore時に-Tオプションで大容量ファイルが格納できるディレクトリを指定する。1ファイルをバックアップイメージから抜き出すときに使用するため。この領域がなければrestoreは失敗する(restoreがデフォルトで使用するrescueモードの/tmpは小さい)。復旧予定のディスクの/tmpになるファイルシステムをマウントして、そのディレクトリを指定しておけば良い。
※nouser_xattrは拡張属性を無効にする(つけないとCentOS5で警告が出る)
4.各種設定変更
マウントの情報やらネットワークの情報を必要に応じて変更する。
# vi /etc/fstab
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
# vi /etc/sysconfig/network
# vi /etc/resolv.conf

など・・・


※ディスク交換した場合
5.ブートローダ(grub)のインストールgrubをインストール
chrootしてリストア先のgrubコマンドを直接実行できるようにする。KNOPPIXなどリストアするOSと違うディストリビューションのLiveCDを使用いる場合に有効。この場合chroot後/devにブロックデバイスファイルは当然存在しないので作成してあげディスクにアクセスできるようにする。

# chroot /restore
# MAKEDEV hda # SATAの場合はsda
# /usr/sbin/grub
grub> root (hd0,0)
grub> setup (hd0)
grub> quit


インストールCDをドライブから抜いて再起動。

# sync;sync;sync #←石橋を叩きたい数だけ(笑)
# exit

ハードウェアを交換した場合は再起動中のkudzuで質問に答えてハードウェア情報を更新しておくこと。