Microsoft.AnalysisServices.Tabular を使用して、Azure 分析サービスへのデータの更新/読み込みをテストしています。コードは非常に簡単です
while (true)
{
var server = new Microsoft.AnalysisServices.Tabular.Server();
server.Connect(
"Provider=MSOLAP;Data Source=asazure://[...];Persist Security Info=True; Impersonation Level=Impersonate;");
var m = server.Databases[0].Model;
var tabs = m.Tables;
tabs["Viewer"].RequestRefresh(RefreshType.DataOnly);
tabs["EventClick"].RequestRefresh(RefreshType.DataOnly);
[...]
m.SaveChanges();
server.Disconnect();
Thread.Sleep(new TimeSpan(0,0,0,1));
}
モデルは最初は約 300MB で、アクティブな関係や複雑な測定はありません。基本的には、非常にゆっくりと成長するデータです (すべてのテーブルを合わせて 1 秒あたり 10 レコード未満)。
メモリ使用率が少し増加し、ある程度安定すると予想していましたが、何らかの理由で、Azure AS 開発計画の Azure メモリ制限 (約 3 GB) に達するまで、データベースに必要なメモリが更新のたびに (一定の速度で) 増加します。その時点で、アプリケーションは例外を受け取ります
Unhandled Exception: Microsoft.AnalysisServices.OperationException: Failed to save modifications to the server. Error returned: 'Memory error: Allocation failure : The paging file is too small for this operation to complete.
テーブル/パーティションの更新を停止しても、メモリ使用率は一定のままです。Azure portal で Azure AS を一時停止して再起動すると、元の値が ~300MB まで低下することに気付きました
DMV の結果は何も教えてくれませんが、とにかく投稿します (スナップショット、db は約 1.5GB です)。異変に気付く人もいるかもしれません
DMV:SELECT top 10 * FROM $SYSTEM.DISCOVER_OBJECT_MEMORY_USAGE ORDER BY OBJECT_MEMORY_NONSHRINKABLE DESC
OBJECT_PARENT_PATH OBJECT_ID OBJECT_MEMORY_SHRINKABLE OBJECT_MEMORY_NONSHRINKABLE OBJECT_VERSION OBJECT_DATA_VERSION OBJECT_TYPE_ID OBJECT_TIME_CREATED OBJECT_MEMORY_CHILD_SHRINKABLE OBJECT_MEMORY_CHILD_NONSHRINKABLE OBJECT_GROUP
"Global" "Big" 0 11026432 "-1" "-1" "2" 2016-12-13 12:01:26.000 0 0 "$System"
"" "Global" 0 5055222 "-1" "-1" "100011" 2016-12-13 12:01:26.000 0 15903456 "$System"
"Global" "SystemHeap" 0 1396488 "-1" "-1" "2" 2016-12-13 12:01:26.000 0 0 "$System"
"ardev.Databases.mytestdb_90db7154-080a-4094-bd4b-cc6b35422d42.Dimensions.ProductImpression (28).In-Memory Table.Columns" "ProductId (73)" 0 1068088 "0" "-1" "703003" 2016-12-13 04:00:52.000 0 528 ""
"ardev.Databases.mytestdb_90db7154-080a-4094-bd4b-cc6b35422d42.Dimensions.Website Product Sale (31).In-Memory Table.Columns" "ProductId (78)" 0 1066288 "-1" "-1" "703003" 2016-12-13 04:00:52.000 0 136 ""
"Global" "IMBIData" 0 880640 "-1" "-1" "2001" 2016-12-13 12:01:26.000 0 0 "$System"
"Global" "Aligned Global Heap" 0 619488 "0" "-1" "2" 2016-12-13 12:01:26.000 0 0 "$System"
"ardev.Databases.mytestdb_90db7154-080a-4094-bd4b-cc6b35422d42.Dimensions.Visit (16).In-Memory Table.Columns" "Url (56)" 0 508404 "-1" "-1" "703003" 2016-12-13 04:00:52.000 0 22040 ""
"Global" "GeneralPurpose" 0 413480 "-1" "-1" "2" 2016-12-13 12:01:26.000 0 0 "$System"
"Global" "Allocators" 0 404176 "-1" "-1" "2" 2016-12-13 12:01:26.000 0 0 "$System"
この「メモリ リーク」の原因と回避方法を教えてください。私が知っておくべき落とし穴はありますか?
// 編集
更新頻度を下げるとどうなりますか? 現在、5 分ごとにデータを更新し、3 時間ごとにインスタンスを再起動しています。
メモリ メトリックは次のようになります。
x分ごとに更新すると、基本的に問題はまだ表示されます。x 日ごとにデータを更新するほとんどの人は、何かがおかしいことに気付かないでしょう。