Linux System Monitor Agent는 리눅스 커널의 시스템 정보를 실시간으로 수집하여 원격 관제 서버로 전송하는 경량 임베디드 에이전트입니다.
상용 라이브러리를 사용하지 않고 순수 C언어와 Linux System Call만을 사용하여 구현하였으며, 멀티스레드(Multi-threading) 환경에서의 동기화 처리와 TCP 소켓 통신을 직접 구현하여 시스템 프로그래밍 역량을 입증하는 데 초점을 맞추었습니다.
- Real-time Monitoring: 리눅스 가상 파일 시스템인
/proc을 직접 파싱하여 CPU 및 메모리 사용량을 계산합니다. - Multi-threaded Architecture:
Collector Thread: 1초 주기로 시스템 리소스를 수집합니다.Sender Thread: 3초 주기로 수집된 데이터를 서버로 전송합니다.
- Concurrency Control:
Mutex를 사용하여 스레드 간 공유 자원(Shared Memory) 접근 시 발생하는 Race Condition을 방지했습니다. - Network Communication: TCP 소켓을 사용하여 수집된 데이터를 안정적으로 전송합니다.
- Fault Tolerance: 서버 연결 실패 시 자동 재접속(Retry) 로직을 구현하여 연결 안정성을 확보했습니다.
데이터의 수집과 전송이 비동기적으로 이루어지는 Producer-Consumer 패턴의 변형을 적용했습니다.
graph LR
A["Linux Kernel (/proc)"] -->|Read| B("Collector Thread")
B -->|"Write (Lock)"| C{"Shared Data Struct"}
C -->|"Read (Lock)"| D("Sender Thread")
D -->|"TCP Socket"| E["Remote Server"]
- Collector:
/proc/stat,/proc/meminfo를 파싱하여SystemData구조체를 업데이트합니다. - Shared Data: 두 스레드가 공유하는 전역 구조체로,
pthread_mutex로 보호됩니다. - Sender: 주기적으로 데이터를 읽어 TCP 패킷으로 변환 후 서버로 전송합니다.
- Language: C (Standard C99)
- OS: Linux (Ubuntu 20.04+)
- Library: POSIX Threads (
pthread), Standard Socket API - Build Tool: GNU Make (
Makefile)
SysMonitor_Agent/
├── include/
│ └── monitor.h # 구조체 정의 및 함수 프로토타입 선언
├── src/
│ ├── main.c # 메인 엔트리 (스레드 생성 및 종료 관리)
│ ├── collector.c # /proc 파싱 및 리소스 계산 로직
│ └── sender.c # 소켓 생성 및 데이터 전송 로직
├── obj/ # 빌드된 오브젝트 파일 (.o) 저장소
├── Makefile # 빌드 자동화 스크립트
└── README.md # 프로젝트 문서
make 명령어를 통해 소스 코드를 컴파일합니다.
$ make
# 빌드 완료! ./monitor_agent 로 실행하세요.
빌드된 실행 파일을 실행합니다.
$ ./monitor_agent
로컬 환경에서 데이터 전송을 확인하기 위해 netcat으로 더미 서버를 열어 테스트할 수 있습니다.
# 터미널 1 (서버 역할)
$ nc -l 8080
# 터미널 2 (에이전트 실행)
$ ./monitor_agent
top이나 free 같은 외부 명령어를 호출(system())하는 방식은 오버헤드가 큽니다. 임베디드 환경의 성능 최적화를 위해 커널 정보를 담고 있는 /proc 가상 파일을 직접 open/read하여 파싱하는 방식을 택했습니다.
Collector와 Sender가 동시에 전역 변수 current_data에 접근할 경우 데이터 불일치가 발생할 수 있습니다. 이를 해결하기 위해 Mutex Lock을 적용하여 Critical Section을 보호했습니다.
pthread_mutex_lock(&data_lock);
// Critical Section: 데이터 읽기/쓰기
pthread_mutex_unlock(&data_lock);네트워크 장비 특성상 연결이 끊길 수 있음을 고려하여, connect() 실패 시 3초 간격으로 재접속을 시도하는 Retry Logic을 while 루프로 구현했습니다.
- Name: Jeong Gwan-il
- Role: Embedded System Developer
- Contact: jeonggwanil@gmail.com