diff --git a/build/nogo_config.json b/build/nogo_config.json index ce3715232b472..3aecc81b0519e 100644 --- a/build/nogo_config.json +++ b/build/nogo_config.json @@ -404,7 +404,8 @@ "util/": "util code", "parser/": "parser code", "meta/": "parser code", - "extension/": "extension code" + "extension/": "extension code", + "resourcemanager/": "resourcemanager code" } }, "shift": { @@ -765,7 +766,8 @@ "server/conn.go": "server/conn.go", "server/conn_stmt.go": "server/conn_stmt.go", "server/conn_test.go": "server/conn_test.go", - "extension/": "extension code" + "extension/": "extension code", + "resourcemanager/": "resourcemanager code" } }, "SA2000": { diff --git a/resourcemanager/BUILD.bazel b/resourcemanager/BUILD.bazel new file mode 100644 index 0000000000000..2b97ccbd25bdd --- /dev/null +++ b/resourcemanager/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "resourcemanage", + srcs = ["rm.go"], + importpath = "github.com/pingcap/tidb/resourcemanager", + visibility = ["//visibility:public"], + deps = [ + "//util", + "//util/cpu", + ], +) diff --git a/resourcemanager/rm.go b/resourcemanager/rm.go new file mode 100644 index 0000000000000..54ae27f82a4f6 --- /dev/null +++ b/resourcemanager/rm.go @@ -0,0 +1,47 @@ +// Copyright 2022 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package resourcemanager + +import ( + tidbutil "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/cpu" +) + +// GlobalResourceManager is a global resource manager +var GlobalResourceManager = NewResourceManger() + +// ResourceManager is a resource manager +type ResourceManager struct { + cpuObserver *cpu.Observer + wg tidbutil.WaitGroupWrapper +} + +// NewResourceManger is to create a new resource manager +func NewResourceManger() *ResourceManager { + return &ResourceManager{ + cpuObserver: cpu.NewCPUObserver(), + } +} + +// Start is to start resource manager +func (r *ResourceManager) Start() { + r.wg.Run(r.cpuObserver.Start) +} + +// Stop is to stop resource manager +func (r *ResourceManager) Stop() { + r.cpuObserver.Stop() + r.wg.Done() +} diff --git a/tidb-server/BUILD.bazel b/tidb-server/BUILD.bazel index 960f68a2b597d..493eedfcccbfa 100644 --- a/tidb-server/BUILD.bazel +++ b/tidb-server/BUILD.bazel @@ -21,6 +21,7 @@ go_library( "//planner/core", "//plugin", "//privilege/privileges", + "//resourcemanager:resourcemanage", "//server", "//session", "//session/txninfo", diff --git a/tidb-server/main.go b/tidb-server/main.go index a15d102f9509e..d58e24a531f4c 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -46,6 +46,7 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/plugin" "github.com/pingcap/tidb/privilege/privileges" + "github.com/pingcap/tidb/resourcemanager" "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/session/txninfo" @@ -210,6 +211,7 @@ func main() { printInfo() setupBinlogClient() setupMetrics() + resourcemanager.GlobalResourceManager.Start() storage, dom := createStoreAndDomain() svr := createServer(storage, dom) @@ -223,6 +225,7 @@ func main() { svr.Close() cleanup(svr, storage, dom, graceful) cpuprofile.StopCPUProfiler() + resourcemanager.GlobalResourceManager.Stop() close(exited) }) topsql.SetupTopSQL()