개발자 모드를 사용하여 메모리 및 캐시 사용량 확인¶
- 버전: 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 변동 폭이 크지만 문제 발생 위치를 파악할 수 없는 경우
- 캐시 과다 사용 문제를 해결하려면 캐시된 데이터 양을 반드시 알아야 함
- 캐시 과정에서 저장 및 조회 시점(동일 Lua 스크립트 또는 동일 기능의 스크립트)에만 cache의 type을 알 수 있음
- 그러나 cache 단위에서는 구체적인 저장 유형을 알 수 없음
- string, bool, int/float의 경우 크기를 알 수 있지만, lua.table 구조 유형은 직접 크기를 알 수 없음
- 따라서 lua.table 유형의 경우 디스크 저장 등 다른 처리를 해야 함
- 이렇게 해야 scheck 실행 중 메모리를 과도하게 점유하지 않도록 제어할 수 있으며, 실제로 150MB 이상 점유해서는 안 됨
- scheck이 비정상 종료된 후에도 종료 전 상태를 기반으로 중단점 재시작하여 계속 실행 가능
해결 방법:¶
- 동일한 스크립트 유형은 동일한 cache를 사용하고 key도 동일하지만, 서로 다른 파일(규칙 ID가 다름)로 인해 동일한 데이터가 두 개 저장되어 있음. 따라서 각각 두 개씩 저장하지 않고 동일한 캐시를 사용해야 함
- 위 문제를 해결하면 발생하는 또 다른 문제: 모든 규칙이 자체 cache 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은 캐시 내용을 읽지 않습니다. 중단점 재시작 등의 기능은 추후 개발 예정입니다.