本記事では、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ユーザー権限が必要です。
このセクションでは、OBServerノード1台に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レベルでのリソース分離を行うことを推奨します。リソース分離の詳細な操作手順については、テナント内のリソース分離の設定を参照してください。