Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhancement: Print Maximum memory usage after scan #788

Closed
YamatoSecurity opened this issue Nov 4, 2022 · 18 comments · Fixed by #822
Closed

Enhancement: Print Maximum memory usage after scan #788

YamatoSecurity opened this issue Nov 4, 2022 · 18 comments · Fixed by #822
Assignees
Labels
enhancement New feature or request
Milestone

Comments

@YamatoSecurity
Copy link
Collaborator

手動で最大のメモリ使用を確認するのが大変なので、スキャンが終わったタイミングでメモリ使用を調べて、最後にElasped time:の直前にMaximum memory usage: 1.22 GBなどを出力したいです。(他の例: 100.20 MB等々)

調べたら、capやbench-rsのcrateを使うとglobal memory allocatorを変えないといけないので、procinfo (https://docs.rs/procinfo/0.4.2/procinfo/pid/fn.statm_self.html )を使ったら良いかも?

これで検証する時にメモリ使用率が急増しているかどうか簡単に分かります。

@YamatoSecurity YamatoSecurity added the enhancement New feature or request label Nov 4, 2022
@YamatoSecurity YamatoSecurity added this to the v1.8.0 milestone Nov 4, 2022
@hitenkoku hitenkoku self-assigned this Nov 4, 2022
@hitenkoku
Copy link
Collaborator

ありがとうございます。1つ質問があります。
procinfoのメモリ利用量を確認するタイミングを確認したいのですが、以下の3つで大丈夫でしょうか。
その中で最も高い値をメモリ使用量をElapsed Timeの前に表示するという形でよろしいでしょうか。

  • 利用開始時(解析開始前)
  • 解析完了時(結果出力前)
  • 結果出力後

@hitenkoku
Copy link
Collaborator

procinfoを確認してみましたが、こちらはLinux用のものでしたのでWindows用のデータ取得は別途検討する必要があります

@hitenkoku
Copy link
Collaborator

こちらのほうがトータルのメモリ利用率の取得は容易なようです。ただし、プロセス単位では表示できなさそうです

https://crates.io/crates/memory-stats

@YamatoSecurity
Copy link
Collaborator Author

ありがとうございます。1つ質問があります。
procinfoのメモリ利用量を確認するタイミングを確認したいのですが、以下の3つで大丈夫でしょうか。
その中で最も高い値をメモリ使用量をElapsed Timeの前に表示するという形でよろしいでしょうか。

なるほど、確かに可能であれば違うタイミングで取って、最も高い値を出した方が良さそうですが、開始時はまだ少ないはずなので、不要かもしれません。(一回図ってみて、確認したら良いと思いますが)
スキャンが終わったら、メモリが開放されて急に減る可能性があるので、本当は99.9%のタイミングと、スキャン後に増えた場合、結果を出力している間が一番高そうです。結果出力後だと、メモリが開放されて、大分減っているはずです。(私が見ている限り)

procinfoはlinuxのみだったんですね。。ふむ、、トータルメモリだとHayabusaなのか、他のアプリが影響しているのか分からないので、プロセス単位が良さそうですね。後で他に良い方法がないか調べてみます。

@YamatoSecurity
Copy link
Collaborator Author

@hitenkoku https://crates.io/crates/simple-process-stats これはどうですか?

@hitenkoku
Copy link
Collaborator

@YamatoSecurity ありがとうございます。こちらであれば利用しているプロセスに対してメモリ使用率が取れそうなので実装してみます。

@hitenkoku
Copy link
Collaborator

simplre-process-statsをcargo.tomlに入れた時にmemchrのバージョンの競合でコンパイルが出来ないことを確認(memchrはHTML出力のために利用してるpulldown-cmarkではmemchr 2.5.0を利用。simple-process-statsはMac用のdarwin-libproc0.2.0がmemchr 2.3台までを指定されている)

@hitenkoku
Copy link
Collaborator

simple-process-statsで問題となっているライブラリ(darwin-libproc0.2.0)の最新版を確認してみましたが、更新されていないのを確認済み。別crateを探す方針とさせてください。

@YamatoSecurity
Copy link
Collaborator Author

思ったより簡単にできないですね〜。
Windowsの場合は特にスキャン中にメモリ使用がかなり変動するので、ピンポイントで最大のメモリ使用のスナップショットを取るのが難しそうです。Linux/Macではtimeコマンドで最大のメモリ使用(max resident set size)を簡単に測れるので、とりあえず別のツールとの組み合わせでメモリ使用を測りたいと思います。(Windowsの場合は、procmon等が使えそうです)

例: /usr/bin/time -l ./hayabusa-1.8.0-dev -d ../hayabusa-sample-evtx -o bla.csv
Screen Shot 2022-11-06 at 11 00 59

@fukusuket
Copy link
Collaborator

fukusuket commented Nov 21, 2022

@YamatoSecurity @hitenkoku

下記branchで試してみたところ
https://github.com/Yamato-Security/hayabusa/tree/dev-print-mimalloc-stats-info

mi-malloc本体のmi_stats_print_out関数をunsafeで直接呼ぶことでmi-mallocのメモリ統計情報は出力できました。mi_stats_print_out関数(C言語)を直接呼んでいるので、残念ながら出力内容を良い感じにカスタマイズはできないですが...😅

↑branch実行すると、以下の感じでmi-malloc自身が持つメモリ統計情報(おそらく自プロセスの)が出力されます。
(手元のWindows10/M1 Macでは↓出力確認できました)
mimalloc-stats-info

@hitenkoku
Copy link
Collaborator

@fukusuket 情報提供をしていただき誠にありがとうございます。素晴らしいです。デバッグの側面でもあるため出力に拘る必要は私はないと思いますのでこれで十分だと思います。他OS制限等もドキュメントを見た限りなさそうですね。

@YamatoSecurity unsafe関数ではありますがこれでピーク時(多分解析完了時付近)のメモリが取得できますがどうしましょうか。unsafe関数はなるべく減らすという方針もありますが、debug 用のオプションをつけることでデータを取得するようにするのも良いと思われますがいかがでしょうか。

@hitenkoku hitenkoku removed their assignment Nov 21, 2022
@hitenkoku
Copy link
Collaborator

一旦作成判断を行うためissueをreopenします。

@hitenkoku hitenkoku reopened this Nov 21, 2022
@YamatoSecurity
Copy link
Collaborator Author

良いですね。--debugオプションを付けた時に出力しましょうか?

@fukusuket
Copy link
Collaborator

@YamatoSecurity @hitenkoku

ご確認ありがとうございます🙇
debugオプションで出力する場合は、command usageにも↓の感じで、help出力したほうがよいですかね?🤔

OTHER-ACTIONS:
    ...
    --debug  Print memory usage.

またメモリ統計情報出力タイミングは、以下のどちらのパターンがよいですかね?

  • 最後1回だけ出力
  • 最後 + 解析完了時の2回出力

@hitenkoku
Copy link
Collaborator

個人的には追加しても良いと思います

またメモリ統計情報出力タイミングは、以下のどちらのパターンがよいですかね?

私は解析完了時に出してしまうと、結果の中に埋もれてしまうので最後1回だけの出力で良いかと思っています(Peakのところでその分は出ていると推測)

@YamatoSecurity
Copy link
Collaborator Author

debugオプションで出力する場合は、command usageにも↓の感じで、help出力したほうがよいですかね?🤔

そうですね。
DISPLAY-SETTINGS配下の--debug Print debug information (memory usage, etc...)で良いと思います。
※現在はメモリ情報だけですが、他にデバッグ情報を入れたい場合はこのオプションを使ったら良いと思います。

@hitenkoku hitenkoku modified the milestones: v1.8.0, v1.9.0 Nov 22, 2022
@hitenkoku
Copy link
Collaborator

それでは本機能を作成するということで承りました。
@fukusuket pull-requestを出してもらえればこちらで確認してマージ対応しますのでよろしくお願いいたします。

@hitenkoku hitenkoku removed the pending label Nov 22, 2022
@fukusuket
Copy link
Collaborator

承知しました!↓にて作成次第、PRお送りさせていただきます:)

  • 最後1回だけ出力
  • usageは、DISPLAY-SETTINGS: --debug Print debug information (memory usage, etc...)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants