ablog

不器用で落着きのない技術者のメモ

Oracle LOVERS 勉強会 第19回 in 青山花見 に行って来た

感想というかメモ

Oracle LOVERS 勉強会 第19回 in 青山花見 2010年4月3日 東京都 | DBならOracleでしょ♪ | mixi
前から参加してみたいと思っていた Oracle LOVERS 勉強会 に初参加してきた。
場所は日本オラクル青山センター13F。

数分遅刻して行ったら、みんなホワイトボードの前で話をしている。参加者の名前を書いて、その横に各自が Oracle Database のサーバプロセス1つあたり消費するメモリサイズを想定で書いていく。なんだろうと思ってたら、各自が書いたメモリサイズの順に席順を決めて、お昼ご飯。さすが Oracle Database の勉強会w
弁当は日本オラクル御用達の1500円の豪華弁当。参加者が増えて、1つ足りなくなったので、弁当箱のふたにみんなの弁当からすこしずつ集めて主催者のもとくんβ(id:mototaker)さんの分に。
六本木ヒルズ青山霊園の桜を眼下に隣の方々と雑談しながらお昼ご飯。


お昼が終わったら、会場を提供して頂いた日本オラクルの「山口@OTN シスオペ」として有名な山口さんからの挨拶。
日本側には知らされずに、グローバル側でいつの間にかOTN-J*1のメニューがリニューアルされたとか、OTN掲示板の源流はニフティサーブの時代にあるとか、スレッドが炎上してても常連さんが対応してくれて、山口さんはRRSとかで定期的にチェックするくらいで良いとか、OTN掲示板は日本のほうが先行でグローバルは日本に追随して後からできたとか、OTN掲示板は Jive Forums*2 を使っているとか、いろいろ面白いお話をお聞きした。


OTN山口さんに質問タイム。
メールマガジン「OTN Japan - Dev2DBA」の「シスオペが選ぶ今月の投稿 Best3」はどういう基準で決めてるんですかという質問。聞きたいと思ってたので、質問がかぶった。山口さんからの回答は、面白いかどうか、役にたつかどうか、参考リンクがよいといった基準で選ばれているとのこと。レスの件数でソートして見ていて、アクセス件数は参考程度に見ている。最終的には内容を見て判断している。当然、fire しているものは選ばれない。掲示板のデータは当然 Oracle Database EE に入っている。とのことでした。他にもいくつか質問がありました。
本題の実機を使った勉強会に入る前に、無線LANに接続できない方がいて、参加者全員で2分間ずつPCの前に座って対応。最終的には無事解決!わからないことがあっても、おいてけぼりにしないところが Oracle LOVERS 勉強会 とのこと。強者揃いで参加するの怖いなと思っていたけど、初心者でも参加しやすい雰囲気で個人的には良かった。また、参加しようと思った。


で、本題の実機を使った勉強会に。
もとくんβさんが Amazon EC2 でその場でインスタンスを作っていく。Amazon EC2Amazon Elastic Compute Cloud の略。1ヶ月おきくらいにインタフェースが変わる。などお話を聞きながら、インスタンスが作成されていく。本当は各自の PC から Amazon EC2 上の Oracle Database に接続する予定だったけど、うまくいかなかったので、Amazon EC2 上の別のインスタンスsshで接続して、そこから別インスタンスOracle Databse に SQL*Plus で簡易接続する。で、v$session を見てセッション数を見て、Oracle Database が動いているインスタンスssh 接続して、サーバプロセスを確認して、ps コマンドを使って使用しているメモリサイズを確認して、平均メモリサイズを計算したら、16MB。来た時にホワイトボードに各自が書いた予想で、mixi ネーム SQL嫌いさんが一位。自分は 11MB にしたので、3位くらいだったかな。


最後にちょっと話をさせて頂いたのですが、ps コマンドで表示される RSS のサイズは共有メモリのサイズも含むので、正確にサーバプロセスが使っているメモリを調べようとすると、pmap コマンドで見て、内訳を見ないといけない気がする。とお話しました。

絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

の P.50-83
[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

の P.197-202
にこのあたりの話が書かれています。

帰宅後うだうだ検証してみたこと

帰ってから自宅の環境でちょっと確認してみた。

$ uname -a
Linux centos54.ablog.jp 2.6.18-164.el5 #1 SMP Thu Sep 3 03:33:56 EDT 2009 i686 i686 i386 GNU/Linux

$ cat /etc/issue
CentOS release 5.4 (Final)
Kernel \r on an \m

$ echo 'select * from v$version;'|sqlplus -s / as sysdba

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE	11.2.0.1.0	Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

$ sqlplus / as sysdba
SQL> startup
SQL> exit
$ lsnrctl start
$ sqlplus system/manager@localhost:1521/orcl & # ← 勉強会では別のホストに接続する
$ sqlplus system/manager@localhost:1521/orcl &
$ sqlplus system/manager@localhost:1521/orcl &
$ sqlplus system/manager@localhost:1521/orcl &
$ sqlplus system/manager@localhost:1521/orcl &
$ sqlplus system/manager
SQL> set pagesize 1000
SQL> set linesize 200
SQL> col spid for a4
SQL> col sid for 9999
SQL> col serial# for 9999
SQL> col username for a10
SQL> col program for a40
SQL> col machine for a20
SQL> col osuser for a10
SQL> select proc.spid, ses.sid, ses.serial#, ses.username, ses.program, ses.machine, ses.osuser, proc.pga_used_mem, proc.pga_alloc_mem,proc.pga_freeable_mem,proc.pga_max_mem
from v$session ses, v$process proc
where ses.type = 'USER'
and ses.paddr = proc.addr;

SPID   SID SERIAL# USERNAME   PROGRAM				       MACHINE		    OSUSER     PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
---- ----- ------- ---------- ---------------------------------------- -------------------- ---------- ------------ ------------- ---------------- -----------
3240	25	12 SYSTEM     sqlplus@centos54.ablog.jp (TNS V1-V3)    centos54.ablog.jp    oracle	     878952	  1259676		 0     1259676
3245	28	21 SYSTEM     sqlplus@centos54.ablog.jp (TNS V1-V3)    centos54.ablog.jp    oracle	     676008	   800924		 0	800924
3248	26	12 SYSTEM     sqlplus@centos54.ablog.jp (TNS V1-V3)    centos54.ablog.jp    oracle	     676008	   800924		 0	800924
3251	32	10 SYSTEM     sqlplus@centos54.ablog.jp (TNS V1-V3)    centos54.ablog.jp    oracle	     676008	   800924		 0	800924
3254	 1	10 SYSTEM     sqlplus@centos54.ablog.jp (TNS V1-V3)    centos54.ablog.jp    oracle	     676008	   800924		 0	800924
3258	34	 8 SYSTEM     sqlplus@centos54.ablog.jp (TNS V1-V3)    centos54.ablog.jp    oracle	     840672	  1399040		 0     1399040

6 rows selected.

別のターミナルで、

$ ps auxw|perl -nle 'print if($.==1 or /[o]racleorcl/)'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
oracle    3240  0.0  2.7 570360 28972 ?        Ss   15:52   0:00 oracleorcl (LOCAL=NO)
oracle    3245  0.0  1.8 569832 19496 ?        Ss   15:52   0:00 oracleorcl (LOCAL=NO)
oracle    3248  0.0  1.8 569832 19036 ?        Ss   15:52   0:00 oracleorcl (LOCAL=NO)
oracle    3251  0.0  1.8 569832 19116 ?        Ss   15:52   0:00 oracleorcl (LOCAL=NO)
oracle    3254  0.0  1.8 569832 19012 ?        Ss   15:52   0:00 oracleorcl (LOCAL=NO)
oracle    3258  0.0  2.9 570272 30360 ?        Ss   15:54   0:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
$ ps auxw|perl -lane 'print $F[1] if(/[o]racleorcl/)'|xargs -n1 pmap -x|grep total
total kB  570360       -       -       -
total kB  569832       -       -       -
total kB  569832       -       -       -
total kB  569832       -       -       -
total kB  569832       -       -       -
total kB  570272       -       -       -

ん、RSS じゃなくて、VSZ とサイズが一致してるぞ。

V$PROCESS

このビューは、現在アクティブなプロセスの情報を示します。LATCHWAIT列はプロセスが待機しているラッチを示し、LATCHSPIN列はプロセスがスピンしているラッチを示します。マルチ・プロセッサ・マシン上では、Oracleプロセスは、ラッチで待機する前にそのラッチでスピンします。

データ型 説明
PGA_USED_MEM NUMBER プロセスによって現在使用中のPGAモリー
PGA_ALLOC_MEM NUMBER プロセスによって現在割り当てられているPGAモリー(サーバー・プロセスでオペレーティング・システムにまだ解放されていない使用可能なPGAモリーを含む)
PGA_FREEABLE_MEM NUMBER 解放できる割当済PGAモリー
PGA_MAX_MEM NUMBER プロセスによって割り当てられた最大PGAモリー
動的パフォーマンス(V$)・ビュー: V$NLS_PARAMETERS〜V$XML_AUDIT_TRAIL

twitter でぶつぶつ言ってたら、id:wmo6hash さんから、

. @yoheia Oracle8i for Linux Intel 管理者リファレンス リリース8.1.7 http://bit.ly/c2nI9M の 1-12 (27ページ) に Oracle8iのメモリー要件および使用量 がありまして

http://twitter.com/wmo6hash/status/11586273134

と資料を教えて頂いたので、見てみると、

Oracle8i のメモリー要件および使用量
システム上のユーザー数を決定するために、メモリー要件および使用量を計算します。これ
は、物理メモリー要件およびスワップ領域要件を決定する場合にも役立ちます。次の式を使
用して、メモリー要件を見積もります。

<Oracle実行ファイルのテキストのサイズ> 
+ <SGAのサイズ> 
+ n×( <Tool実行ファイルのプライベート・データ・セクションのサイズ> 
             +<Oracle実行ファイルの未初期化データ・セクションのサイズ> 
             +<スタック用に8192バイト> 
             +<プロセス・ユーザー領域用に2048バイト>) 
            この場合、nはバックグラウンド・プロセスの数を示します。 
各クライアント/サーバー接続に対して、次の式を使用して仮想メモリー要件を見積もります。 
<Oracle実行ファイルのデータ・セクションのサイズ> 
+ <Oracle実行ファイルの未初期化データ・セクションのサイズ> 
+ <スタック用に8192バイト> 
+ <プロセス・ユーザー領域用に2048バイト> 
+ <アプリケーションで必要なカーソル領域> 

実行ファイルのテキスト・サイズ、プライベート・データ・セクションのサイズおよび未初
期化データ・セクションのサイズ(またはDSS)を見積もるには、sizeコマンドを使用し
ます。 Oracle実行ファイル・テキストは共有されているため、プログラムが何度起動されても、
プログラム・テキストがカウントされるのは1回のみです。
実行中のデータベースにユーザーが接続しているときに、実際のOracle物理メモリー
(バックグラウンド・プロセスおよびシャドウ・プロセス)の使用量を計算するには、pmap
コマンドを使用します。pmonプロセスに対しては、共有セクション
(read/write/exec/sharedおよびread/execで示される)を合計します。pmonを含
む各シャドウ・プロセスおよびバックグラウンド・プロセスには、プライベート・セクショ
ン(read/write/execで示される)を合計します。バックグラウンド・プロセス名は、
ora_で始まり、SIDで終わります。シャドウ・プロセス名は、oracleSIDで始まります。
ps -elfコマンドは使用しないでください。このコマンドでは、SZ列が、表示される各プ
ロセスのメモリーの共有部分を繰り返すため、Oracleが使用しているメモリーの量が実際よ
りも多く表示されます。
psコマンドは、プロセス・サイズをページで返します。システムのパッケージ・サイズは、
アーキテクチャによって異なります。 pagesizeコマンドを使用して、サイズが4096バイト
と8192バイトのどちらかであるかを確認します。各プロセスについて、SZ値とページ・サ
イズを掛けます。
Oracle実行ファイルのテキスト・サイズと、システムで実行中のその他のすべてのOracle
Tool実行ファイルのテキスト・サイズを、その小計に加算します。実行ファイルが何度起動
されても、実行ファイルのサイズがカウントされるのは1回のみです。

参照: psコマンドで使用できるスイッチのリストについては、Linux
Intelのドキュメントを参照してください。

http://otndnld.oracle.co.jp/document/products/iserver/oracle8i/817/linux/J02813-01_AR.pdf

す、すばらしいドキュメント!ありがとうございます!!

まとめ

  • Oracle Database が使うメモリは以下の式で表すことができる。
実行バイナリ + 共有ライブラリ + SGA + プロセス数 × 1プロセスの実質メモリ使用量 + ソート用領域
  • 「実行バイナリ + 共有ライブラリ」のサイズはPMONプロセスのメモリの内訳をpmapコマンドで表示し、アクセス権が「r-x--」の領域の合計で算出することができる。
$ pgrep -f ora_pmon|xargs -n1 pmap|perl -lane 'if($F[2] eq q/r-x--/){chop($F[1]);$s+=$F[1];print};END{print "total: ${s}K"}'
00110000     88K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libclsra11.so
00127000    640K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libocr11.so
001c8000     76K r-x--  /lib/libnsl-2.5.so
001db000      4K r-x--  /lib/libnsl-2.5.so
001e3000    632K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libocrb11.so
00282000    340K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libasmclnt11.so
002e4000     28K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libnque11.so
002ee000     36K r-x--  /lib/libnss_files-2.5.so
002f7000      4K r-x--  /lib/libnss_files-2.5.so
0044c000    104K r-x--  /lib/ld-2.5.so
00466000      4K r-x--  /lib/ld-2.5.so
004e6000    752K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libskgxp11.so
005b6000    148K r-x--  /lib/libm-2.5.so
005db000      4K r-x--  /lib/libm-2.5.so
005df000      8K r-x--  /lib/libdl-2.5.so
005e1000      4K r-x--  /lib/libdl-2.5.so
005e5000     76K r-x--  /lib/libpthread-2.5.so
005f8000      4K r-x--  /lib/libpthread-2.5.so
005fe000     28K r-x--  /lib/librt-2.5.so
00605000      4K r-x--  /lib/librt-2.5.so
0068f000      4K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libodmd11.so
0072c000     40K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libocrutl11.so
00737000   1276K r-x--  /lib/libc-2.5.so
00876000      8K r-x--  /lib/libc-2.5.so
00946000      4K r-x--  /usr/lib/libaio.so.1.0.1
009d3000      4K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libskgxn2.so
00a32000   2164K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libnnz11.so
00e13000      4K r-x--    [ anon ]
00eda000    120K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libdbcfg11.so
00f47000    248K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libcell11.so
00f8a000   3888K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libhasgen11.so
08048000 136740K r-x--  /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
total: 147484K
  • 「SGA」はPMONプロセスのメモリの内訳をpmapコマンドで表示し、アクセス権が「...s..」の領域の合計で算出することができる。
$ pgrep -f ora_pmon|xargs -n1 pmap|perl -lane 'if($F[2] eq q/rwxs-/){chop($F[1]);$s+=$F[1];print};END{print "total: ${s}K"}'
001e1000      4K rwxs-  /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_orcl.dat
20001000   4092K rwxs-  /dev/shm/ora_orcl_98305_0
20400000   4096K rwxs-  /dev/shm/ora_orcl_98305_1
20800000   4096K rwxs-  /dev/shm/ora_orcl_98305_2
20c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_3
21000000   4096K rwxs-  /dev/shm/ora_orcl_98305_4
21400000   4096K rwxs-  /dev/shm/ora_orcl_98305_5
21800000   4096K rwxs-  /dev/shm/ora_orcl_98305_6
21c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_7
22000000   4096K rwxs-  /dev/shm/ora_orcl_98305_8
22400000   4096K rwxs-  /dev/shm/ora_orcl_98305_9
22800000   4096K rwxs-  /dev/shm/ora_orcl_98305_10
22c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_11
23000000   4096K rwxs-  /dev/shm/ora_orcl_98305_12
23400000   4096K rwxs-  /dev/shm/ora_orcl_98305_13
23800000   4096K rwxs-  /dev/shm/ora_orcl_98305_14
23c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_15
24000000   4096K rwxs-  /dev/shm/ora_orcl_98305_16
24400000   4096K rwxs-  /dev/shm/ora_orcl_98305_17
24800000   4096K rwxs-  /dev/shm/ora_orcl_98305_18
24c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_19
25000000   4096K rwxs-  /dev/shm/ora_orcl_98305_20
25400000   4096K rwxs-  /dev/shm/ora_orcl_98305_21
25800000   4096K rwxs-  /dev/shm/ora_orcl_98305_22
25c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_23
26000000   4096K rwxs-  /dev/shm/ora_orcl_98305_24
26400000   4096K rwxs-  /dev/shm/ora_orcl_98305_25
26800000   4096K rwxs-  /dev/shm/ora_orcl_98305_26
26c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_27
27000000   4096K rwxs-  /dev/shm/ora_orcl_98305_28
27400000   4096K rwxs-  /dev/shm/ora_orcl_98305_29
27800000   4096K rwxs-  /dev/shm/ora_orcl_98305_30
27c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_31
28000000   4096K rwxs-  /dev/shm/ora_orcl_98305_32
28400000   4096K rwxs-  /dev/shm/ora_orcl_98305_33
28800000   4096K rwxs-  /dev/shm/ora_orcl_98305_34
28c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_35
29000000   4096K rwxs-  /dev/shm/ora_orcl_98305_36
29400000   4096K rwxs-  /dev/shm/ora_orcl_98305_37
29800000   4096K rwxs-  /dev/shm/ora_orcl_98305_38
29c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_39
2a000000   4096K rwxs-  /dev/shm/ora_orcl_98305_40
2a400000   4096K rwxs-  /dev/shm/ora_orcl_98305_41
2a800000   4096K rwxs-  /dev/shm/ora_orcl_98305_42
2ac00000   4096K rwxs-  /dev/shm/ora_orcl_98305_43
2b000000   4096K rwxs-  /dev/shm/ora_orcl_98305_44
2b400000   4096K rwxs-  /dev/shm/ora_orcl_98305_45
2b800000   4096K rwxs-  /dev/shm/ora_orcl_98305_46
2bc00000   4096K rwxs-  /dev/shm/ora_orcl_98305_47
2c000000   4096K rwxs-  /dev/shm/ora_orcl_98305_48
2c400000   4096K rwxs-  /dev/shm/ora_orcl_98305_49
2c800000   4096K rwxs-  /dev/shm/ora_orcl_98305_50
2cc00000   4096K rwxs-  /dev/shm/ora_orcl_98305_51
2d000000   4096K rwxs-  /dev/shm/ora_orcl_98305_52
2d400000   4096K rwxs-  /dev/shm/ora_orcl_98305_53
2d800000   4096K rwxs-  /dev/shm/ora_orcl_98305_54
2dc00000   4096K rwxs-  /dev/shm/ora_orcl_98305_55
2e000000   4096K rwxs-  /dev/shm/ora_orcl_98305_56
2e400000   4096K rwxs-  /dev/shm/ora_orcl_98305_57
2e800000   4096K rwxs-  /dev/shm/ora_orcl_98305_58
2ec00000   4096K rwxs-  /dev/shm/ora_orcl_98305_59
2f000000   4096K rwxs-  /dev/shm/ora_orcl_98305_60
2f400000   4096K rwxs-  /dev/shm/ora_orcl_98305_61
2f800000   4096K rwxs-  /dev/shm/ora_orcl_98305_62
2fc00000   4096K rwxs-  /dev/shm/ora_orcl_98305_63
30000000   4096K rwxs-  /dev/shm/ora_orcl_98305_64
30400000   4096K rwxs-  /dev/shm/ora_orcl_98305_65
30800000   4096K rwxs-  /dev/shm/ora_orcl_98305_66
30c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_67
31000000   4096K rwxs-  /dev/shm/ora_orcl_98305_68
31400000   4096K rwxs-  /dev/shm/ora_orcl_98305_69
31800000   4096K rwxs-  /dev/shm/ora_orcl_98305_70
31c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_71
32000000   4096K rwxs-  /dev/shm/ora_orcl_98305_72
32400000   4096K rwxs-  /dev/shm/ora_orcl_98305_73
32800000   4096K rwxs-  /dev/shm/ora_orcl_98305_74
32c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_75
33000000   4096K rwxs-  /dev/shm/ora_orcl_98305_76
33400000   4096K rwxs-  /dev/shm/ora_orcl_98305_77
33800000   4096K rwxs-  /dev/shm/ora_orcl_98305_78
33c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_79
34000000   4096K rwxs-  /dev/shm/ora_orcl_98305_80
34400000   4096K rwxs-  /dev/shm/ora_orcl_98305_81
34800000   4096K rwxs-  /dev/shm/ora_orcl_98305_82
34c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_83
35000000   4096K rwxs-  /dev/shm/ora_orcl_98305_84
35400000   4096K rwxs-  /dev/shm/ora_orcl_98305_85
35800000   4096K rwxs-  /dev/shm/ora_orcl_98305_86
35c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_87
36000000   4096K rwxs-  /dev/shm/ora_orcl_98305_88
36400000   4096K rwxs-  /dev/shm/ora_orcl_98305_89
36800000   4096K rwxs-  /dev/shm/ora_orcl_98305_90
36c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_91
37000000   4096K rwxs-  /dev/shm/ora_orcl_98305_92
37400000   4096K rwxs-  /dev/shm/ora_orcl_98305_93
37800000   4096K rwxs-  /dev/shm/ora_orcl_98305_94
37c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_95
38000000   4096K rwxs-  /dev/shm/ora_orcl_98305_96
38400000   4096K rwxs-  /dev/shm/ora_orcl_98305_97
38800000   4096K rwxs-  /dev/shm/ora_orcl_98305_98
38c00000   4096K rwxs-  /dev/shm/ora_orcl_98305_99
39000000   4096K rwxs-  /dev/shm/ora_orcl_98305_100
39400000   4096K rwxs-  /dev/shm/ora_orcl_98305_101
total: 417792K
  • 各プロセスが使用する実質メモリ使用量、つまり共有メモリ、共有ライブラリ、実行バイナリなどを除いたサイズは、各プロセスのメモリの内訳をpmapコマンドで表示し、アクセス権が「rwx--」の領域の合計で算出することができる。
$ pgrep -f ora_pmon|xargs -n1 pmap|perl -lane 'if($F[2] eq q/rwx--/){chop($F[1]);$s+=$F[1];print};END{print "total: ${s}K"}'
00126000      4K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libclsra11.so
001c7000      4K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libocr11.so
001dc000      4K rwx--  /lib/libnsl-2.5.so
001dd000     16K rwx--    [ anon ]
001e2000      4K rwx--    [ anon ]
00281000      4K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libocrb11.so
002d7000     52K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libasmclnt11.so
002eb000      8K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libnque11.so
002ed000      4K rwx--    [ anon ]
002f8000      4K rwx--  /lib/libnss_files-2.5.so
002f9000    484K rwx--    [ anon ]
00379000      4K rwx--    [ anon ]
0037a000     24K rwx--  /dev/zero
00380000     64K rwx--  /dev/zero
00390000     64K rwx--  /dev/zero
003a0000     64K rwx--  /dev/zero
003b0000    296K rwx--  /dev/zero
003fa000    260K rwx--    [ anon ]
00467000      4K rwx--  /lib/ld-2.5.so
005a2000     12K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libskgxp11.so
005dc000      4K rwx--  /lib/libm-2.5.so
005e2000      4K rwx--  /lib/libdl-2.5.so
005f9000      4K rwx--  /lib/libpthread-2.5.so
005fa000      8K rwx--    [ anon ]
00606000      4K rwx--  /lib/librt-2.5.so
00690000      4K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libodmd11.so
006c5000      4K rwx--    [ anon ]
00736000      4K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libocrutl11.so
00878000      4K rwx--  /lib/libc-2.5.so
00879000     12K rwx--    [ anon ]
008c3000      4K rwx--    [ anon ]
00947000      4K rwx--  /usr/lib/libaio.so.1.0.1
0096b000      4K rwx--    [ anon ]
009d4000      4K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libskgxn2.so
00c4f000    184K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libnnz11.so
00c7d000   1096K rwx--    [ anon ]
00da1000     64K rwx--    [ anon ]
00df1000     64K rwx--    [ anon ]
00ef8000      8K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libdbcfg11.so
00f0b000     64K rwx--    [ anon ]
00f85000     20K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libcell11.so
01356000     40K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/lib/libhasgen11.so
01360000     16K rwx--    [ anon ]
105d1000   1004K rwx--  /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
106cc000    200K rwx--    [ anon ]
1131c000    720K rwx--    [ anon ]
bf941000     84K rwx--    [ stack ]
total: 5012K
  • 最後に、Oracle Database で使っているメモリサイズをSGA、共有されているPGA(実行バイナリ、共有ライブラリ等)、共有されていないPGA に分けて表示するシェルスクリプトを作ってみた。
#!/bin/bash
export LANG=C

# show SGA
pgrep -f ora_pmon|xargs -n1 pmap|\
        perl -lane 'if($F[2] eq q/rwxs-/){chop($F[1]);$s+=$F[1]};END{print "SGA: ${s}K"}'

# show PGA(SHARED)
pgrep -f ora_pmon|xargs -n1 pmap|\
        perl -lane 'if($F[2] eq q/r-x--/){chop($F[1]);$s+=$F[1]};END{print "PGA(SHARED): ${s}K\n"}'

# show PGA(NOT SHARED)
echo 'PGA(NOT SHARED):'
echo 'PID  NAME          KB'
echo '---- ------------- ------'
pgrep -f '^ora_|^oracle'|while read LINE
do
echo ${LINE} `cat /proc/${LINE}/cmdline` `pmap ${LINE}|\
        perl -lane 'if($F[2] eq q/rwx--/){chop($F[1]);$s+=$F[1]}END{print "$s"}'`
done

実行してみるとこんな感じ。

$ ./show_oracle_memory_size.sh 
SGA: 417796K
PGA(SHARED): 147484K

PGA(NOT SHARED):
PID  NAME          KB
---- ------------- ------
3129 ora_pmon_orcl 5012
3131 ora_vktm_orcl 4448
3135 ora_gen0_orcl 4448
3137 ora_diag_orcl 4448
3139 ora_dbrm_orcl 4456
3141 ora_psp0_orcl 4448
3143 ora_dia0_orcl 4960
3145 ora_mman_orcl 4448
3147 ora_dbw0_orcl 8348
3149 ora_lgwr_orcl 20000
3151 ora_ckpt_orcl 4448
3153 ora_smon_orcl 11192
3155 ora_reco_orcl 4448
3157 ora_mmon_orcl 9180
3159 ora_mmnl_orcl 4448
3161 ora_d000_orcl 4984
3163 ora_s000_orcl 4456
3199 ora_qmnc_orcl 4448
3213 ora_cjq0_orcl 9088
3229 ora_q000_orcl 4992
3231 ora_q001_orcl 4448
3240 oracleorcl(LOCAL=NO) 5000
3245 oracleorcl(LOCAL=NO) 4472
3248 oracleorcl(LOCAL=NO) 4472
3251 oracleorcl(LOCAL=NO) 4472
3254 oracleorcl(LOCAL=NO) 4472
3262 ora_smco_orcl 4448
14192 ora_w000_orcl 4448

このエントリを読んで頂いた方へ。
これであっているのかどうかわからないので、このエントリを鵜呑みにしないでください。
違うよってところがありましたら、ツッコミお願いします。


追記:
http://homepage3.nifty.com/owl_h0h0/unix/job/ORACLE/oracle/pmap_solaris.html

read/exec: テキストセグメント(命令部分)
read/write/exec: データセグメントまたはスタックセグメント(データ領域)
read/write/exec/shared: 共用メモリ