本記事では、OceanBaseデータベースにcgroupを設定する方法について説明します。
背景
OceanBaseデータベースの現行バージョンでは、テナントワーカースレッドとほとんどのバックグラウンドスレッドはテナントごとに区別されていますが、ネットワークスレッドは共有スレッドとなっています。ユーザーはcgroupを設定することで、テナントのCPUやIOPSなどのリソース使用量を制御できます。cgroupの設定を始める前に、まずはcgroupの概念を理解しておくことを推奨します。cgroupの詳細については、リソース分離の概要を参照してください。
制限事項または注意点
リソース分離の設定はパフォーマンスに大きな影響を与えるため、以下のシナリオではテナントのリソース分離にcgroup機能を使用することは推奨されません:
シングルテナントシナリオ、つまりクラスタ内にテナントが1つしかない場合
テナント間に業務上の関連性がある場合、例えば、異なるマイクロサービスを異なるテナントに配置し、テナント間で上下流関係が生じる場合
スペックの小さいテナントシナリオ、つまりCPUが2Cまたは4Cのテナントの場合
cgroup機能を使用するには、LinuxカーネルバージョンがLinux Kernel 4.19以降である必要があります。
OceanBaseデータベースのアップグレード後、cgroupを再設定する必要があります。
OBServerサーバーの再起動時、作成済みのcgroupサブディレクトリ(例えば、本記事の
/sys/fs/cgroup/ディレクトリ配下のすべてのサブディレクトリ)は削除されるため、cgroupを再設定する必要があります。
操作手順
ステップ1:cgroupシステムディレクトリの設定
注意
- cgroupシステムディレクトリの設定は、OceanBaseデータベースソフトウェアのインストール前に行うことも、インストール後に行うこともできます。本記事では、OceanBaseデータベースソフトウェアが既にインストール済みである場合を例に、cgroupシステムディレクトリの設定方法を説明します。
- cgroupシステムディレクトリの設定には、
rootユーザー権限が必要です。
このセクションでは、1つのOBServerノード上でcgroupシステムディレクトリを設定する例を示します。複数のOBServerノードがある場合は、各ノードで設定する必要があります。
adminユーザーでOBServerサーバーにログインします。以下のコマンドを実行して、
/sys/fs/cgroupディレクトリをマウントします。説明
/sys/fs/cgroupディレクトリが既に存在する場合は、このステップをスキップしてください。[admin@xxx /]$ sudo mount -t tmpfs cgroups /sys/fs/cgroupここで、
cgroupsはカスタム名であり、マウント情報を確認する際の識別に使用されます。マウント結果は次のとおりです。
$df Filesystem 1K-blocks Used Available Use% Mounted on / 293601280 28055472 265545808 10% / /dev/v01d 2348810240 2113955876 234854364 91% /data/1 /dev/v02d 1300234240 1170211208 130023032 91% /data/log1 shm 33554432 0 33554432 0% /dev/shm /dev/v04d 293601280 28055472 265545808 10% /home/admin/logs cgroups 395752136 0 395752136 0% /sys/fs/cgroup/sys/fs/cgroup/cpuディレクトリを作成し、所有者を変更した後、cpuサブシステムをマウントします。説明
/sys/fs/cgroup/cpuディレクトリが既に存在し、かつ空である場合は、このステップをスキップしてください。[admin@xxx /]$ sudo mkdir /sys/fs/cgroup/cpu [admin@xxx /]$ sudo chown admin:admin -R /sys/fs/cgroup/cpucpuという名前の階層を作成し、その階層にcpuサブシステムを追加し、階層を/sys/fs/cgroup/cpuディレクトリにマウントします。[admin@xxx /]$ sudo mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpuoceanbaseという名前のサブディレクトリを作成し、その所有者をadminに変更します。[admin@xxx /]$ sudo mkdir /sys/fs/cgroup/cpu/oceanbase [admin@xxx /]$ sudo chown admin:admin -R /sys/fs/cgroup/cpu/oceanbaseoceanbaseディレクトリにCPUおよびメモリリソースを割り当てます。以下のコマンドを実行して、マシン上のcpu、cpuacct、cpusetの3つのサブシステムのマウント状況を確認します。
[admin@xxx /]$ ll /sys/fs/cgroupサブシステムのマウント状況に応じて、適切な操作を選択します:
cpusetサブシステムがcpu、cpuacctなどのサブシステムと一緒にマウントされている場合
このシナリオでは、通常3つのサブシステムが同一ディレクトリにマウントされます。例えば、マウント結果は次のとおりです。
drwxr-xr-x 3 root root 0 Jul 24 2020 blkio lrwxrwxrwx 1 root root 33 Jul 24 2020 cpu -> /sys/fs/cgroup/cpuset,cpu,cpuacct lrwxrwxrwx 1 root root 33 Jul 24 2020 cpuacct -> /sys/fs/cgroup/cpuset,cpu,cpuacct lrwxrwxrwx 1 root root 33 Jul 24 2020 cpuset -> /sys/fs/cgroup/cpuset,cpu,cpuacct drwxr-xr-x 4 root root 0 Jul 24 2020 cpuset,cpu,cpuacctこのシナリオでは、
oceanbaseディレクトリにCPUおよびメモリリソースを割り当てるために、以下のコマンドを実行する必要があります。[admin@xxx /]$ sudo sh -c "echo `cat /sys/fs/cgroup/cpu/cpuset.cpus` > /sys/fs/cgroup/cpu/oceanbase/cpuset.cpus" [admin@xxx /]$ sudo sh -c "echo `cat /sys/fs/cgroup/cpu/cpuset.mems` > /sys/fs/cgroup/cpu/oceanbase/cpuset.mems"cpusetサブシステムがcpu、cpuacctなどのサブシステムと別々にマウントされている場合
このシナリオでは、cpusetサブシステムはcpu、cpuacctなどのサブシステムとは別にマウントされます(通常はECS型のマシンが多い)。そのマウント結果は次のとおりです。
drwxr-xr-x 2 root root 40 2月 27 15:27 blkio lrwxrwxrwx 1 root root 11 2月 27 15:27 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 2月 27 15:27 cpuacct -> cpu,cpuacct drwxr-xr-x 2 root root 40 2月 27 15:27 cpu,cpuacct drwxr-xr-x 2 root root 40 2月 27 15:27 cpusetこのシナリオでは、追加の操作は不要で、次のステップに進むだけで済みます。
以下のコマンドを実行して、
oceanbaseディレクトリにサブディレクトリの継承プロパティを設定します。[admin@xxx /]$ sudo sh -c "echo 1 > /sys/fs/cgroup/cpu/oceanbase/cgroup.clone_children"コマンドの実行が成功すると、
oceanbaseディレクトリ内に作成されるcgroupサブディレクトリはすべて、親ディレクトリのプロパティを継承します。
ステップ2:OceanBaseデータベースとのソフトウェアリンクの作成
cgroupシステムディレクトリを設定した後、OceanBaseデータベースソフトウェアのインストールディレクトリとcgroupシステムディレクトリの間にソフトウェアリンクを作成する必要があります。
adminユーザーでOBServerノードにログインします。OceanBaseデータベースソフトウェアのインストールディレクトリとcgroupシステムディレクトリの間に手動でソフトウェアリンクを作成します。
[admin@xxx /home/admin]$ cd /home/admin/oceanbase/ [admin@xxx /home/admin] $ ln -sf /sys/fs/cgroup/cpu/oceanbase/ cgroupここで:
/home/admin/oceanbase/はOceanBaseデータベースソフトウェアのインストールパスです。実行が成功すると、結果は次のようになります。
[admin@xxx /home/admin/oceanbase] $ll cgroup lrwxrwxrwx 1 admin admin 29 Dec 8 11:09 cgroup -> /sys/fs/cgroup/cpu/oceanbase/ lrwxrwxrwx 1 admin admin 29 Dec 8 11:09 cgroup -> /sys/fs/cgroup/blkio/oceanbase/
ステップ3:cgroup機能の有効化
OceanBaseデータベースでは、クラスタレベルの構成パラメータenable_cgroupを使用してOBServerでcgroup機能を有効にするかどうかを制御します。デフォルト値はTrueで、cgroup機能が有効であることを示します。ソフトウェアリンクを作成し、cgroup機能を有効にすると、OBServerノードの再起動なしでcgroup機能が自動的に有効になります。
cgroup機能が有効になっていない場合は、以下の手順を参照して有効にすることができます。
rootユーザーでクラスタのsysテナントにログインします。以下のコマンドを実行して、cgroup機能を有効にします。
obclient> ALTER SYSTEM SET enable_cgroup = true;または
obclient> ALTER SYSTEM SET enable_cgroup = 1;
次のステップ
cgroupシステムディレクトリを正常に設定し、cgroup機能を有効にした後、緊急時には各テナントのディレクトリ配下にあるcpu.cfs_period_us、cpu.cfs_quota_us、cpu.sharesなどのファイルを通じて、テナント内のCPUリソース使用量を制御できます。ただし、一般的にこの方法でのリソース分離は推奨されません。
リソース分離には、cgroup内のディレクトリファイルを使用してDBMS_RESOURCE_MANAGERシステムパッケージのサブルーチンCREATE_CONSUMER_GROUPで作成されたリソースグループを利用することを推奨します。これにより、ユーザーレベルまたはSQLレベルでのリソース分離が可能になります。リソース分離の詳細な手順については、テナント内リソース分離の設定を参照してください。