EMCustom Memory Leakにつきまして

176 views
Skip to first unread message

木下裕貴

unread,
Feb 21, 2023, 5:05:24 AM2/21/23
to EDGEMATRIX Stream Toolkit Forum
お世話になっております。
AMBLの木下です。

弊社アプリケーションへEMCustomを追加し動かしたところ、メモリリークが発生してしまいました。

以下のコードを動かすと、メモリ使用量が増加し続けてしまいます。
増分は 500~1000[byte/s]程です。

弊社実装コードを削除しても同様の現象となりましたので、
特に要因が思いつかず質問させていただくこととなりました。

メモリ使用量が増加し続ける要因・対策をご教示いただきますようお願いいたします。

■環境
 toolkit ver = v2.3.0b4-2

■コード(弊社実装コードは削除しています)
添付「emcustom_test.c」

emcustom_used_memory.png
emcustom_test.c

ts...@edgematrix.com

unread,
Feb 21, 2023, 6:23:08 PM2/21/23
to EDGEMATRIX Stream Toolkit Forum, yuki.kin...@ambl.co.jp
お世話になっております。

Toolkitボックスでのメモリ使用量計測とのことですが、以下の3種類のうち、どの計測方法でしょうか。
  1. GUI
  2. CLI
  3. gst-launch
1のGUIはイベントデータを貯めますので必ずメモリ使用量は増加しますので、使用しないでください。

> 弊社実装コードを削除しても同様の現象となりましたので、
> 特に要因が思いつかず質問させていただくこととなりました。

上記2または3の計測方法で、レファレンスアプリの結果と比較してみてください。

2023年2月21日火曜日 19:05:24 UTC+9 yuki.kin...@ambl.co.jp:

木下裕貴

unread,
Feb 26, 2023, 9:19:15 PM2/26/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, 木下裕貴
ご回答ありがとうございます。
上記は 2. CLI で実行しています。(■実行方法)

以下3点確認させてください。
① 御社のアプリケーション/環境で似た事象は発生していますでしょうか?
② 投稿したC File記載の処理で推奨されない処理はございますか?
③ 実行方法以外で考えられる要因はございますか?

■実行方法
GUIで「Convert」実行後、CLIから実行
① $> edgestream_app.py [stream.json]
② terminal から 1 で開始

2023年2月22日水曜日 8:23:08 UTC+9 ts...@edgematrix.com:

Takenori Sato

unread,
Feb 26, 2023, 10:02:42 PM2/26/23
to 木下裕貴, EDGEMATRIX Stream Toolkit Forum
> ① 御社のアプリケーション/環境で似た事象は発生していますでしょうか?

すでにEMCustomは多くのアプリケーションで使用されておりますが、
メモリーリークの報告は受けておりません。

ただ最大1kb/s程度のリークですと、最大500MB/週程度となりますので、
弊社の現在の評価基準が1週間実行であることと、
週に一度はデバイスエージェントがgstd(GStreamerのパイプライン実行サービス)を再起動しているため、
報告がないのかもしれません。

> ② 投稿したC File記載の処理で推奨されない処理はございますか?

メモリ領域を確保している部分が気になりますが、
間違っているという意味ではなく、検証済みの方法と同じだったか、という意味です。

> ③ 実行方法以外で考えられる要因はございますか?

いえ、現時点ではありません。


まずは、レファレンスアプリで、メモリ使用量の増加をしてみます。

佐藤

2023年2月27日(月) 11:19 木下裕貴 <yuki.kin...@ambl.co.jp>:

Takenori Sato

unread,
Feb 27, 2023, 11:55:15 PM2/27/23
to 木下裕貴, EDGEMATRIX Stream Toolkit Forum
木下様、お世話になっております。

> メモリ領域を確保している部分が気になりますが、
> 間違っているという意味ではなく、検証済みの方法と同じだったか、という意味です。

気になったのは以下の部分で、ちょっと調べてみました。

      object = json_object_new ();

ドキュメントを見ると、このオブジェクトのメモリ管理はレファレンスカウントで、
ソースコードを確認すると、コンストラクターを実行した時に1の増加されていますから、
このAPIを使用した場合は、明示的にunrefを呼ばないと、解放されないと思われます。

ちなみに、レファレンスアプリで使用しているのは、以下のようなAPIでした。

    builder = json_builder_begin_object (builder);

    builder = json_builder_set_member_name (builder, "total_intensity");
    builder = json_builder_add_int_value (builder, total_intensity / total_count);

    builder = json_builder_end_object (builder);

佐藤

2023年2月27日(月) 12:02 Takenori Sato <ts...@edgematrix.com>:

木下裕貴

unread,
Feb 28, 2023, 3:35:17 AM2/28/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, EDGEMATRIX Stream Toolkit Forum, 木下裕貴
ご連絡ありがとうございます。

ご指摘のコードですが、一応下記コードで開放を試みています。
が、このコードを適用してもリークする事象は確認しています。

※ ref_count == 0 の時に呼ぶとエラーを吐いたので、下記のように条件付けしています。
if( json_object_get_member(object, "ref_count") > 0 ){ json_object_unref(object); }

個人的に気になっているのは、下記の json_node_alloc ()でインスタンスを生成している箇所で、
このオブジェクトは開放されるのでしょうか?
output_node = json_node_init_array (json_node_alloc (), out_array);

例えば下記のように unrefしようとすると失敗するので、ベースコードのままにしています。
init_node = json_node_alloc (); output_node = json_node_init_array (init_node, out_array);
json_node_unref (init_node);

2023年2月28日火曜日 13:55:15 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Feb 28, 2023, 4:41:15 AM2/28/23
to EDGEMATRIX Stream Toolkit Forum, yuki.kin...@ambl.co.jp, ts...@edgematrix.com, EDGEMATRIX Stream Toolkit Forum
ご確認ありがとうございました。

> が、このコードを適用してもリークする事象は確認しています。
...
> 個人的に気になっているのは、下記の json_node_alloc ()でインスタンスを生成している箇所

はい。実際にメモリの確保をしているのはこの2か所ですが、
前者に対策をしてもリークしているということは、ご指摘の通り後者も確かに怪しいです。

ドキュメントによると、alloc/freeとref/unrefの管理の話がありますが、
確かにallocしたものはfreeする必要がありそうです。
つまり、alloc (1) => ref(2) => ref (3)した場合は、
unref(2) => unref (1) => freeするという具合です。

また、json_node_allocのところには、以下の記述がありますから、いよいよ間違いないように思えてきました。

Use json_node_free() to free the resources allocated by this function.

2023年2月28日火曜日 17:35:17 UTC+9 yuki.kin...@ambl.co.jp:

ts...@edgematrix.com

unread,
Feb 28, 2023, 9:31:22 PM2/28/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, yuki.kin...@ambl.co.jp, EDGEMATRIX Stream Toolkit Forum
> 例えば下記のように unrefしようとすると失敗するので、ベースコードのままにしています。
...
> 前者に対策をしてもリークしているということは、ご指摘の通り後者も確かに怪しいです。

同様にして、json_node_is_null (init_node) でチェックすると、
nullになっていましたので、 output_node をunrefすることで同時に解放されており、
これはリーク元ではないようです。

2023年2月28日火曜日 18:41:15 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Feb 28, 2023, 9:50:14 PM2/28/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, yuki.kin...@ambl.co.jp, EDGEMATRIX Stream Toolkit Forum
> out_array = json_array_new ();

もう一点、この部分もメモリ確保されており、以下のようにoutput_nodeに渡されていますが、
こちらは解放されていないようです。

output_node = json_node_init_array (json_node_alloc (), out_array);

json_array_unref (out_array) を最後に呼んでいただくとref countが0になります。

segmentationのテンプレートでは同様になっていましたので、unrefを追加しておきます。

ちなみに、他のテンプレートで使用しているように、json builderを使う方が便利です。

2023年3月1日水曜日 11:31:22 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Apr 4, 2023, 6:25:00 AM4/4/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, yuki.kin...@ambl.co.jp, EDGEMATRIX Stream Toolkit Forum
お世話になっております。

その後の調査で、メタデータにリークが確認できました。

emcustomのプラグライン自体での対応が必要でしたので、
v2.5向けの最新EDGEMATRIX Stream v2.12.1にfixを投入し、
最後に共有いただいたファイル(custom.c)でも、
リークが解消するのを確認しました。

ベータ版として正式リリース前にアクセス可能にしようと思いますが、
いかがでしょうか?

2023年3月1日水曜日 11:50:14 UTC+9 ts...@edgematrix.com:

木下裕貴

unread,
Apr 4, 2023, 9:16:31 PM4/4/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, 木下裕貴, EDGEMATRIX Stream Toolkit Forum
お世話になっております。
調査・修正対応いただきありがとうございます。

ご提案いただいた通り、ベータ版へのアクセス権限をいただけないでしょうか。
手元でも調査いたします。

お手数おかけしますがご対応よろしくお願い致します。


2023年4月4日火曜日 19:25:00 UTC+9 ts...@edgematrix.com:

ts...@edgematrix.com

unread,
Apr 5, 2023, 7:59:21 PM4/5/23
to EDGEMATRIX Stream Toolkit Forum, yuki.kin...@ambl.co.jp, ts...@edgematrix.com, EDGEMATRIX Stream Toolkit Forum
承知しました。

それではプロダクション環境に準備でき次第、
手順と合わせてご案内します。

2023年4月5日水曜日 10:16:31 UTC+9 yuki.kin...@ambl.co.jp:

ts...@edgematrix.com

unread,
Apr 9, 2023, 10:57:59 PM4/9/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, yuki.kin...@ambl.co.jp, EDGEMATRIX Stream Toolkit Forum
こちらに案内を出しましたので、ご確認ください。

2023年4月6日木曜日 8:59:21 UTC+9 ts...@edgematrix.com:

木下裕貴

unread,
Apr 20, 2023, 5:12:05 AM4/20/23
to EDGEMATRIX Stream Toolkit Forum, ts...@edgematrix.com, 木下裕貴, EDGEMATRIX Stream Toolkit Forum
ご対応いただきありがとうございます。

手元でメモリリークしないことが確認できました。


2023年4月10日月曜日 11:57:59 UTC+9 ts...@edgematrix.com:
メモリ使用率.png
Reply all
Reply to author
Forward
0 new messages