본문으로 건너뛰기

성능 튜닝

개요

PlantPulse 의 성능은 수집 → 처리 → 저장 의 각 계층 병목을 차례로 제거해야 향상됩니다. 무조건 모든 값을 키우는 것이 아니라, 모니터링 지표를 보고 병목 지점만 조정하는 것이 핵심입니다.

튜닝 원칙 3가지

  1. 한 번에 하나만: 동시에 여러 변수를 바꾸면 어떤 변경이 효과를 냈는지 알 수 없습니다.
  2. 운영 데이터 기반: stage 환경 + 실제 트래픽 재현 후 변경.
  3. 기록 남기기: 변경한 값, 변경 전후 지표를 GitOps / 운영 wiki 에 남기세요.

운영 환경별 권장 출발점

환경CPU메모리디스크권장 PIPELINE_THREADS권장 PIPELINE_RATELIMIT
개발16 vCPU64 GBSSD1610,000 MPS
표준32 vCPU128 GBNVMe3640,000 MPS
대규모48+ vCPU200+ GBNVMe64100,000 MPS

env.sh 기반 핵심 튜닝 변수

운영 환경에서 가장 자주 조정하는 변수는 호스트의 bin/env.shcompose/docker-compose.yml 에서 관리됩니다 → 환경 변수 레퍼런스

변수기본영향
PP_CLUSTER_CORES30Spark / 분석 코어 할당
PP_CLUSTER_MEMORY_BY_CORE2GSpark executor 메모리/코어
PP_LANG / PP_TZko / Asia/SeoulJVM locale / timezone
JAVA_TOOL_OPTIONS자동 생성모든 자식 JVM 에 자동 적용

상세 변수는 프로퍼티 레퍼런스 의 env.sh 변수 인덱스 참고.

측정 도구

튜닝 전후를 비교할 수 있는 도구:

cd /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin

./status.sh # 모듈별 CPU / 메모리(PSS) 요약
./ops-check.sh # 헬스 + critical log
./memory-check.sh # 모듈별 메모리 상세
./memory-rank.sh # 메모리 순위
./pd node tpstats # Cassandra 스레드풀
./pd node compactionstats # Cassandra 컴팩션
./pd node table-stats # 테이블별 통계
./pd node proxyhistograms # Cassandra 지연 히스토그램

# Kafka consumer lag
./pd node topic

# JVM Heap / GC (컨테이너 진입 후)
./shell.sh
jcmd <pid> GC.heap_info
jcmd <pid> GC.heap_dump /tmp/heap.hprof

외부 모니터링 (Grafana / Prometheus) 은 시스템 모니터링 페이지 참고.

안내: 성능 튜닝은 서버 사양, 데이터 규모, 사용 패턴에 따라 최적값이 달라질 수 있습니다. 아래의 권장 설정을 기준으로 시작하시고, 모니터링 결과를 확인하면서 점진적으로 조정해 나가시는 것을 권장합니다.

엔진 파이프라인 튜닝

설정 파일: plantpulse-server/config/plantpulse-engine.properties

안내: 엔진 파이프라인은 센서에서 수집된 데이터가 처리되는 핵심 경로입니다. 이 설정을 통해 데이터의 처리 속도와 용량을 조절할 수 있습니다.

파이프라인 핵심 파라미터

파라미터기본값설명튜닝 가이드
engine.pipeline.threads36파이프라인 워커 스레드 수호스트 코어 수의 70~80%를 권장합니다 (검증 환경 48코어 → 36)
engine.pipeline.ratelimit40000초당 최대 처리 메시지 수 (MPS)서버 사양에 맞게 조정해 주세요
engine.pipeline.queue.size1200000파이프라인 큐 최대 크기메모리 여유분에 맞게 조정해 주세요
engine.pipeline.queue.o3.delay50Out-of-Order 지연 처리 (ms)네트워크 지연에 따라 조정해 주세요
engine.pipeline.task.modeSINGLE파이프라인 태스크 모드SINGLE 또는 MULTI
engine.async.parallelism256비동기 병렬 처리 수CPU 코어의 8~16배를 권장합니다

스트리밍 설정

파라미터기본값설명
engine.stream.processorDIRECT스트림 처리 모드
engine.streaming.messaging.warning.ms5000메시지 지연 경고 기준 (ms)
engine.streaming.messaging.timeout.ms10000메시지 타임아웃 (ms)
engine.streaming.messaging.timeout.store.typeFILE_QUEUE타임아웃 메시지 저장 방식
engine.streaming.messaging.timeout.recovery.typeDB타임아웃 복구 방식

작업 스레드

파라미터기본값설명
engine.job.thread.asset8에셋 작업 스레드 수
engine.job.thread.point8포인트 작업 스레드 수

사양별 권장 설정

아래 표는 서버 사양에 따른 권장 설정값입니다. 운영 환경의 사양에 맞는 열을 참고하여 설정해 주세요.

항목소규모 (8코어/64GB)중규모 (16코어/128GB)대규모 (32코어/256GB)
pipeline.threads163664
pipeline.ratelimit10,00040,000100,000
pipeline.queue.size300,0001,200,0003,000,000
async.parallelism64256512

Cassandra 튜닝

설정 파일: plantpulse-storage/db/cassandra/conf/cassandra.yaml

안내: Cassandra는 시계열 데이터를 저장하는 핵심 데이터베이스입니다. 데이터 규모가 커질수록 Cassandra 튜닝이 전체 성능에 큰 영향을 미치므로, 운영 환경에 맞게 조정해 주시는 것을 권장합니다.

메모리 설정

파라미터기본값설명
memtable_heap_space2GiBMemtable 힙 메모리
memtable_offheap_space2GiBMemtable Off-Heap 메모리
memtable_allocation_typeoffheap_objects메모리 할당 타입
memtable_flush_writers8Memtable 플러시 스레드 수

동시성 설정

파라미터기본값설명튜닝 가이드
concurrent_reads256동시 읽기 스레드디스크 수 x 16을 권장합니다
concurrent_writes256동시 쓰기 스레드CPU 코어 x 8을 권장합니다
concurrent_counter_writes256동시 카운터 쓰기concurrent_writes와 동일하게 설정해 주세요
concurrent_compactors8동시 컴팩션 스레드CPU 코어 수의 1/4을 권장합니다

커밋로그

파라미터기본값설명
commitlog_syncperiodic동기 방식
commitlog_sync_period10000ms동기 주기
commitlog_segment_size320MiB세그먼트 크기
commitlog_total_space32GiB전체 커밋로그 공간

타임아웃

파라미터기본값설명
read_request_timeout10000ms읽기 타임아웃
write_request_timeout60000ms쓰기 타임아웃
counter_write_request_timeout10000ms카운터 쓰기 타임아웃
cas_contention_timeout1000msCAS 경합 타임아웃
truncate_request_timeout600000msTruncate 타임아웃

컴팩션 전략

PlantPulse는 시계열 데이터 특성에 맞는 **UCS(Unified Compaction Strategy)**를 사용합니다.

안내: 컴팩션(Compaction)은 Cassandra가 디스크에 저장된 데이터 파일(SSTable)을 정리하고 병합하는 작업입니다. 적절한 컴팩션 전략을 사용하면 디스크 공간을 절약하고 읽기 성능을 향상시킬 수 있습니다.

storage.properties 설정:

파라미터기본값설명
storage.table.compaction.strategyUCS컴팩션 전략 (UCS 또는 TWCS)
storage.table.compaction.strategy.ucs.scailing_parameterT8스케일링 파라미터
storage.table.compaction.strategy.ucs.min_sstable_size128MiB최소 SSTable 크기
storage.table.compaction.strategy.ucs.target_sstable_size512MiB목표 SSTable 크기
storage.table.compaction.strategy.ucs.base_shard_count8베이스 샤드 수
storage.table.compaction.strategy.ucs.max_sstables_to_compact6최대 컴팩션 SSTable 수

압축

ZStandard 딕셔너리 압축을 사용합니다:

파라미터기본값설명
storage.compression.zstd.typeZstdDictionaryCompressor압축 방식
storage.compression.zstd.level3압축 레벨 (1~22, 높을수록 압축률은 올라가지만 속도는 느려집니다)

TTL (데이터 보존 기간)

storage.properties에서 테이블별 TTL을 설정합니다. TTL이 지나면 해당 데이터는 자동으로 삭제되므로, 데이터 보존 요구사항에 맞게 설정해 주세요.

파라미터기본값설명
storage.tag.point.ttl62 (일)태그 포인트 원본 데이터
storage.tag.point.map.ttl1 (일)태그 포인트 맵
storage.tag.point.sampling.ttl93 (일)샘플링 데이터
storage.tag.point.snapshot.ttl93 (일)스냅샷 데이터
storage.tag.point.aggregation.ttl93 (일)집계 데이터
storage.tag.point.archive.ttl365 (일)아카이브 데이터
storage.tag.blob.ttl93 (일)BLOB 데이터
storage.asset.data.ttl10 (일)에셋 데이터
storage.asset.data.sampling.ttl31 (일)에셋 샘플링 데이터

Cassandra 성능 점검 명령어

아래 명령어를 사용하여 Cassandra의 성능 상태를 점검하실 수 있습니다:

# 컴팩션 상태 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node compactionstats

# 테이블별 통계 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node table-stats

# 테이블 히스토그램 (읽기/쓰기 지연)
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node table-histograms

# SSTable 크기 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node sstable-size

# 스레드풀 통계
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node tpstats

Spark 튜닝

설정 파일: plantpulse-analytics/spark/conf/spark-defaults.conf

안내: Apache Spark는 대용량 데이터 분석을 위한 분산 처리 엔진입니다. 분석 작업의 속도와 안정성을 높이기 위해 아래 설정을 참고해 주세요.

리소스 할당

파라미터기본값설명
spark.cores.max16Spark 최대 사용 코어
spark.driver.cores2드라이버 코어 수
spark.driver.memory4g드라이버 메모리
spark.executor.cores1Executor 코어 수
spark.executor.memory2GExecutor 메모리
spark.executor.memoryOverhead2gExecutor 오버헤드 메모리

동적 할당

파라미터기본값설명
spark.dynamicAllocation.enabledtrue동적 Executor 할당
spark.dynamicAllocation.minExecutors2최소 Executor 수
spark.dynamicAllocation.maxExecutors16최대 Executor 수
spark.dynamicAllocation.executorIdleTimeout30유휴 Executor 해제 시간 (초)

셔플 및 병렬도

파라미터기본값설명
spark.default.parallelism64기본 병렬도
spark.sql.shuffle.partitions128SQL 셔플 파티션 수
spark.sql.adaptive.enabledtrueAdaptive Query Execution
spark.sql.adaptive.coalescePartitions.enabledtrue파티션 자동 병합

JVM 설정

Spark 드라이버/Executor 모두 ZGC를 사용합니다:

-XX:+UseZGC
-XX:+AlwaysPreTouch
-XX:+UseTLAB
-XX:+ResizeTLAB
-XX:+DisableExplicitGC

S3 (MinIO) 연동 설정

파라미터기본값설명
spark.hadoop.fs.s3a.connection.maximum400최대 S3 연결 수
spark.hadoop.fs.s3a.threads.max128최대 S3 스레드
spark.hadoop.fs.s3a.max.total.tasks1024최대 비동기 작업
spark.hadoop.fs.s3a.fast.uploadtrue빠른 업로드 활성화
spark.hadoop.fs.s3a.fast.upload.bufferdisk업로드 버퍼 타입
spark.hadoop.fs.s3a.block.size128MBS3 블록 크기

Iceberg 설정

파라미터기본값설명
spark.sql.iceberg.write.target-file-size-bytes256MB대상 파일 크기
spark.sql.iceberg.column-stats.enabledtrue컬럼 통계 활성화
spark.sql.iceberg.vectorization.enabledtrue벡터화 읽기 활성화
spark.sql.iceberg.manifest.merge.enabledtrue매니페스트 병합
spark.sql.parquet.compression.codeczstdParquet 압축 코덱

Kafka 튜닝

설정 파일: plantpulse-messaging/kafka/config/server.properties

안내: Kafka는 센서 데이터를 실시간으로 전달하는 메시지 브로커입니다. 데이터 양이 많아지면 Kafka 설정을 조정하여 처리 성능을 높일 수 있습니다.

핵심 설정

파라미터기본값설명
num.network.threads3네트워크 처리 스레드
num.io.threads8I/O 처리 스레드
socket.send.buffer.bytes102400소켓 전송 버퍼
socket.receive.buffer.bytes102400소켓 수신 버퍼
socket.request.max.bytes104857600최대 요청 크기 (100MB)
num.partitions1기본 파티션 수
log.retention.hours168로그 보존 기간 (7일)
log.segment.bytes1073741824로그 세그먼트 크기 (1GB)

대용량 처리 튜닝

대량의 IoT 데이터를 처리하실 경우, 아래 설정을 참고하여 조정해 주세요:

# 파티션 수 증가 (메시지 병렬 처리)
num.partitions=4

# I/O 스레드 증가
num.io.threads=16

# 네트워크 스레드 증가
num.network.threads=8

# 소켓 버퍼 증가
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576

메시징 설정

설정 파일: plantpulse-server/config/plantpulse-mq.properties

Kafka DDS 토픽

파라미터기본값용도
mq.dds.kafka.topic.tag.pointpp-tag-point태그 포인트 값
mq.dds.kafka.topic.tag.alarmpp-tag-alarm태그 알람
mq.dds.kafka.topic.asset.datapp-asset-data에셋 데이터
mq.dds.kafka.topic.asset.alarmpp-asset-alarm에셋 알람
mq.dds.kafka.topic.asset.eventpp-asset-event에셋 이벤트
mq.dds.kafka.topic.asset.aggregationpp-asset-aggregation에셋 집계
mq.dds.kafka.topic.domain.changed.eventpp-domain-changed-event메타데이터 변경

MQTT DDS 토픽

파라미터기본값용도
mq.dds.mqtt.topic.tag.pointtag/point/{tag_id}태그별 포인트 값
mq.dds.mqtt.topic.tag.alarmtag/alarm/{tag_id}태그별 알람
mq.dds.mqtt.topic.asset.dataasset/data/{asset_id}에셋별 데이터
mq.dds.mqtt.topic.asset.commandasset/command/{asset_id}에셋 제어 명령

스케줄러 설정

설정 파일: quartz.properties (웹앱 내부 클래스패스 리소스 — 외부화 대상 아님)

파라미터기본값설명
org.quartz.threadPool.threadCount8스케줄러 스레드 수
org.quartz.threadPool.threadPriority5스레드 우선순위

메일 / 알림 설정

설정 파일: plantpulse-server/config/plantpulse-mail.properties

파라미터기본값설명
mail.smtp.host192.168.0.41SMTP 서버 주소
mail.smtp.port25SMTP 포트
mail.smtp.authfalse인증 사용 여부
mail.smtp.starttls.enablefalseTLS 사용 여부

애플리케이션 설정

application.properties 파일은 2026.06 에 제거되었습니다. 테마 / 홈페이지 등 콘솔 동작 설정은 콘솔의 시스템 > 설정 관리 (PostgreSQL mm_config 테이블)에서 관리하고, alarm.duplicate.check.minutes(중복 알람 체크 간격, 분)는 plantpulse-server/config/plantpulse-engine.properties 로 이관되었습니다.


성능 병목 진단

성능 문제가 발생했을 때 아래 증상별 진단 방법과 해결책을 참고해 주세요.

1. 파이프라인 큐 적체

증상: 파이프라인 대기 큐가 지속적으로 증가합니다

# Grafana 대시보드에서 "파이프라인 대기 큐" 패널을 확인해 주세요
# 또는 JMX: pipeline.queue.size 값을 확인해 주세요

해결:

  • engine.pipeline.threads 값을 늘려 주세요
  • engine.pipeline.ratelimit 값을 상향 조정해 주세요
  • Cassandra 쓰기 성능을 확인해 주세요

2. Cassandra 쓰기 지연

증상: 쓰기 타임아웃 또는 WriteTimeoutException이 발생합니다

# 컴팩션 상태 확인
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node compactionstats

# Memtable 플러시
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node flush

해결:

  • concurrent_writes 값을 늘려 주세요
  • compaction_throughput 값을 늘려 주세요
  • 디스크 I/O 성능을 점검해 주세요 (SSD 사용을 권장합니다)

3. 메모리 부족

증상: JVM GC가 빈번하게 발생하거나 OutOfMemoryError가 발생합니다

해결:

  • 서비스 모듈의 bin/start.sh에서 -Xmx 값을 늘려 주세요
  • engine.pipeline.queue.size 값을 줄여 메모리 사용을 절약해 주세요
  • 불필요한 캐시를 비활성화해 주세요

4. 네트워크 지연

증상: 데이터 수신 지연이 증가합니다 (Grafana "네트워크 지연" 패널에서 확인 가능)

해결:

  • OPC 서버와 PlantPulse 간 네트워크 상태를 확인해 주세요
  • engine.streaming.messaging.timeout.ms 값을 조정해 주세요
  • MQTT QoS 레벨을 확인해 주세요

기술 지원

성능 튜닝 관련 문의: webmaster@kopens.com