シチュエーション
1つのDBサーバを複数アプリが共有する。各アプリのデータベースは連携するので物理的に別DBサーバにしない。
あるアプリがたまにアバレル君になり、DB性能に大きく影響を与え他アプリが共倒れになる。
改善案で少しでもアプリ設計変更が含まれると却下される。
SQL Serverにリソース ガバナの導入
ここに書くとほぼコピペになるためリンク
https://matutak.hatenablog.com/entry/20100225/1267127110
古い記事だが、参考になった。
ありがとうございます。
- ユーザー定義分類子関数例
- master->プログラミング->関数->スカラー値関数 に作成
CREATE FUNCTION [dbo].[user_classifier]() RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
DECLARE @group_name AS sysname
set @group_name = SUSER_NAME()
select @group_name = (case when @group_name in ('app1','app2',...)
then @group_name else 'default' end
)
return @group_name
END
Zabbixに監視追加
アバレル君を明確にする
テストプール名:app1
-
アイテム
-
名前:Resource Pool Stats (app1)
-
タイプ:Zabbixエージェント(アクティブ)
-
キー:perf_counter["\SQLServer:Resource Pool Stats(app1)\CPU usage %"]
-
データ型:数値(浮動小数)
-
単位:%
-
トリガー
-
名前:{HOST.NAME}: checkプールが5分間平均で{ITEM.LASTVALUE}を超過
-
条件式:{share-db:perf_counter["\SQLServer:Resource Pool Stats(app1)\CPU usage %"].avg(5m)}>50
メモ
アバレルアプリを特定できたら会議がしやすくなった。