本記事では、OceanBaseデータベースのcgroup設定方法について説明します。
背景
OceanBaseデータベースの現在のバージョンでは、テナントのワーカースレッドとほとんどのバックグラウンドスレッドはテナントごとに区別されていますが、ネットワークスレッドは共有スレッドです。ユーザーはcgroupsを設定することで、テナントのCPU使用量を制御できます。cgroupの設定を開始する前に、cgroupの概念を理解しておくことをお勧めします。cgroupの詳細については、リソース分離の概要を参照してください。
使用上の制限と注意事項
リソース分離の設定はパフォーマンスに大きな影響を与えるため、以下のシナリオではテナントのリソース分離にcgroup機能の使用は推奨されません:
シングルテナントシナリオ、つまりクラスタ内にテナントが1つしかない場合
テナント間に業務的な関連性があるシナリオ。例えば、異なるマイクロサービスを異なるテナントに配置し、テナント間で上流・下流の関係が生じる場合
小規模構成のテナントシナリオ、つまりCPUが2Cまたは4Cのテナントの場合
cgroup機能を使用するには、LinuxカーネルバージョンがLinux Kernel 4.19以降である必要があります。
OceanBaseデータベースをアップグレードした後、cgroupを再設定する必要があります。
OBServerサーバーが再起動した場合、作成済みのcgroupサブディレクトリ(例えば、このドキュメントの
/sys/fs/cgroup/ディレクトリ配下のすべてのサブディレクトリ)はクリアされ、cgroupを再設定する必要があります。
OceanBase Enterprise Editionの設定
ステップ1:cgroupシステムディレクトリの設定
注意
- cgroupシステムディレクトリの設定は、OceanBaseデータベースソフトウェアのインストール前にも、インストール後にも行えます。このドキュメントでは、OceanBaseデータベースソフトウェアが既にインストールされていることを前提として、cgroupシステムディレクトリの設定手順を説明します。
- cgroupシステムディレクトリを設定するには、
rootユーザー権限が必要です。
このセクションでは、1台のOBServer上でcgroupシステムディレクトリを設定する例を説明します。複数のOBServerがある場合は、各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 Feb 27 15:27 blkio lrwxrwxrwx 1 root root 11 Feb 27 15:27 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 Feb 27 15:27 cpuacct -> cpu,cpuacct drwxr-xr-x 2 root root 40 Feb 27 15:27 cpu,cpuacct drwxr-xr-x 2 root root 40 Feb 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/
ステップ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;
OceanBaseデータベースCommunity Editionの設定
ステップ1:cgroupシステムディレクトリの設定
注意
- cgroupシステムディレクトリの設定は、OceanBaseデータベースソフトウェアのインストール前にも、インストール後にも実行できます。このドキュメントでは、OceanBaseデータベースソフトウェアが既にインストールされている場合を例に、cgroupシステムディレクトリの設定手順を説明します。
- cgroupシステムディレクトリを設定するには、
rootユーザー権限が必要です。
このセクションでは、1台のOBServer上でusercgユーザーを使用してcgroupシステムディレクトリを設定する例を説明します。複数のOBServerがある場合は、各OBServerで設定が必要です。
usercgユーザーでOBServerサーバーにログインします。以下のコマンドを実行し、
/sys/fs/cgroupディレクトリをマウントします。説明
/sys/fs/cgroupディレクトリが既に存在する場合は、この手順を無視できます。[usercg@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/usercg/logs cgroups 395752136 0 395752136 0% /sys/fs/cgroup/sys/fs/cgroup/cpuディレクトリを作成し、所有者を変更した後、CPUサブシステムをマウントします。説明
/sys/fs/cgroup/cpuディレクトリが既に存在する場合は、この手順を無視できます。[usercg@xxx /]$ sudo mkdir /sys/fs/cgroup/cpu [usercg@xxx /]$ sudo chown usercg:usercg -R /sys/fs/cgroup/cpucpuという名前の階層を作成し、その階層にcpuサブシステムを追加して、/sys/fs/cgroup/cpuディレクトリにマウントします。[usercg@xxx /]$ sudo mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpuoceanbaseという名前のサブディレクトリを作成し、その所有者をusercgに変更します。[usercg@xxx /]$ sudo mkdir /sys/fs/cgroup/cpu/oceanbase [usercg@xxx /]$ sudo chown usercg:usercg -R /sys/fs/cgroup/cpu/oceanbaseoceanbaseディレクトリにCPUおよびメモリリソースを割り当てます。以下のコマンドを実行して、マシン上のcpu、cpuacct、cpusetの3つのサブシステムのマウント状況を確認します。
[usercg@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およびメモリリソースを割り当てるために、以下のコマンドを実行する必要があります。[usercg@xxx /]$ sudo sh -c "echo `cat /sys/fs/cgroup/cpu/cpuset.cpus` > /sys/fs/cgroup/cpu/oceanbase/cpuset.cpus" [usercg@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 Feb 27 15:27 blkio lrwxrwxrwx 1 root root 11 Feb 27 15:27 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 Feb 27 15:27 cpuacct -> cpu,cpuacct drwxr-xr-x 2 root root 40 Feb 27 15:27 cpu,cpuacct drwxr-xr-x 2 root root 40 Feb 27 15:27 cpusetこの場合、追加の操作は不要で、次の手順に進むことができます。
以下のコマンドを実行して、
oceanbaseディレクトリに対するサブディレクトリの継承プロパティを設定します。[usercg@xxx /]$ sudo sh -c "echo 1 > /sys/fs/cgroup/cpu/oceanbase/cgroup.clone_children"コマンドが正常に実行されると、
oceanbaseディレクトリ下に作成されるcgroupサブディレクトリは、すべて親ディレクトリのプロパティを継承します。
ステップ2:OceanBaseデータベースとのソフトリンクの確立
cgroupシステムディレクトリを設定した後、OceanBaseデータベースソフトウェアのインストールディレクトリとcgroupシステムディレクトリの間にソフトリンクを作成する必要があります。
usercgユーザーでOBServerノードにログインします。OceanBaseデータベースソフトウェアのインストールディレクトリとcgroupシステムディレクトリの間に手動でソフトリンクを作成します。
[usercg@xxx /home/usercg]$ cd /home/usercg/oceanbase/ [usercg@xxx /home/usercg] $ ln -sf /sys/fs/cgroup/cpu/oceanbase/ cgroupここで、
/home/usercg/oceanbase/はOceanBaseデータベースソフトウェアのインストールパスです。実行が成功すると、結果は次のとおりです。
[usercg@xxx /home/usercg/oceanbase] $ll cgroup lrwxrwxrwx 1 usercg usercg 29 Dec 8 11:09 cgroup -> /sys/fs/cgroup/cpu/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 で作成したリソースグループを利用することを推奨します。テナント内のリソース分離の詳細な操作手順については、テナント内のリソース分離の設定を参照してください。