Closed YamatoSecurity closed 1 year ago
ありがとうございます。1つ質問があります。 procinfoのメモリ利用量を確認するタイミングを確認したいのですが、以下の3つで大丈夫でしょうか。 その中で最も高い値をメモリ使用量をElapsed Timeの前に表示するという形でよろしいでしょうか。
procinfoを確認してみましたが、こちらはLinux用のものでしたのでWindows用のデータ取得は別途検討する必要があります
こちらのほうがトータルのメモリ利用率の取得は容易なようです。ただし、プロセス単位では表示できなさそうです
ありがとうございます。1つ質問があります。 procinfoのメモリ利用量を確認するタイミングを確認したいのですが、以下の3つで大丈夫でしょうか。 その中で最も高い値をメモリ使用量をElapsed Timeの前に表示するという形でよろしいでしょうか。
なるほど、確かに可能であれば違うタイミングで取って、最も高い値を出した方が良さそうですが、開始時はまだ少ないはずなので、不要かもしれません。(一回図ってみて、確認したら良いと思いますが) スキャンが終わったら、メモリが開放されて急に減る可能性があるので、本当は99.9%のタイミングと、スキャン後に増えた場合、結果を出力している間が一番高そうです。結果出力後だと、メモリが開放されて、大分減っているはずです。(私が見ている限り)
procinfoはlinuxのみだったんですね。。ふむ、、トータルメモリだとHayabusaなのか、他のアプリが影響しているのか分からないので、プロセス単位が良さそうですね。後で他に良い方法がないか調べてみます。
@hitenkoku https://crates.io/crates/simple-process-stats これはどうですか?
@YamatoSecurity ありがとうございます。こちらであれば利用しているプロセスに対してメモリ使用率が取れそうなので実装してみます。
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台までを指定されている)
simple-process-statsで問題となっているライブラリ(darwin-libproc0.2.0)の最新版を確認してみましたが、更新されていないのを確認済み。別crateを探す方針とさせてください。
思ったより簡単にできないですね〜。 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
@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では↓出力確認できました)
@fukusuket 情報提供をしていただき誠にありがとうございます。素晴らしいです。デバッグの側面でもあるため出力に拘る必要は私はないと思いますのでこれで十分だと思います。他OS制限等もドキュメントを見た限りなさそうですね。
@YamatoSecurity unsafe関数ではありますがこれでピーク時(多分解析完了時付近)のメモリが取得できますがどうしましょうか。unsafe関数はなるべく減らすという方針もありますが、debug 用のオプションをつけることでデータを取得するようにするのも良いと思われますがいかがでしょうか。
一旦作成判断を行うためissueをreopenします。
良いですね。--debug
オプションを付けた時に出力しましょうか?
@YamatoSecurity @hitenkoku
ご確認ありがとうございます🙇 debugオプションで出力する場合は、command usageにも↓の感じで、help出力したほうがよいですかね?🤔
OTHER-ACTIONS:
...
--debug Print memory usage.
またメモリ統計情報出力タイミングは、以下のどちらのパターンがよいですかね?
個人的には追加しても良いと思います
またメモリ統計情報出力タイミングは、以下のどちらのパターンがよいですかね?
私は解析完了時に出してしまうと、結果の中に埋もれてしまうので最後1回だけの出力で良いかと思っています(Peakのところでその分は出ていると推測)
debugオプションで出力する場合は、command usageにも↓の感じで、help出力したほうがよいですかね?🤔
そうですね。
DISPLAY-SETTINGS
配下の--debug Print debug information (memory usage, etc...)
で良いと思います。
※現在はメモリ情報だけですが、他にデバッグ情報を入れたい場合はこのオプションを使ったら良いと思います。
それでは本機能を作成するということで承りました。 @fukusuket pull-requestを出してもらえればこちらで確認してマージ対応しますのでよろしくお願いいたします。
承知しました!↓にて作成次第、PRお送りさせていただきます:)
手動で最大のメモリ使用を確認するのが大変なので、スキャンが終わったタイミングでメモリ使用を調べて、最後に
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 )を使ったら良いかも?これで検証する時にメモリ使用率が急増しているかどうか簡単に分かります。