2009年 7月 30日 木曜日
やっぱり Sun がスキ!
Sunグッズ紹介(22)
Sun のロゴ入りグッズ紹介の第二十二弾です。
・Sun ロゴ入り腕時計 - Open Source バージョン
文字盤に Duke をあしらったおしゃれな時計です。
ブロック型のケースもセンスがよく、使わないで飾っておきたくなってしまいます。

・Sun ロゴ入りキティちゃん人形
コードネーム "Star Kitty" の名前で知られた Sun Fire 12K 発表時に作成された懐かしい
Goods です。サンロゴの服を着たキティーちゃんはとてもレアな一品です。
・Sun ロゴ入りボールペン - Sun StorageTek 6000 シリーズ
グリップの部分が布製になっており、ホールド感のよいボールペンです。
・Sun ロゴ入りトートバッグ
紺色の丈夫な生地にサンのロゴが映えます。エコバックとしても使えます。
・SUN TECH DAYS 2008 ネームタグ
2008 年に開催した SUN TECH DAYS の記念タグです。
Posted at 02:12午後 7 30, 2009 by Naoyuki Yamada in Goods | 投稿されたコメント[0]
Solaris Cryptographic Framework を GlassFish から利用する方法
今回のブログでは、GlassFish アプリケーションサーバの HTTP(SSL) リスナーにて、UltraSPARC T1/T2 Crypto Accelerator を利用する設定を まとめます。
今回使用するアプリケーションサーバは、Sun GlassFish Enterprise Server v2.1
利用するバイナリは、Sun GlassFish Enterprise Server v2.1 with HADB for Solaris SPARC, Multi-language
sges_ee-2_1-solaris-sparc-ml.bin になります。
まずは、GlassFish のインストールを行いましょう。
# ./sges_ee-2_1-solaris-sparc-ml.bin -console -savestate /var/tmp/sges_ee-savestate
インストールが終了したら GlassFish を起動します。
# /opt/SUNWappserver/bin/asadmin start-domain --user admin domain1
Solaris Cryptographic Framework (SCF) を構成する
Solaris Cryptographic Framework (SCF) ソフトウェアトークンには 非公開情報が含まれているため、pktool(1) コマンドを使用して トークンにパスワードを設定します。 このコマンドは、アプリケーション所有者 (今回は、GlassFish を root として実行するので、root ユーザ) としてシステムにログインすることで、ユーザーのデフォルトキーストア を初期化します。
SCF ソフトウェアトークンのピンを設定する手順
pktool setpin コマンドを実行すると、$HOME/.sunw/pkcs11_softtoken/ ディレクトリ内のソフトウェアトークンデータストアが初期化されます。 これらのファイルは、その内容を保護するために、所有者だけがアクセス できるように作成されます。つまり、ユーザーが妥当なデータストアに アクセスできるように、GlassFish を実行しているのと同じ root ユーザー として初期化を実行する必要があります。
1. root ユーザーになります。
# su - root
2. id コマンドを実行します。
# id
uid=0(root) gid=0(root)
3. pktool コマンドを実行します。
# pktool setpin
トークンパスフレーズを入力してください: <-- 既存のパスフレーズを入力 (デフォルトは changeme)
新しいパスフレーズを作成してください: <-- 新しいパスフレーズ
新しいパスフレーズを再入力してください: <-- 確認の為もう一度入力します
パスフレーズが変更されました。 <-- パスフレーズが変更されたというメッセージが表示されます
#
4. root のホームディレクトリ (/) に移動します。
# cd /
5. アクセス権をチェックします。
# ls -alrR .sunw
.sunw:
合計 9
drwx------ 4 root root 5 7月 27日 17:51 pkcs11_softtoken
drwxr-xr-x 25 root root 29 7月 27日 17:51 ..
drwx------ 3 root root 3 7月 27日 17:51 .
.sunw/pkcs11_softtoken:
合計 14
drwx------ 2 root root 2 7月 27日 17:51 public
drwx------ 2 root root 2 7月 27日 17:51 private
-rw------- 1 root root 103 7月 27日 17:51 objstore_info
drwx------ 3 root root 3 7月 27日 17:51 ..
drwx------ 4 root root 5 7月 27日 17:51 .
.sunw/pkcs11_softtoken/public:
合計 6
drwx------ 4 root root 5 7月 27日 17:51 ..
drwx------ 2 root root 2 7月 27日 17:51 .
.sunw/pkcs11_softtoken/private:
合計 6
drwx------ 4 root root 5 7月 27日 17:51 ..
drwx------ 2 root root 2 7月 27日 17:51 .
sw-90#
cryptoadm を使用して Solaris Cryptographic Framework を管理する手順
cryptoadm ユーティリティーは、システムの暗号化プロバイダ情報の表示、
各プロバイダに対する機構の構成、暗号化プロバイダのインストールまたは
アンインストールを行います。
Solaris Cryptographic Framework では、ユーザーレベルのプロバイダ
(PKCS#11 共有ライブラリ)、カーネルプロバイダ (ロード可能なカーネル
ソフトウェアモジュール)、カーネルハードウェアプロバイダ (暗号化ハード
ウェアデバイス) という 3 種類のプロバイダがサポートされます。
cryptoadm ユーティリティーには、メタスロットの機能を有効化または無効化
するサブコマンド、メタスロットの構成を表示するサブコマンド、
メタスロットの機構のポリシーを構成するサブコマンドがあります。
1. Solaris Cryptographic Framework のすべてのサービスプロバイダと、各プロバイダの暗号化機構を表示するには、cryptoadm list -m を実行します。暗号化プロバイダとして ncp と pkcs11_softtoken.so が利用できることを確認してください。NCP はカーネルプロバイダなので、出力リスト内で pkcs11_kernel.so は pkcs11_softtoken.so よりも前に表示されるはずです。
# cryptoadm list -m
ユーザーレベルプロバイダ:
=====================
プロバイダ: /usr/lib/security/$ISA/pkcs11_kernel.so
メカニズム:
CKM_DSA
CKM_RSA_X_509
CKM_RSA_PKCS
CKM_RSA_PKCS_KEY_PAIR_GEN
CKM_DH_PKCS_KEY_PAIR_GEN
CKM_DH_PKCS_DERIVE
CKM_ECDSA_KEY_PAIR_GEN
CKM_ECDH1_DERIVE
CKM_ECDSA
プロバイダ: /usr/lib/security/$ISA/pkcs11_softtoken.so
メカニズム:
CKM_DES_CBC
CKM_DES_CBC_PAD
CKM_DES_ECB
CKM_DES_KEY_GEN
[.... 省略 ...]
CKM_DSA
CKM_DSA_SHA1
CKM_DSA_KEY_PAIR_GEN
[.... 省略 ...]
CKM_TLS_MASTER_KEY_DERIVE_DH
CKM_SSL3_KEY_AND_MAC_DERIVE
CKM_TLS_KEY_AND_MAC_DERIVE
CKM_TLS_PRF
カーネルソフトウェアプロバイダ:
==========================
swrand: メカニズムが表示されませんでした。
rsa: CKM_RSA_PKCS,CKM_RSA_X_509,CKM_MD5_RSA_PKCS,CKM_SHA1_RSA_PKCS,CKM_SHA256_RSA_PKCS,CKM_SHA384_RSA_PKCS,CKM_SHA512_RSA_PKCS
md5: CKM_MD5,CKM_MD5_HMAC,CKM_MD5_HMAC_GENERAL
sha2: CKM_SHA256,CKM_SHA256_HMAC,CKM_SHA256_HMAC_GENERAL,CKM_SHA384,CKM_SHA384_HMAC,CKM_SHA384_HMAC_GENERAL,CKM_SHA512,CKM_SHA512_HMAC,CKM_SHA512_HMAC_GENERAL
sha1: CKM_SHA_1,CKM_SHA_1_HMAC,CKM_SHA_1_HMAC_GENERAL
blowfish448: CKM_BLOWFISH_ECB,CKM_BLOWFISH_CBC
arcfour2048: CKM_RC4
aes256: CKM_AES_ECB,CKM_AES_CBC,CKM_AES_CTR
des: CKM_DES_ECB,CKM_DES_CBC,CKM_DES3_ECB,CKM_DES3_CBC
カーネルハードウェアプロバイダ:
==========================
ncp/0: CKM_DSA,CKM_RSA_X_509,CKM_RSA_PKCS,CKM_RSA_PKCS_KEY_PAIR_GEN,CKM_DH_PKCS_KEY_PAIR_GEN,CKM_DH_PKCS_DERIVE,CKM_ECDSA_KEY_PAIR_GEN,CKM_ECDH1_DERIVE,CKM_ECDSA
sw-90#
2. 次のユーザーレベル機構を無効にして、その機構が NCP によって実行されるようにします。
# cryptoadm disable provider=/usr/lib/security/'$ISA'/pkcs11_softtoken.so \
mechanism=CKM_SSL3_PRE_MASTER_KEY_GEN,\
CKM_SSL3_MASTER_KEY_DERIVE,CKM_SSL3_KEY_AND_MAC_DERIVE,CKM_SSL3_MASTER_KEY_DERIVE_DH,\
CKM_SSL3_MD5_MAC,CKM_SSL3_SHA1_MAC
3.ユーザーレベル機構が無効になったことを確認します。
# cryptoadm list -p provider=/usr/lib/security/'$ISA'/pkcs11_softtoken.so
/usr/lib/security/$ISA/pkcs11_softtoken.so: すべてのメカニズムが有効です,
except CKM_SSL3_SHA1_MAC,CKM_SSL3_MD5_MAC,CKM_SSL3_MASTER_KEY_DERIVE_DH,
CKM_SSL3_KEY_AND_MAC_DERIVE,CKM_SSL3_MASTER_KEY_DERIVE,
CKM_SSL3_PRE_MASTER_KEY_GEN. random が有効になっています。
SCF プロバイダを構成する手順
NSS では secmod.db を使用して、利用可能な PKCS#11 モジュールを管理します。NSS に付属の CLI のセキュリティーモジュール データベースツール modutil を使用すると、secmod.db ファイル内の PKCS#11 モジュール情報を管理することができます。このセキュリティーモジュールデータベースツールには、PKCS#11 モジュールの追加または削除、パスワードの変更、デフォルトの設定、モジュールの内容の表示、スロットの有効化または無効化などの機能があります。modutil CLI は Messaging Server ソフトウェアにバンドルされており、Messaging-Server-Root/sbin ディレクトリにあります。次の例では、Messaging-Server-Root/sbin ディレクトリから modutil を実行し、cert8.db、secmod.db、および key3.db が config ディレクトリ (Messaging-Server-Root/config) にあると想定します。
1. 利用可能なすべての PKCS#11 モジュールを一覧表示します。
modutil を使用すると、利用可能なすべての PKCS#11 モジュールを一覧表示できます。デフォルトでは、NSS には内部 PKCS#11 モジュールがあります。
# cd /opt/SUNWappserver/domains/domain1/config
# /opt/SUNWappserver/lib/modutil -dbdir . -nocertdb -list
Using database directory ../config...
Listing of PKCS #11 Modules
-----------------------------------------------------------
1. NSS Internal PKCS #11 Module
slots: 2 slots attached
status: loaded
slot: NSS Internal Cryptographic Services
token: NSS Generic Crypto Services
slot: NSS User Private Key and Certificate Services
token: NSS Certificate DB
-----------------------------------------------------------
2. デフォルトの NSS ソフトウェアトークンの内容を表示します。
# /opt/SUNWappserver/lib/certutil -L -d .
verisignclass1ca T,c,c
thawtepersonalpremiumca T,c,c
baltimorecodesigningca T,c,c
verisignclass2g2ca T,c,c
verisignclass3g3ca T,c,c
entrustglobalclientca T,c,c
entrustsslca T,c,c
verisignclass3g2ca T,c,c
thawtepremiumserverca T,c,c
entrust2048ca T,c,c
valicertclass2ca T,c,c
gtecybertrust5ca T,c,c
s1as u,u,u
equifaxsecureebusinessca1 T,c,c
verisignclass1g3ca T,c,c
godaddyclass2ca T,c,c
thawtepersonalbasicca T,c,c
verisignclass1g2ca T,c,c
verisignclass2g3ca T,c,c
equifaxsecureca T,c,c
entrustclientca T,c,c
verisignserverca T,c,c
geotrustglobalca T,c,c
equifaxsecureebusinessca2 T,c,c
verisignclass3ca T,c,c
verisignclass2ca T,c,c
gtecybertrustglobalca T,c,c
entrustgsslca T,c,c
thawtepersonalfreemailca T,c,c
thawteserverca T,c,c
baltimorecybertrustca T,c,c
starfieldclass2ca T,c,c
equifaxsecureglobalebusinessca1 T,c,c
Solaris Cryptographic Framework をサービスプロバイダとして追加する手順
Messaging Server は、NSS 組み込み型ソフトウェアトークンを暗号化に使用するように構成されています。NSS 組み込み型ソフトウェアトークンでは、PKCS#11 を使用して暗号にアクセスします。Solaris Cryptographic Framework のユーザーレベル暗号化フレームワークを使用するように、Messaging Server の構成を変更することができます。その方法は簡単で、/usr/lib/libpkcs11.so ライブラリにリンクして、PKCS#11 の機能に直接アクセスするだけです。つまり、Solaris Cryptographic Framework を PKCS#11 モジュールとして登録します。
1. PKCS#11 ライブラリ /usr/lib/libpkcs11.so を Messaging Server ソフトウェアに登録し、Sun Metaslot というスロットを有効にします。
# ./modutil -dbdir ../config/ -nocertdb -add "Solaris Crypto Framework" -libfile
/usr/lib/libpkcs11.so -mechanisms RSA
WARNING: Performing this operation while the browser is running could cause corruption
of your security databases. If the browser is currently running,
you should exit browser before continuing this operation. Type 'q ' to abort,
or to continue:
Using database directory ../config...
Module "Solaris crypto Framework" added to database.
Sun Metaslot スロットを有効にする手順
1. 次の modutil コマンドを実行します。
# ./modutil -dbdir ../config/ -nocertdb -disable "Solaris Crypto Framework"
WARNING: Performing this operation while the browser is running
could cause corruption of your security databases.
If the browser is currently running,
you should exit browser before continuing this operation.
Type 'q ' to abort, or to continue:
Using database directory ../config...
Slot "Sun Metaslot" disabled.
Slot "ncp/0 Crypto Accel Asym 1.0" disabled.
2. 次の modutil コマンドを実行します。
# ./modutil -dbdir ../config/ -nocertdb -enable "Solaris Crypto Framework" -slot "Sun Metaslot"
WARNING: Performing this operation while the browser is running
could cause corruption of your security databases.
If the browser is currently running,
you should exit browser before continuing this operation.
Type 'q ' to abort, or to continue:
Using database directory ../config...
Slot "Sun Metaslot" enabled.
3. 次の modutil コマンドを実行し、Solaris Crypto Framework が正常に追加されたことを確認します。
# ./modutil -dbdir ../config/ -nocertdb -list
Using database directory ../config...
Listing of PKCS #11 Modules
-----------------------------------------------------------
1. NSS Internal PKCS #11 Module
slots: 2 slots attached
status: loaded
slot: NSS Internal Cryptographic Services
token: NSS Generic Crypto Services
slot: NSS User Private Key and Certificate Services
token: NSS Certificate DB
2. Solaris Crypto Framework
library name: /usr/lib/libpkcs11.so
slots: 2 slots attached
status: loaded
slot: Sun Metaslot
token: Sun Metaslot
slot: ncp/0 Crypto Accel Asym 1.0
token: ncp/0 Crypto Accel Asym 1.0
-----------------------------------------------------------
NSS ソフトウェアトークンから証明書と鍵のペアをエクスポートする手順
1. SSL のリスナーとして設定されている http-listener-2 の Cert nickname を確認する
# /opt/SUNWappserver/bin/asadmin get server.http-service.http-listener.http-listener-2.ssl.\*
管理ユーザー名を入力してください>admin
管理パスワードを入力してください>
server.http-service.http-listener.http-listener-2.ssl.cert-nickname = s1as
server.http-service.http-listener.http-listener-2.ssl.client-auth-enabled = false
server.http-service.http-listener.http-listener-2.ssl.ssl2-ciphers =
server.http-service.http-listener.http-listener-2.ssl.ssl2-enabled = false
server.http-service.http-listener.http-listener-2.ssl.ssl3-enabled = true
server.http-service.http-listener.http-listener-2.ssl.ssl3-tls-ciphers =
server.http-service.http-listener.http-listener-2.ssl.tls-enabled = true
server.http-service.http-listener.http-listener-2.ssl.tls-rollback-enabled = true
#
2. 次のコマンドを実行し、内部トークンに含まれる s1as の証明書を PKCS#12 形式のファイルにエクスポートします。
# /opt/SUNWappserver/lib/pk12util -o /tmp/s1as -n s1as -d /opt/SUNWappserver/domains/domain1/config
Enter Password or Pin for "NSS Certificate DB": <-- GlassFish インストール時に指定したマスターパスワードを入力
Enter password for PKCS12 file: <-- 出力する PKCS#12 形式のファイルのパスワードを設定
Re-enter password: <-- 確認の為再度入力
pk12util: PKCS12 EXPORT SUCCESSFUL
sw-90#
証明書と鍵のペアを Sun Metaslot (SCF) にインポートする手順
1. 次の pk12util コマンドを実行します。
# /opt/SUNWappserver/lib/pk12util -i /tmp/s1as -d /opt/SUNWappserver/domains/domain1/config -h "Sun Metaslot"
Enter Password or Pin for "Sun Metaslot": <-- pktool setpin にて入力したパスワードを入力
Enter password for PKCS12 file: <-- PKCS#12 形式のファイルのパスワードを入力
pk12util: PKCS12 IMPORT SUCCESSFUL
証明書と鍵のペアが正常にインポートされたことを確認する手順
この手順では、証明書と鍵のペアがトークンに正常にインポートされたことを確認します。
1. 次の certutil コマンドを実行します。
# /opt/SUNWappserver/lib/certutil -L -d /opt/SUNWappserver/domains/domain1/config -h "Sun Metaslot"
Enter Password or Pin for "Sun Metaslot": <-- pktool setpin にて入力したパスワードを入力
Sun Metaslot:s1as u,u,u
2. 次の certutil コマンドを実行します。
# /opt/SUNWappserver/lib/certutil -K -d /opt/SUNWappserver/domains/domain1/config -h "Sun Metaslot"
Enter Password or Pin for "Sun Metaslot": <-- pktool setpin にて入力したパスワードを入力
<0> s1as
GlassFish から Solaris Crypto Framework を利用する為の手順
1. SSL のリスナーとして設定されている http-listener-2 の Cert nickname を Sun Metaslot 内にある s1as に変更
# /opt/SUNWappserver/bin/asadmin set --user admin server.http-service.http-listener.http-listener-2.ssl.cert-nickname="Sun Metaslot:s1as"
管理パスワードを入力してください>
server.http-service.http-listener.http-listener-2.ssl.cert-nickname = Sun Metaslot:s1as
#
2. GlassFish を再起動
# /opt/SUNWappserver/bin/asadmin stop-domain
ドメイン domain1 が停止しました。
# /opt/SUNWappserver/bin/asadmin start-domain --user admin domain1
ドメイン domain1 を起動しています。お待ちください。
Default Log location is /opt/SUNWappserver/domains/domain1/logs/server.log.
管理パスワードを入力してください>
マスターパスワードを入力してください>
NSS スロット Sun Metaslot のパスワードを入力してください>
出力を /opt/SUNWappserver/domains/domain1/logs/server.log にリダイレクトしています
ドメイン domain1 が起動しました。
ドメイン [domain1] はその設定で [Sun GlassFish Enterprise Server v2.1 (9.1.1) (build b60e-fcs)] を実行しています。ログは [/opt/SUNWappserver/domains] にあります。
管理コンソールは [https://localhost:4848] で使用できます。
"asadmin" コマンドにも同じポート [4848] を使用します。
ユーザーの Web アプリケーションは次の URL で使用できます:
[http://localhost:8080 https://localhost:8181 ]。
次の web-contexts を使用できます:
[/web1 /__wstx-services ]。
標準の JMX クライアント (JConsole など) はドメイン管理のために JMXServiceURL:
[service:jmx:rmi:///jndi/rmi://sw-90.japan.sun.com:8686/jmxrmi] に接続できます。
ドメインは少なくとも次のポートで接続を待機しています:
[8080 8181 4848 3700 3820 3920 8686 ]。
ドメインはアプリケーションサーバークラスタおよびその他のスタンドアロンインスタンスをサポートします。
sw-90#
Crypto Accelerator が正常に動作している事を確認する
1. 設定した HTTP リスナーのポート番号を確認する
# //opt/SUNWappserver/bin/asadmin get server.http-service.http-listener.http-listene rr-2.\*
管理ユーザー名を入力してください>admin
管理パスワードを入力してください>
server.http-service.http-listener.http-listener-2.acceptor-threads = 1
server.http-service.http-listener.http-listener-2.address = 0.0.0.0
server.http-service.http-listener.http-listener-2.blocking-enabled = false
server.http-service.http-listener.http-listener-2.default-virtual-server = server
server.http-service.http-listener.http-listener-2.enabled = true
server.http-service.http-listener.http-listener-2.external-port =
server.http-service.http-listener.http-listener-2.family = inet
server.http-service.http-listener.http-listener-2.id = http-listener-2
server.http-service.http-listener.http-listener-2.port = 8181
server.http-service.http-listener.http-listener-2.redirect-port =
server.http-service.http-listener.http-listener-2.security-enabled = true
server.http-service.http-listener.http-listener-2.server-name =
server.http-service.http-listener.http-listener-2.xpowered-by = true
#
2. SSL アクセス前の利用状況を確認する
# kstat -n ncp0 -s rsaprivate
module: ncp instance: 0
name: ncp0 class: misc
rsaprivate 1
#
3. https://sw-90.japan.sun.com:8181/ へアクセスする
4. SSL アクセス後、再度利用状況を確認する
※ rsaprivate の値が増えているので、正常に利用している事が確認できる
# kstat -n ncp0 -s rsaprivate
module: ncp instance: 0
name: ncp0 class: misc
rsaprivate 2
#
参考情報
- Using the Cryptographic Accelerators in the UltraSPARCR T1 and T2 Processors
- 特集記事: UltraSPARC T1 プロセッサ搭載のシステム上での Sun Java System Messaging Server 6.3 および Solaris Cryptographic Framework の構成
- Configuring Messaging Server and UltraSPARC T1 and T2 Hardware SSL Acceleration
Posted at 04:00午後 7 29, 2009 by Masayuki Imai in Sun | 投稿されたコメント[0]
Solaris で Oracle を効率的に稼働させるための仕組み
はじめに
wikis.sun.com に Oracle on Sun に関する面白い情報がありましたのでご紹介したいと思います。Oracle データベースを Solaris 上で効率よく安定して稼働させるために、Solaris にどんな技術が実装されて来たのかが時系列でまとまっています。全ての技術を網羅している訳ではありませんが、皆さまのご参考になれば幸いです。元の文書に大きく加筆修正を施していますので、もしお時間があれば元文書もご覧下さい。
初期の技術革新
1993 年、Solaris 2.2 の ISM
Solaris 2.2 で ISM(Intimate Shared Memory) が実装されました。
ISM は、共有メモリ のアドレス変換テーブルをプロセス間で共有する機能です。ISM を使用しない場合は共有メモリのアドレス変換テーブルはプロセス毎に作成されますが、沢山のプロセスが同じ共有メモリを使用すると同じマッピング情報が重複して保持される事になり、カーネルメモリと TLB が無駄になります。SGA に接続する Oracle プロセスの数が多い大規模なシステムでは ISM の共有ページテーブル機能は非常に効果的です。また、ISM を使用して確保されるメモリページは物理メモリ上にロックされるという利点もあります。これにより ISM を使用する Oracle の SGA は常に物理メモリ上に常駐し、スワップアウトされないことが保証されます。これも大規模システムで性能を発揮するのに効果的です。ISM のもう一つの特徴として、大規模ページのサポートがあります。SPARC システムのデフォルトのページサイズは通常 8KB ですが、ISM を使用すると可能な場合は 4MB など、より大きなページサイズが適用されるようになります。大規模ページサイズを使用することでキャッシュミスを抑制し処理の効率が上がります。共有ページテーブル、大規模ページサポート、ページのロックという大規模システムでデータベースを効率よく実行するたに必要が技術が ISM によって実現しました。
試しに Oracle のサーバプロセスに pmap コマンドを実行すると "ism" が使用されていることが分かります。
# pmap -xs 21323
21323: oraclefoo (LOCAL=NO)
Address Kbytes RSS Anon Locked Pgsz Mode Mapped File
...
0000000380000000 2592768 2592768 - 2592768 4M rwxsR [ ism shmid=0x64 ]
# ipcs -ma
IPC status from as of Tue Jul 7 10:50:01 JST 2009
T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME
Shared Memory:
m 100 0x8bba0d8c --rw-r----- oracle dba oracle dba 21 2654994432 423 4957 0:00:01 0:01:11 12:35:55
Jim Mauro が書いた Sun World の記事には ISM の詳細が解説されています。併せてご覧下さい。
ISM の実装は OpenSolaris のソースコードを "ISM" で検索して下さい。
"Oracle Database 管理者リファレンス" の中にも ISM に関する記述があります。
SDC(Solaris Developer Connection) にも ISM の使い方が詳解されています。
Java で ISM を使用する方法はこちらをご覧下さい。
ラッチ保有時のプリエンプション抑制
schedctl_init(3C) を始めとする schedctl API は Solaris のスケジューラによるプリエンプションを抑制するインターフェイスです。クリティカルなロックを保持しているスレッドがプリエンプトされてスレッドの優先順位の逆転が起きてしまうのを防ぎます。ロックを保持しているアプリケーションは schedctl API を使って、スケジューラに対してもう少し長い間 CPU を使用できるように依頼することができます。schedctl API は Oracle ではラッチで使用されています。ラッチを保持しているスレッドがスケジューラによって休眠させられて並列度が制限されることを防ぎます。
64bit Solaris
10 年以上前のことですが、Solaris は 2.7 から 64bit 実装が登場しました。64bit Solaris 上で 64bit Oracle を使用することにより、4GB 以上のメモリを搭載したマシンでもリソースを有効に使える様になりました。当時のフラッグシップだった Sun Enterprise 10000 は最大 64GB のメモリを搭載可能なマシンでした。一方、32bit 版の Oracle では genksms コマンドを使用して初めて 2GB 以上の SGA を確保する事が出来ました。
10 万 tpmC の壁を突破
1999 年、Sun と Oracle は TPC-C で 10 万 tpmC を超えて業界最高性能を達成しました。その時の記録は Sun Enterprise 10000 上の Solaris 2.7 と Oracle 8i の組み合わせで 115,395.73 tpmC です。この結果は、64bit Solaris, ISM, schedctl API 等、ここまで挙げて来た全ての技術革新の結実でした。
当時のプレスリリースはこちらです。
Solaris 9 が 2002 年に登場してから
DISM(Dymanic ISM)
DISM は共有ページテーブル、大規模ページサポートなどの ISM の機能に加えて、必要に応じてサイズを増やしたり、ページをロック/解除する機能を備えています。DISM は ISM の恩恵を受けつつ Oracle 9i から導入された動的 SGA を使用するために必要な機能です。Oracle の SGA_MAX_SIZE, MEMORY_TARGET または MEMORY_MAX_TARGET パラメータが適切に設定されている場合に DISM が使用されます。
また、Solaris の RCM(Reconfiguration Coordination Manager) のスクリプトと DISM, 動的 SGA を組み合わせることで、動的システムドメインからメモリを取り除く際も Oracle を停止せずに運用することが可能です。
Solaris 8 1/01 の機能比較表に DISM についての記載があります。
DISM には 共有ページテーブル、大規模ページサポート、ページのロックなど、 ISM と同じ特長があります。DISM ではこれに加え、他のアプリケーションに メモリを解放するためにページのロックが解除され、共有メモリセグメントの サイズを増やすために新たなページがロックされます。この機能により、Oracle データベースのパフォーマンスが著しく向上します。
Oracle 11g の管理者リファレンスにも DISM についての記載があります。
NUMA システムへの最適化
Solaris 9 9/02 から MPO(Memory Placement Optimization) という機能が実装されました。MPO は NUMA システム上でアプリケーションを効率よく動作させるための仕組みです。CPU からメモリまでの距離に応じて lgroup という区画を設定し、アプリケーションが使用するメモリの割り当て位置やスレッドがスケジュールされる CPU を 最適化します。lgroup へのインターフェイスとして lgrp_init(3LGRP) を始めとする lgroup API も実装されています。
Oracle では SGA のアクセスに lgroup API と madvise(3C) を使用することで NUMA マシンで性能が向上しています。これは Opteron や Nehalem を搭載した NUMA 構成のマシンでも非常に有効です。
Dual Core Opteron x4CPU のマシンで lgroup を表示させた例です。この場合は lgroup が 4 つ作成されています。
# uname -m i86pc # kstat -p 'unix:0:system_misc:ncpus' unix:0:system_misc:ncpus 8 # kstat -p 'lgrp:::cpus' lgrp:1:lgrp1:cpus 2 lgrp:2:lgrp2:cpus 2 lgrp:3:lgrp3:cpus 2 lgrp:4:lgrp4:cpus 2
MPO のドキュメントには Oracle を使用する際の MPO の利点が詳解されています。
Oracle と MPO の関係に関するプレゼンテーション資料もご覧下さい。
こちらは Jonathan Chew による MPO のオーバービューです。
大規模ページサポート
既に ISM, DISM の項で取り上げましたが、Solaris 9 より複数のメモリページサイズがサポートされています。この機能は MPSS(Multiple Page Size Support) と呼ばれ、プロセスが 8KB 以上のページサイズを使用することが可能になっています。特に Oracle の様にメモリの使用量が大きいソフトウェアでは MPSS を使用することで TLB ミスを抑制し、性能を向上することが可能です。
Sun SPARC Enterprise T5220 でサポートされているページサイズは以下の通りです。T5220 では最大 256MB までのページサイズを指定することが可能になっており、CMT マシンでは MPSS は特に有効です。
# uname -im sun4v SUNW,SPARC-Enterprise-T5220 # pagesize -a 8192 65536 4194304 268435456
Oracle の SGA が ISM, DISM により大規模ページサイズを使用していることは既にご紹介している通りです。Oracle 10g では memcntl(2) 関数を通じて PGA にラージページを使用することが可能です。Oracle のパラメータに "_realfree_heap_pagesize_hint=4M" を指定すると mmap() されたヒープがデフォルトの 8KB ではなく 4MB のページを使用する様になります。
MPSS についてはこちらもご覧下さい。
- http://www.solarisinternals.com/wiki/index.php/Multiple_Page_Size_Support
- http://blogs.sun.com/glennf/resource/fawcett.25kscale.pres.rev1.03.pdf
- http://dsstos.blogspot.com/2008/10/realfreeheappagesizehint-assessing.html
poll の改良
アプリケーションのスケーラビリティを高めるために poll インターフェイスにも改良が加わっています。Solaris 固有の機能として /dev/poll が用意されています。また Solaris 10 では Event Completion API が追加されました。
- /dev/poll デバイス
% ls -l /dev/poll lrwxrwxrwx 1 root root 29 Dec 12 2007 /dev/poll -> ../devices/pseudo/poll@0:poll
- http://developers.sun.com/solaris/articles/polling_efficient.html
- http://developers.sun.com/solaris/articles/event_completion.html
スケジューラの改善
Solaris のスケジューラにも改善が施されています。
FX (固定優先順位)スケジューリングクラスは、優先順位の逆転を軽減するために導入されました。FX スケジューリングクラスを使用すると Oracle LGWR プロセスを他の標準的なプロセスより高い優先順位を与えることが可能になります。優先順位の設定は priocntl(1) コマンドを使用します。設定したスケジューリングクラスは子プロセスにも継承されるので、Oracle のリスナープロセスに適切な優先順位を設定しておけば、サーバプロセスも同じ優先順位で実行されます。
また、Oracle CRS ではリアルタイムスケジューリングクラスを使用しています。Oracle RAC は LMS デーモンにリアルタイムクラス使用しており、キャッシュフュージョンは高い優先順位で行われます。
- Solaris で用意されているスケジューリングクラスの一覧
% priocntl -l
CONFIGURED CLASSES
==================
SYS (System Class)
TS (Time Sharing)
Configured TS User Priority Range: -60 through 60
RT (Real Time)
Maximum Configured RT Priority: 59
FX (Fixed priority)
Configured FX User Priority Range: 0 through 60
IA (Interactive)
Configured IA User Priority Range: -60 through 60
- Oracle 11g のドキュメント中の priority inversion の説明
UFS direct I/O の改良
UFS direct I/O は Solaris 2.6 から提供されていますが、Solaris 8 Update 3 から read / write 共に並列実行される様に改良されました。従来の direct I/O はファイル毎に書き込み時の並列度を 1 に制限するロックが設けられており、データベースの更新が多い場合は、このロックの取得が大きなオーバーヘッドになっていました。改善された direct I/O ではファイルサイズに変更がない場合は並列に処理されます。この改善により direct I/O は raw デバイスに対する I/O に近い性能を発揮できる様になりました。
Oracle で direct I/O を使用するには FILESYSTEMIO_OPTIONS 初期化パラメータに SETALL を指定するか UFS のマウントオプションに directio を指定します。
UFS direct I/O の並列処理について詳しくまとめられています。
Solaris Internals のフォローアップページにも詳しく記載されています。
MONITORING AND TUNING ORACLE のブループリントです。
以下は Oracle のドキュメントに記載されている FILESYSTEMIO_OPTIONS 初期化パラメータ情報です。
Solaris 10 が 2005 年に登場してから
MPSS サポートの拡張
MPSS がサポートするページサイズが 256MB まで拡大されました。この最適化はデフォルトで有効になっており、CMT サーバ上で Oracle を稼働させる際に特に性能が向上します。
Ravi の Blog には Sun Fire T2000 サーバ上でデータベースを稼働させた場合のラージページの恩恵がまとめられています。
プロセス間通信用パラメータの管理
project を利用することで、プロセス間通信のパラメータを reboot 無しに変更できる様になりました。Oracle 用のカーネルパラメータも project で管理します。
細かな変更点
その他の修正はこちらにも記載されていますので是非ご参照下さい。
dbwr が aio_waitn(3RT) API を使うときの効率性が上がりました。
- aio_waitn is desired : http://bugs.opensolaris.org/view_bug.do?bug_id=4503970
- http://docs.sun.com/app/docs/doc/817-0697/6mgfsdh34?q=aio_waitn
おわりに
ID 4503970 の レポート にある "There is also a request by Oracle..." という言葉が示しているように、データベースを効率よく動かすために Solaris に実装された仕組みは沢山あります。ここに挙っていない技術でも DTrace, ZFS, FireEngine, Crossbow, Zone, KAIO, libaio, proc tools, Sun Cluster, QFS 等、Solaris には Oracle を運用する上で便利だったり性能向上に貢献する技術が沢山含まれています。また、Solaris が元々備えている高いスケーラビリティや高負荷時の安定性、障害解析能力などの特徴はデータベースを稼働させるのに非常に役立ちます。こういった話もいずれ機会があればご紹介させて頂きたいと思います。
以上、Oracle と Solaris の歴史を機能実装的な側面からご紹介しました。何故 Solaris なのかという疑問が浮かんだ時に一つの答えとなれば幸いです。
Posted at 01:42午後 7 28, 2009 by Daisuke Homma in Sun | 投稿されたコメント[3]
DTrace の flowindent オプション紹介
今回は、DTrace の flowindent オプションを紹介します。
flowindent オプションは、モニタリングするプログラムに対して、関数の開始(entry)と 終了(return)の出力をインデント(->) を付けて表示させる事により、関数の 入れ子関係を把握しやすくする効果があります。
実際に使用する方法は、 D スクリプトの中に flowindent を定義するか、DTrace 実 行時に -F オプションを付与して実行します。
それでは、実際に flowindent の効果を確認してみましょう。
モニタリングするサンプルとして、下記テストプログラムを実行ファイル名 a.out で作成します。
テストプログラム
int main()
{
func1();
func2();
}
int func1()
{
func3();
}
int func2()
{
func1();
}
int func3()
{
func4();
}
int func4()
{
}
テストプログラムに対する関数の入れ子を確認する為に下記 D スクリプト を作成します。今回は、D スクリプトの中に flowindent オプションを 埋め込みました。また、関数の呼び出しを確認する為に pid プロバイダを 使用しております。
サンプル D スクリプト(flowindent.d)
#pragma D option flowindent
pid$target:a.out::entry
{
}
pid$target:a.out::return
{
}
早速 flowindent.d を実行してみましょう。
flowindent.d 実行結果
# dtrace -s flowindent.d -c a.out dtrace: script 'pid.sample.d' matched 15 probes dtrace: pid 1196 exited with status 16 CPU FUNCTION 0 -> _start 0 -> __fsr 0 <- __fsr 0 -> func1 0 -> func3 0 -> func4 0 <- func4 0 <- func3 0 <- func1 0 -> func2 0 -> func1 0 -> func3 0 -> func4 0 <- func4 0 <- func3 0 <- func1 0 <- func2 0 <- main
このように、関数の入りと出がインデントを付けて表示されました。
DTrace を使用しないで関数の入れ子状態を確認するデバッグには、よく関数の入りと出の 部分に printf() 文を入れて確認していましたが、DTrace を使用すればソースプログ ラムにデバッグ用のコード を埋め込む修正も必要ないですし、当然、確認の為にリコンパイルも必要ありません。
また、各関数を呼び出した回数や、各関数毎の実行時間の累積も DTrace を使うと 集積関数を使って簡単に計測する事ができます。
関数の呼び出し回数を計測するスクリプト(func_count.d)
pid$target:a.out::entry
{
@counts[probefunc] = count();
}
pid$target:a.out::return
{
}
func_count.d 実行結果
# dtrace -s func_count.d -q -c a.out __fsr 1 _start 1 func2 1 func1 2 func3 2 func4 2このように、各関数を実行した回数を集計して表示する事ができます。
関数の実行時間累積を計測するスクリプト(exectime.d)
pid$target:a.out::entry
{
self->ts[probefunc] = timestamp;
}
pid$target:a.out::return
/probefunc != "main"/
{
@sum[probefunc] = sum(timestamp - self->ts[probefunc] );
self->ts[probefunc] = 0;
}
exectime.d 実行結果
# dtrace -s exectime.d -q -c a.out __fsr 9923 func4 10553 func2 32865 func3 34526 func1 57725
このように、各関数を実行した累積時間を集計して表示する事ができます。
ここで使用した PID プロバイダは、ユーザが作成したプログラムのパフォーマンス 計測にとても便利ですので、開発者の方は是非マスターして下さい。
(参考情報)
過去の 「やっぱり Sun がスキ!」blog 記事一覧はこちらを参照下さい。 http://wikis.sun.com/display/yappri/Home
Posted at 02:12午後 7 24, 2009 by Naoyuki Yamada in Sun | 投稿されたコメント[0]