Oracle Databaseのリソース制限の違い|limits.confとprofileを実機検証

  • URLをコピーしました!
Oracle AI Database
僕の作業環境
  • Oracle Linux 9.7

Oracle Database 12cの公式ドキュメントのインストール手順は、事前設定として/etc/profileにulimitを追記する記述がありました。

ところが、Oracle AI Database / Oracle Databaseの最新の公式ドキュメントは、/etc/profileの追記が見当たらず、/etc/security/limits.confの追記だけが説明されています。

本記事では、なぜ/etc/profileが不要になったのかを、実機で検証してまとめました。

目次

結論

リソース制限(nofile / nproc / stack)は、/etc/security/limits.confの追記だけで十分だからです。

逆に/etc/profileのulimit設定だけでは、ログイン方法によって設定が適用されたりされなかったり不安定だったため、/etc/security/limits.confの追記だけにしたと考えられます。

※ただしこれは、本記事の実機検証ログを見て筆者がそう判断した結論です。環境差(OSやPAM設定、ログイン経路など)によって結果が変わる可能性があるため、導入時は各環境でulimitを確認してください。

検証環境

検証環境
  • OS : Oracle Linux 9.7
  • ユーザ:oracle / learn
  • 確認コマンド
    • ulimit -Sn # soft nofile
    • ulimit -Hn # hard nofile
    • ulimit -Su # soft nproc
    • ulimit -Hu # hard nproc
    • ulimit -Ss # soft stack
    • ulimit -Hs # hard stack

初期状態(何も設定していない状態)

まず、/etc/security/limits.confと/etc/profileに何も追記していない状態(今回はセッションAと呼びます)で確認します。

[oracle@learnbytebybyte ~]$ # /etc/security/limits.confと/etc/profile設定前(セッションA)
[oracle@learnbytebybyte ~]$ ulimit -Sn
1024
[oracle@learnbytebybyte ~]$ ulimit -Hn
524288
[oracle@learnbytebybyte ~]$ ulimit -Su
29685
[oracle@learnbytebybyte ~]$ ulimit -Hu
29685
[oracle@learnbytebybyte ~]$ ulimit -Ss
8192
[oracle@learnbytebybyte ~]$ ulimit -Hs
unlimited

検証1:/etc/security/limits.confだけ設定した場合

/etc/security/limits.confに、oracleユーザー向けのリソース制限を追記します。

[root@learnbytebybyte ~]# # /etc/security/limits.confの設定
[root@learnbytebybyte ~]# vi /etc/security/limits.conf

<省略>

#追記
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768

# End of file

結果は以下のようになりました。

リソース制限値の反映状況
  1. セッションA(変更前から接続済みのセッション)
    • リソース制限値に反映されない
  2. 別セッション(変更後に新しいセッション)
    • リソース制限値に反映される
  3. su oracle(ハイフンなし)
    • リソース制限値に反映される
  4. su – oracle(ハイフンあり)
    • リソース制限値に反映される
[root@learnbytebybyte ~]# # 項目1:セッションA(変更前から接続済みのセッション)
[oracle@learnbytebybyte ~]$ ulimit -Sn
1024
[oracle@learnbytebybyte ~]$ ulimit -Hn
524288
[oracle@learnbytebybyte ~]$ ulimit -Su
29685
[oracle@learnbytebybyte ~]$ ulimit -Hu
29685
[oracle@learnbytebybyte ~]$ ulimit -Ss
8192
[oracle@learnbytebybyte ~]$ ulimit -Hs
unlimited


[oracle@learnbytebybyte ~]$ # 項目2:別セッション(変更後に新しいセッション)
[oracle@learnbytebybyte ~]$ ulimit -Sn
1024
[oracle@learnbytebybyte ~]$ ulimit -Hn
65536
[oracle@learnbytebybyte ~]$ ulimit -Su
2047
[oracle@learnbytebybyte ~]$ ulimit -Hu
16384
[oracle@learnbytebybyte ~]$ ulimit -Ss
10240
[oracle@learnbytebybyte ~]$ ulimit -Hs
32768


[learn@learnbytebybyte ~]$ # 項目3:su oracle(ハイフンなし)
[learn@learnbytebybyte ~]$ su oracle
パスワード:
[oracle@learnbytebybyte learn]$ ulimit -Sn
1024
[oracle@learnbytebybyte learn]$ ulimit -Hn
65536
[oracle@learnbytebybyte learn]$ ulimit -Su
2047
[oracle@learnbytebybyte learn]$ ulimit -Hu
16384
[oracle@learnbytebybyte learn]$ ulimit -Ss
10240
[oracle@learnbytebybyte learn]$ ulimit -Hs
32768
[oracle@learnbytebybyte learn]$ exit


[learn@learnbytebybyte ~]$ # 項目4:su oracle(ハイフンあり)
[learn@learnbytebybyte ~]$ su - oracle
パスワード:
[oracle@learnbytebybyte ~]$ ulimit -Sn
1024
[oracle@learnbytebybyte ~]$ ulimit -Hn
65536
[oracle@learnbytebybyte ~]$ ulimit -Su
2047
[oracle@learnbytebybyte ~]$ ulimit -Hn
65536
[oracle@learnbytebybyte ~]$ ulimit -Ss
10240
[oracle@learnbytebybyte ~]$ ulimit -Hs
32768
[oracle@learnbytebybyte ~]$ 

検証2:/etc/profile だけ設定した場合

次に、/etc/security/limits.confの追記を削除し、/etc/profileにulimitを追記します。

[root@learnbytebybyte ~]# # /etc/security/limits.confの追記は一度削除
[root@learnbytebybyte ~]# vi /etc/security/limits.conf
[root@learnbytebybyte ~]# vi /etc/profile
if [ $USER = "oracle" ]; then
    if [ $SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
fi
リソース制限値の反映状況
  • セッションA(変更前から接続済みのセッション)
    • リソース制限値に反映されない
  • 別セッション(変更後に新しいセッション)
    • リソース制限値に反映される
  • su oracle(ハイフンなし)
    • リソース制限値に反映されない
  • su – oracle(ハイフンあり)
    • リソース制限値に反映される

つまり/etc/profileのulimit設定は、ログインシェルとして起動するかどうか(su -かどうか等)に依存します。

[oracle@learnbytebybyte ~]$ # 項目1:セッションA(変更前から接続済みのセッション)
[oracle@learnbytebybyte ~]$ ulimit -Sn
1024
[oracle@learnbytebybyte ~]$ ulimit -Hn
524288
[oracle@learnbytebybyte ~]$ ulimit -Sn
1024
[oracle@learnbytebybyte ~]$ ulimit -Hn
524288
[oracle@learnbytebybyte ~]$ ulimit -Ss
8192
[oracle@learnbytebybyte ~]$ ulimit -Hs
unlimited

[oracle@learnbytebybyte ~]$ # 項目2:別セッション(変更後に新しいセッション)
[oracle@learnbytebybyte ~]$ ulimit -Sn
65536
[oracle@learnbytebybyte ~]$ ulimit -Hn
65536
[oracle@learnbytebybyte ~]$ ulimit -Su
16384
[oracle@learnbytebybyte ~]$ ulimit -Hu
16384
[oracle@learnbytebybyte ~]$ ulimit -Ss
8192
[oracle@learnbytebybyte ~]$ ulimit -Hs
unlimited

[learn@learnbytebybyte ~]$ # 項目3:su oracle(ハイフンなし)
[learn@learnbytebybyte ~]$ #設定後に別セッション別ユーザで切り替えだと制限できない
[learn@learnbytebybyte ~]$ su oracle
[oracle@learnbytebybyte learn]$ ulimit -Sn
1024
[oracle@learnbytebybyte learn]$ ulimit -Hn
524288
[oracle@learnbytebybyte learn]$ ulimit -Su
29685
[oracle@learnbytebybyte learn]$ ulimit -Hu
29685
[oracle@learnbytebybyte learn]$ ulimit -Ss
8192
[oracle@learnbytebybyte learn]$ ulimit -Hs
unlimited

[learn@learnbytebybyte ~]$ # 項目4:su oracle(ハイフンあり)
[learn@learnbytebybyte ~]$ su - oracle
パスワード:
[oracle@learnbytebybyte ~]$ ulimit -Sn
65536
[oracle@learnbytebybyte ~]$ ulimit -Hn
65536
[oracle@learnbytebybyte ~]$ ulimit -Su
16384
[oracle@learnbytebybyte ~]$ ulimit -Hu
16384
[oracle@learnbytebybyte ~]$ ulimit -Ss
8192
[oracle@learnbytebybyte ~]$ ulimit -Hs
unlimited

まとめ

今回の検証で分かったことは以下です。

  • /etc/security/limits.confは、新規ログインセッションで安定して反映される
  • /etc/profileのulimitは、ログイン方法に依存して反映されないケースがある(su と su – の差が出る)

インストール前提条件として「確実に満たす」必要があるリソース制限は、適用が安定している/etc/security/limits.confに寄せるのが合理的です。

※ただしこれは、本記事の実機検証ログを見て筆者がそう判断した結論です。環境差(OSやPAM設定、ログイン経路など)によって結果が変わる可能性があるため、導入時は各環境でulimitを確認してください。

最後までご愛読ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

情報系Fラン大学出身・新卒未経験からデータベースエンジニアに転身。
使用技術:Oracle|TypeScript
資格取得:情報処理安全確保支援士試験|応用情報技術者試験|OracleMaster Gold DBA|OCI Architect Associate

目次