
안녕하십니까?! 이번에 소개해볼 프로젝트는 토끼라는 프로젝트입니다!
Token Inspector에서 따와서 지은 이름으로, 한국 개발자가 만들었다는 느낌도 살리고 싶어서 토끼로 이름을 짓게 되었네요.
그래서 Toki란 무엇이냐? 복잡한 설정 없이 원큐에 설치되며, AI 토큰 사용량을 초저비용으로 실시간 추적하는 로컬 분석 엔진입니다.
개발하게 된 계기는, 회사에서도 ccusage를 통해 재미 삼아 내부직원들끼리 토큰을 얼마나 녹이고 있는지 경쟁도 하는데, ccusage로 인한 컴퓨팅 렉도 심하고 내부 소스 코드를 뜯어보니 절대 전문 개발자가 개발한 것으로는 안 보이더군요...
그래서 개발하게 된 프로그램은 3가지 모듈로, 각각 다른 문제점들을 해결하고 편의성을 제공하고자 하고 있습니다.
1. Toki - https://github.com/korjwl1/toki [멀티 OS]
기존 문제 사항
- CCusage는 아이디어는 재밌고 좋았지만, 매번 모든 세션 파일들을 읽기 때문에 File I/O가 엄청나게 발생하는데, 심지어 그마저도 싱글 스레드로 메모리/cpu 최적화 없이 무지막지하게 동작하기에 hook 등으로 자동연동까지 걸어두면 어느 순간부터 PC가 상당히 렉먹기 시작합니다.
- 멀티스레딩으로 이걸 해결해보고자 하던 프로젝트들은 보이긴 하지만, 인지도도 부족하고, 매번 증분 데이터가 아니라 파일 전체를 읽는데다가, 그냥 CCusage를 단순히 멀티스레딩화 했을 뿐이라 메모리 사용량이 미쳐 날뜁니다.
- OTEL을 사용하면 사용량 집계가 증분으로 가능하긴 한데, 이건 결국 중앙 집계 서버가 있어야하고 설치 과정도 좀 귀찮고, 집계 시작 시점 이전의 데이터는 결국 집계가 불가능하기 때문에 CCusage 같은 프로그램이 사용자층이 있었다고 보고 있었습니다.
해결 방법
- Toki는 크게 보면 2가지 사이클로 동작합니다. Cold-start라고 프로그램 부팅 시 세션 파일을 돌아보면서 데이터를 쌓는 과정, 그 다음에는 idle 상태로 FSevents 등 각 OS의 파일 변화 탐지 이벤트를 받아 증분 데이터만 추출해내는 과정. 내부적으로는 fjall이라는 DB를 다목적 경량 DB로 사용하고 있습니다. (TSDB + NoSQL 역할)
- Cold-start의 경우, Rust의 Rayon을 통해서 효율적으로 멀티 스레딩을 관리하게 설계해두었고, mmap을 통해 File I/O를 최소화하면서 파일 내부는 토큰 사용량이 찍히지도 않는 줄은 아예 스킵, 토큰 사용량이 찍히는 부분도 개인정보보호 및 속도 향상을 위해서 serde_json에서 정확히 토큰 사용량 field를 제외한 모든 문자열을 처리조차 하지 않게 하는 등 가할 수 있는 모든 최적화는 적용해두었습니다.
- Idle 상태 및 2번째 이후의 Cold-start는 모두 fjall의 포인터를 통하여 읽어야할 위치만 읽도록 설계되었습니다. Git에서 사용하는 Rolling HashSum을 응용해서, 마지막으로 읽었던 줄의 정보를 hash값 하나로 저장하고, 비교를 hash로 하여 O(1)이 되도록 한 다음, 이를 파일 끝에서부터 역순으로 탐색하여 만약 compact 등의 과정으로 파일 앞단이 날라가 줄 위치가 바뀌어도 항상 안정적으로 동작하도록 해두었으며, 이로 인해 누락되는 사용량이 존재할 수 없습니다.
- 데이터 집계랑 데이터 조회, 추적 등을 전부 분리시켜 병목현상을 제거하기 위해 도커와 같은 daemon 형식을 취하고 있으며, 이로 인해 쓰기 작업에 동시에 2개 이상이 붙을 일이 없게 만들어 잠시라도 멈추지 않고, 조회 과정이 데이터 집계에 영향을 주지 않습니다.
- 데이터 조회의 경우, 크게 trace, query 방식으로 나뉘는데요, trace는 실시간으로 토큰 사용량 찍히는 것을 바로 전달받을 수 있게하는 기능으로 기존의 otel을 대체하는 기능이라고 보면 됩니다. 이 때, sink를 cout, uds, http 중 하나로 지정해서 사용할 수 있게 하여 다양한 프로그램과의 연동성을 챙겨뒀습니다. 또한, trace 기능은 무조건 1:n crossbeam 구조로 아무리 많은 클라이언트가 붙어도 각자가 데이터 누락 없이 데이터를 받아갈 수 있는데 데몬의 cpu및 메모리 사용량이 증가하는 일이 없도록 억제해두었습니다.
- query 및 report 기능은 기존 ccusage를 대체하는 기능으로, query는 prometheus의 PromQL 기반으로 살짝 수정을 가해둔 문법을 따르며, report는 이를 내부적으로 프리셋을 만들어주고 제공하여 문법을 몰라도 쓰기 쉽도록 개발해두었습니다.
결과



- 위에서 보이는 것처럼, 기존 ccusage랑 비교 시, cold-start 자체도 M1 맥북 에어 기준 14배 가량 빨라지는데 메모리는 사용량이 거의 없다시피 줄어있으며, idle 상태 진입 시 1714배 이상 빠른 속도를 보여주며, 메모리랑 cpu는 아예 0%에 5MB 정도밖에 안 먹을정도로 가볍습니다.
- ccusage를 Zig + 멀티스레딩 기반으로 개선한 zzusage랑 비교해도 cold-start도 속도가 거의 비슷한데, Toki는 db read/write까지 있는데도 불구하고 속도가 비슷하게 나온다는 점에서 엄청난 최적화라 볼 수 있고, 그럼에도 불구하고 zzusage랑 다르게 메모리 사용량은 거의 없다시피합니다.
- DB도 엄청나게 작은데, 2GB 정도의 세션 데이터가 있을 때 DB사이즈는 60mb 정도로, 개인 PC에서 크게 문제삼지 않을 용량이라 생각합니다.
- 현재는 Codex / Claude 두개를 지원하고 있으며, 나중에 추가해나갈 예정입니다.
2. Toki Monitor - https://github.com/korjwl1/toki-monitor [Mac 전용]



프로그램 목적
- 실시간으로 RunCat처럼 AI를 쓰면서 재미를 얻을 수 있는 프로그램을 개발하고 싶었습니다.
- 하는 김에 개인 사용자들은 Otel+Grafana 설치로 통계 데이터 분석하는 것도 번거롭고 귀찮기 때문에, 이러한 기능을 더 가벼운 사용성으로 제공하고 싶었습니다.
- 또한, Toki 자체는 CLI로 대다수 사용자들이 쓰기 편한 환경은 아니라고 생각합니다. 이를 비개발자분들도 쉽게 쓸 수 있는 GUI가 필요하다 봤습니다.
- 하는 김에, 남은 사용량 윈도우도 같이 보고 하면 편하지 않을까? 근데 이걸 기존에 제공하는 프로그램들도 있는데 어떻게 차별화를 할 것인가를 엄청 고심 많이 했습니다.
챠밍 포인트
- AI를 쓰면 Runcat처럼 토끼가 뜁니다
- 근데 그냥 뛰기만 하는게 아니라, RunCat이랑 다르게 쓰지 않고 쓰고 있지 않은 케이스에는 잠도 잡니다
- 기능 활성화 시, AI를 일정 사용량 이상으로 사용하고 있으면 피격 모션이 발생합니다. 또는 독 중독 옵션도 있어서, 애가 중독이 됩니다.
- 상단의 체력바는 Claude/Codex의 사용량 윈도우 중 본인이 희망하는 것과 연동시킬 수 있습니다. 토큰 윈도우가 줄어들수록 얘도 피통이 줄어서 HP가 노랑색에서 빨간색으로 변해갑니다.
- 토끼가 분신술도 쓸 수 있습니다! 클로드랑 코덱스 사용량 부분을 합쳐서 하나로 쓸 수도, 색을 다르게 하면서 별도로 2개를 띄울 수도 있습니다.
- 귀엽디 귀여운 토끼가 싫으시면.. 수치로 혹은 그래프로 변경해서 사용할 수도 있습니다.
- 대시보드는 아직 베타라서, 사용자화는 얼마나 잘 동작한다고 제가 감히 장담할 순 없지만.. 부드러운 애니메이션 등으로 정말 공들여 만들었고, Grafana의 문법과 비슷하게 계속 개선하고 있습니다.
- 디자인은 전부 Mac의 최신 Liquid Glass룩을 철저하게 따르고 있습니다.
3. Toki Sync - https://github.com/korjwl1/toki-sync
해당 프로젝트는 아직 베타 배포 중이라, 고오급 사용자 용으로 Readme도 부실하고, 사진도 많이 안 찍어놨네요.
Toki를 만들면서 들었던 생각은, 멀티 device를 쓰는 사람들의 요청에도 만족하고, 개인적으로 Token 분석하려는 사람, 사설 옵치 경쟁전 같은 LLM 토큰 사용량 경쟁 서버를 운영하면서 친구들끼리 가볍게 재미보고 싶은 사용자, 또는 아예 커뮤니티나 회사 등까지 폭넓게 커버할 수 있는 서버가 있으면 좋겠다는 생각이었습니다.
- 자체 프로토콜로, gRPC보다도 가볍고, 빠르고, 보안은 챙기면서 동작하는 TCP 프로토콜을 사용하고 있습니다.
- 최소한의 사용자를 위해 가볍게 사용할 수 있도록, fjall + Rust 서버로 AWS의 무료 EC2로도 문제없이 운영할 수 있도록 설계했습니다.
- 다수의 사용자를 대상으로는 DB 사이즈가 커질 것을 우려하여, External Clickhouse를 붙여서도 사용가능합니다.
- 자체적으로 사용자 인증 시스템, 권한 계층 분리 등 유저 관리 시스템을 내장하고 있습니다.
- Toki 및 Toki Monitor를 통해서 Sync를 맺고 해제할 수 있는데, Toki Monitor의 경우엔 현재 철저하게 개인 사용자 대상이라 본인의 데이터만 서버로부터 조회해서 볼 수 있도록 만들어놨으며 로컬 Toki랑 같은 Query 기반으로 동작합니다.
- 서버를 구축하고 싶은 사람들은, Toki Sync 위에다가 자체 대시보드를 얹고 RestAPI로 통신이 가능하며, 이 때는 서버 운영자 맘에 따라 다른 사용자 정보도 볼 수 있어, 웹 대시보드에서 옵치 경쟁전마냥 총 점수를 기반으로 줄 세우기를 해본다거나, 혹은 회사라고 하면 직원들의 토큰 사용 패턴을 수집하고 통계를 내서 회사 운영에도 사용할 수 있습니다.
- 아직 베타 버전이라 문제점 찾으시면 issue 남겨주세요..
모든 프로젝트는 제가 개인적으로 혼자 설계해서 개발, QA까지 전부 진행하고 있었으며, Contribute를 하고 싶다? 매우 환영입니다. 코드든, 애니메이션이든 다양한 기여를 해주시면 감사하겠습니다!
오픈 소스의 수호자로써 개인적인 사용이나 금전적인 목적이 아닌 모든 목적에 제 프로젝트를 가져가서 쓰시는 것은 환영이며, 만약 사업 등에서 사용 시 저에게 언질은 해주시면 감사하겠습니다.
모르는 사이에 하이쿠를 많이 썼네요. 소넷이 기본이었는데..
(위 아래로 배치한 멀티 모니터 상태에서 아래에 있는 모니터 메뉴바에서 누르면 위젯이 위쪽 모니터로 보입니다.)
그나저나 제가 맥북으로만 하고 있었어서 듀얼 모니터는 모르고 있었네요 ㄷㄷ
해당 상황에서 혹시 어떻게 됐어야 자연스러운 ux일거 같다 알려주시면 바로 다음 패치 때 고쳐놓겠습니다!