開発者モードを使用したメモリとキャッシュの使用状況確認¶
- バージョン:1.0.7-7-g251eead
- リリース日:2023-04-06 11:17:57
- 対応OS:windows/amd64, windows/386, linux/arm, linux/arm64, linux/386, linux/amd64
説明¶
開発テストや実際の動作中に、lua が生成するキャッシュのサイズが制御不能になる場合があります。例えば、ディレクトリ内のファイルリストをキャッシュする場合、ファイル数が多すぎるとメモリ消費が大きくなり、深刻な場合は cgroup がトリガーされてプロセスがハングアップまたは停止する可能性があります。
そのため、開発者モードを使用することで、動作中にメモリ状況とキャッシュ状況をリアルタイムで確認できるようにすることが重要です。
cache_dev 開発者モード¶
解決したい問題と方法:¶
- メモリや CPU の変動が大きく、問題箇所を特定できない場合
- キャッシュが大きくなりすぎる問題を解決するには、キャッシュされたデータ量を把握する必要があります
- キャッシュの type は、保存時と取り出し時(同じ lua スクリプトまたは同様の機能のスクリプト)にしかわかりません
- しかし、キャッシュユニット内では具体的な保存タイプは不明です
- string、bool、int/float はサイズを把握できますが、lua.table 構造タイプは直接サイズを取得できません
- そのため、lua.table タイプは別の処理(例:ディスクへの書き込み)を行う必要があります
- これにより、scheck の動作中にメモリを過度に消費しないように制御できます。実際、150MB 以上を消費すべきではありません
- scheck が異常終了した場合でも、終了前の状態を維持してブレークポイントから再起動できるようにします
解決方法:¶
- 同じスクリプトタイプで使用するキャッシュは同じで、key も同じですが、異なるファイル(ルール ID が異なる)でまったく同じものが 2 つ保存されています。そのため、同じキャッシュを使用すべきであり、別々に 2 つ保存すべきではありません
- 上記の問題を解決すると、別の問題が生じます:すべてのルールに独自のキャッシュ key があるため、混乱しやすくなります
- キャッシュの永続化と可視化。これにより、問題の迅速な特定、モックテスト、ルールテストなどが容易になります
- 永続化後、メモリオーバーヘッドを削減できます
設定¶
設定ファイルを開き、pprof を true に設定します。
スイッチを有効にすると、ローカルポート 127.0.0.1:6060 がリッスンされ、このマシンからのみアクセス可能になります。go pprof コマンドを使用してメモリと CPU の使用状況を確認できます。公式ドキュメント
# 次に pprof ツールを使用してヒーププロファイルを表示します:
go tool pprof http://localhost:6060/debug/pprof/heap
# top 20
top 20
# list func name or pkg name
list
# または、30秒間のCPUプロファイルを表示します
go tool pprof http://localhost:6060/debug/pprof/profile
# または、ゴルーチンのブロックプロファイルを表示します
go tool pprof http://localhost:6060/debug/pprof/block
# 利用可能なすべてのプロファイルを表示するには、ブラウザで http://localhost:6060/debug/pprof/ にアクセスしてください。これらの仕組みの詳細については、以下を参照してください。
http://blog.golang.org/2011/06/profiling-go-programs.html
キャッシュ¶
開発者モードを有効にすると、lua スクリプトで生成されたキャッシュはインストールディレクトリ内の cache.json にシリアル化されます。
現在、サポートされている lua キャッシュタイプは次のとおりです:LTString、LTNumber、LTBool、LTTable。
サポートされていない lua タイプ:LTChannel、LTFunction、LTNil、LTThread、LTUserData。
{
"msg_data": {
"/boot/grub2/grub.cfg": { // key
"c_type": 0,
"rule_name": "0070-grub-priv", // ルール名
"val": "-rw-r--r--" // val stringタイプ
},
"/etc/fstab": {
"c_type": 1,
"rule_name": "0029-fstab-exist",
"val": true // val boolタイプ
},
"/usr/lib/systemd/system/docker.socket": {
"c_type": 2,
"rule_name": "0307-docker-socket-priv",
"val": 420 // val numberタイプ
}
...
}
}
一定間隔で全キャッシュがファイルに書き込まれます。scheck はキャッシュの内容を読み取りません。 ブレークポイントからの再起動などの機能は今後の開発で対応予定です。