Skip to content

gwanil/SysMonitor_Agent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Linux System Monitor Agent (C/Pthread/Socket)

Language Platform License

📖 Project Overview

Linux System Monitor Agent는 리눅스 커널의 시스템 정보를 실시간으로 수집하여 원격 관제 서버로 전송하는 경량 임베디드 에이전트입니다.

상용 라이브러리를 사용하지 않고 순수 C언어Linux System Call만을 사용하여 구현하였으며, 멀티스레드(Multi-threading) 환경에서의 동기화 처리와 TCP 소켓 통신을 직접 구현하여 시스템 프로그래밍 역량을 입증하는 데 초점을 맞추었습니다.


🚀 Key Features

  • 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) 로직을 구현하여 연결 안정성을 확보했습니다.

🛠 Architecture

데이터의 수집과 전송이 비동기적으로 이루어지는 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"]

Loading
  1. Collector: /proc/stat, /proc/meminfo를 파싱하여 SystemData 구조체를 업데이트합니다.
  2. Shared Data: 두 스레드가 공유하는 전역 구조체로, pthread_mutex로 보호됩니다.
  3. Sender: 주기적으로 데이터를 읽어 TCP 패킷으로 변환 후 서버로 전송합니다.

💻 Tech Stack

  • Language: C (Standard C99)
  • OS: Linux (Ubuntu 20.04+)
  • Library: POSIX Threads (pthread), Standard Socket API
  • Build Tool: GNU Make (Makefile)

📂 Directory Structure

SysMonitor_Agent/
├── include/
│   └── monitor.h      # 구조체 정의 및 함수 프로토타입 선언
├── src/
│   ├── main.c         # 메인 엔트리 (스레드 생성 및 종료 관리)
│   ├── collector.c    # /proc 파싱 및 리소스 계산 로직
│   └── sender.c       # 소켓 생성 및 데이터 전송 로직
├── obj/               # 빌드된 오브젝트 파일 (.o) 저장소
├── Makefile           # 빌드 자동화 스크립트
└── README.md          # 프로젝트 문서

🔧 How to Build & Run

1. Build

make 명령어를 통해 소스 코드를 컴파일합니다.

$ make
# 빌드 완료! ./monitor_agent 로 실행하세요.

2. Run (Agent)

빌드된 실행 파일을 실행합니다.

$ ./monitor_agent

3. Test Server (Optional)

로컬 환경에서 데이터 전송을 확인하기 위해 netcat으로 더미 서버를 열어 테스트할 수 있습니다.

# 터미널 1 (서버 역할)
$ nc -l 8080

# 터미널 2 (에이전트 실행)
$ ./monitor_agent

🔍 Implementation Details (For Interview)

1. Why /proc filesystem?

top이나 free 같은 외부 명령어를 호출(system())하는 방식은 오버헤드가 큽니다. 임베디드 환경의 성능 최적화를 위해 커널 정보를 담고 있는 /proc 가상 파일을 직접 open/read하여 파싱하는 방식을 택했습니다.

2. Thread Synchronization

CollectorSender가 동시에 전역 변수 current_data에 접근할 경우 데이터 불일치가 발생할 수 있습니다. 이를 해결하기 위해 Mutex Lock을 적용하여 Critical Section을 보호했습니다.

pthread_mutex_lock(&data_lock);
// Critical Section: 데이터 읽기/쓰기
pthread_mutex_unlock(&data_lock);

3. Network Stability

네트워크 장비 특성상 연결이 끊길 수 있음을 고려하여, connect() 실패 시 3초 간격으로 재접속을 시도하는 Retry Logicwhile 루프로 구현했습니다.


👤 Author

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors