« セマフォ? | トップページ | Known Issues for Oracle Database Cloud Service / 始めるまえに読んでおこうね »

2017年5月21日 (日) / Author : Hiroshi Sekiguchi.

FAQ:Solaris 11.3とZFSという組み合わせだとFAQなのな、ZFS ARCに関する動きについて

有名すぎるネタらしいけど、Solaris + ZFSを使うことなんて、、久々すぎて、あーあったっけ〜、そんなOSという感じの久しぶり感。もう二桁何年ぶりちょい前ぶりぐらいに、遠い目w 

ということで、せっかく調べたので、備忘録。



Oracle® Solaris 11.3 カーネルのチューンアップ・リファレンスマニュアル
第 3 章 Oracle Solaris ZFS チューニング可能パラメータ
ZFS メモリー管理パラメータ

カーネルゾーンのメモリーを予約するための ZFS ARC のチューニング
Tuning the ZFS ARC to Reserve Memory for Kernel Zones
ZFS Memory Tuning for Oracle Databases & Application on Oracle Solaris 11
Activity of the ZFS ARC
ZFS Performance Analysis and Tools - Brendan Gregg
Solaris っていまどうなってるの? 2016 末
Oracle® Solaris カーネルゾーンの作成と使用


Solaris 11.3とOracle Database 12.1.0.2を利用して、11.3でもZFS ARCが暴れてしまう状況を再現して見ます。
Oracle Solaris 11.3 VM Template for Oracle VM VirtualBox

bash-4.1$ pkg list entire
NAME (PUBLISHER) VERSION IFO
entire 0.5.11-0.175.3.1.0.5.0 i--
bash-4.1$ uname -r
5.11
bash-4.1$ cat /etc/release
Oracle Solaris 11.3 X86
Copyright (c) 1983, 2015, Oracle and/or its affiliates. All rights reserved.
Assembled 06 October 2015

SQL> select * from v$version;

BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for Solaris: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0


起動直後の状態、freelistは5.9Gほどあり、約3GB程度空いていれば起動できる設定のOracle Databaseを起動するだけの空きメモリがある。

root@angelfish:˜# echo ::memstat | mdb -k
Page Summary Pages Bytes %Tot
----------------- ---------------- ---------------- ----
Kernel 193500 755.8M 9%
ZFS Metadata 23285 90.9M 1%
ZFS File Data 159905 624.6M 8%
Anon 106662 416.6M 5%
Exec and libs 4207 16.4M 0%
Page cache 29519 115.3M 1%
Free (cachelist) 1 4k 0%
Free (freelist) 1561934 5.9G 74%
Total 2097039 7.9G

ZFS File Dataって、そんなに簡単にFreelistから取れるだけ取って増加しちゃうのかなぁ〜 (しらなかったのでどうなるか再現してみることに)
でかいファイルを大量にコピーして、ZFS File Dataをでかくしてみる! と......

-bash-4.1$ cd orcl12c/
-bash-4.1$ ls -lh
total 4091341
-rw-r----- 1 oracle oinstall 17M 5月 8日 20:56 control01.ctl
drwxr-x--- 2 oracle oinstall 7 4月 29日 01:39 pdborcl
drwxr-x--- 2 oracle oinstall 5 4月 29日 01:27 pdbseed
-rw-r----- 1 oracle oinstall 50M 5月 8日 20:48 redo01.log
-rw-r----- 1 oracle oinstall 50M 5月 8日 20:48 redo02.log
-rw-r----- 1 oracle oinstall 50M 5月 8日 20:56 redo03.log
-rw-r----- 1 oracle oinstall 690M 5月 8日 20:56 sysaux01.dbf
-rw-r----- 1 oracle oinstall 790M 5月 8日 20:56 system01.dbf
-rw-r----- 1 oracle oinstall 197M 5月 8日 20:49 temp01.dbf
-rw-r----- 1 oracle oinstall 340M 5月 8日 20:56 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5.0M 5月 8日 20:56 users01.dbf
-bash-4.1$ cd ..
-bash-4.1$ cp -r oradata/ oradata.org


ZFS ARCがあっというまにfreelistを食いつぶしていきます!
cpでOracle Databaseのデータファイルをコピーし終わったらfreelistの残りは、3%!!!!!

なんだ!
簡単に再現するのな。

root@angelfish:˜# echo ::memstat | mdb -k
Page Summary Pages Bytes %Tot
----------------- ---------------- ---------------- ----
Kernel 303609 1.1G 14%
ZFS Metadata 65375 255.3M 3%
ZFS File Data 1417002 5.4G 68%
Anon 112798 440.6M 5%
Exec and libs 66749 260.7M 3%
Page cache 37322 145.7M 2%
Free (cachelist) 5294 20.6M 0%
Free (freelist) 62403 243.7M 3%
Total 2097039 7.9G


この状態でOracle Databaseを起動すると....だよね〜。ZFS File Dataを簡単には解放してくれない..といういうSolaris / ZFS界隈では有名?な動きが再現します。

-bash-4.1$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on 日 5月 14 02:19:56 2017

Copyright (c) 1982, 2014, Oracle. All rights reserved.

アイドル・インスタンスに接続しました。

SQL> startup
ORA-27102: out of memory
Solaris-AMD64 Error: 12: Not enough space
Additional information: 1671
Additional information: 2147483648
Additional information: 2566914048
SQL>

以下マニュアルにも書かれていますが、

Oracle® Solaris 11.3 カーネルのチューンアップ・リファレンスマニュアル
第 3 章 Oracle Solaris ZFS チューニング可能パラメータ
ZFS メモリー管理パラメータ
https://docs.oracle.com/cd/E62101_01/html/E62779/chapterzfs-3.html

Doc Id:1663862.1 からダウンロードできるset_user_reserve.shを利用して再起動なしで空きを確保した後、/etc/systemで永続的に設定しておくのがおすすめ。
実際に何%をを確保するかは、試験や運用開始後の継続的なモニタリングで調整するしかないだろうね。

root@angelfish:˜# ./set_user_reserve.sh -fp 60
Current user_reserve_hint_pct value is 0.
Adjusting user_reserve_hint_pct from 0 to 60
2017年05月14日 (日) 02時30分41秒 JST : waiting for current value : 18 to grow to target : 20
2017年05月14日 (日) 02時30分49秒 JST : waiting for current value : 22 to grow to target : 25

...中略...

2017年05月14日 (日) 02時32分12秒 JST : waiting for current value : 50 to grow to target : 55
2017年05月14日 (日) 02時32分34秒 JST : waiting for current value : 55 to grow to target : 60
Adjustment of user_reserve_hint_pct to 60 successful.
Make the setting persistent across reboot by adding to /etc/system

root@angelfish:˜# echo ::memstat | mdb -k
Page Summary Pages Bytes %Tot
----------------- ---------------- ---------------- ----
Kernel 303754 1.1G 14%
ZFS Metadata 64652 252.5M 3%
ZFS File Data 369117 1.4G 18%
Anon 112217 438.3M 5%
Exec and libs 66805 260.9M 3%
Page cache 37142 145.0M 2%
Free (cachelist) 8453 33.0M 0%
Free (freelist) 1107868 4.2G 53%
Total 2097039 7.9G

あとは/etc/systemににuser_reserve_hint_pctを追記する!

root@angelfish:˜# tail -10 /etc/system

...略...
* set nautopush=32
* set maxusers=40
*
* To set a variable named 'debug' in the module named 'test_module'
*
* set test_module:debug = 0x13
*
*
*
set user_reserve_hint_pct=60


起動した!!

SQL> startup

Total System Global Area 2583691264 bytes
Fixed Size 3006976 bytes
Variable Size 687869440 bytes
Database Buffers 1879048192 bytes
Redo Buffers 13766656 bytes
データベースがマウントされました。
データベースがオープンされました。


root@angelfish:˜# echo ::memstat | mdb -k
Page Summary Pages Bytes %Tot
----------------- ---------------- ---------------- ----
Kernel 312326 1.1G 15%
ZFS Metadata 64712 252.7M 3%
ZFS File Data 361163 1.3G 17%
Anon 216190 844.4M 10%
Exec and libs 78651 307.2M 4%
Page cache 37647 147.0M 2%
OSM 631296 2.4G 30%
Free (cachelist) 264 1.0M 0%
Free (freelist) 367545 1.4G 18%
Total 2097039 7.9G


色々あるのな、SolarisとZFS。メモメモ

| |

トラックバック


この記事へのトラックバック一覧です: FAQ:Solaris 11.3とZFSという組み合わせだとFAQなのな、ZFS ARCに関する動きについて:

コメント

コメントを書く