728x90
반응형

Jmeter란?

  • Apache에서 자바로 만든 웹 애플리케이션 성능 테스트 오픈 소스입니다.
  • 위의 그림과 같은 GUI를 지원합니다.

테스트 용어

  • Thread Group : 테스트에 사용될 스레드 개수, 스레드 1개당 사용자 1명
  • Sampler : 사용자의 액션 (예: 로그인, 게시물 작성, 게시물 조회 등)
  • Listener : 응답을 받아 리포팅, 검증, 그래프 등 다양한 처리
  • Configuration : Sampler 또는 Listener가 사용할 설정 값 (쿠키, JDBC 커넥션 등)
  • Assertion : 응답 확인 방법 (응답 코드, 본문 내용 비교 등)

예시

  • Thread 개수가 1000 개이고, Ramp-up Period가 60, Loop Count가 10이면
    • 1000명의 유저가 60초 동안 10번 반복해서 요청 보낸다는 의미
  • Sampler - 사용자의 액션
    • 프로토콜, IP, 포트, HTTP, PATH 등을 지정 가능
    • Parameter와 Body 도 넘길 수 있음

설치 (MAC)

Homebrew 로 설치

  • MAC 기준 설치 및 실행
brew install jmeter
  • 실행
    open /opt/homebrew/bin/jmeter

소스 다운로드로 설치

cd apache-jmeter-5.6.2 

./bin/jmeter.sh
728x90
반응형

'데브옵스 devOps > Test' 카테고리의 다른 글

[JMeter] HTML 보고서 생성  (0) 2024.12.13
[JMeter] JMeter 란?  (0) 2024.12.12
728x90
반응형

HTML 보고서 만들기 (Mac - Homebrew)

  • Graph 차트로 만든 보고서를 csv로 저장한 후에 HTML로 보고서를 생성할 수 있다.

그래프 보고서 생성

  • 결과 파일 csv 저장하기 위해 경로 설정
    • Wirte result to file/Read from file
  • 설정 시 뜨는 오류는 무시해도 됨

HTML 보고서 생성

  • 보고서 설정
    • 상단의 Tool - Generate HTML 선택
      • csv: 그래프 차트 저장으로 생성된 CSV
      • properties: /bin/jmeter/jmeter.properties 선택
    • homebrew
      • properties: /opt/homebrew/Cellar/jmeter/버전/libexec/bin/jmeter.properties 선택
    • 결과 html 저장 경로
      • 빈 디렉토리어야 함. 따라서 새로운 폴더 생성

728x90
반응형

'데브옵스 devOps > Test' 카테고리의 다른 글

[JMeter] JMeter 설치  (0) 2024.12.16
[JMeter] JMeter 란?  (0) 2024.12.12
728x90
반응형

Jmeter란?

  • Apache에서 자바로 만든 웹 애플리케이션 성능 테스트 오픈 소스입니다.
  • 위의 그림과 같은 GUI를 지원합니다.

테스트 용어

  • Thread Group : 테스트에 사용될 스레드 개수, 스레드 1개당 사용자 1명
  • Sampler : 사용자의 액션 (예: 로그인, 게시물 작성, 게시물 조회 등)
  • Listener : 응답을 받아 리포팅, 검증, 그래프 등 다양한 처리
  • Configuration : Sampler 또는 Listener가 사용할 설정 값 (쿠키, JDBC 커넥션 등)
  • Assertion : 응답 확인 방법 (응답 코드, 본문 내용 비교 등)

예시

  • Thread 개수가 1000 개이고, Ramp-up Period가 60, Loop Count가 10이면
    • 1000명의 유저가 60초 동안 10번 반복해서 요청 보낸다는 의미
  • Sampler - 사용자의 액션
    • 프로토콜, IP, 포트, HTTP, PATH 등을 지정 가능
    • Parameter와 Body 도 넘길 수 있음

테스트 수행

  • 아래처럼 생각하면 좋다
    • Thread Group 추가 - 테스트 설정
    • Sampler 추가 - 요청 관련 설정
    • Listener 추가 - 테스트 결과 확인

Add Thread Group

  • 테스트 세팅
    • Thread, Ramp up, Loop Count

Add Sampler - HTTP Request

  • 요청 세팅
    • 프로토콜, url, port, body 등 세팅

Add Listener - Summary Report

  • 상단 초록색 실행 아이콘 눌렀을 때, 그. 테스트 결과 확인
    • samplers: 표본 수
    • Average: 응답 시간 (ms)
    • Min: 응답 시간 (ms)
    • Max: 응답 시간 (ms)
    • Error: 400 / 500 번대 응답 코드 비율
    • Throughput: TPS(Transaction Per Second) 초당 처리량
728x90
반응형

'데브옵스 devOps > Test' 카테고리의 다른 글

[JMeter] JMeter 설치  (0) 2024.12.16
[JMeter] HTML 보고서 생성  (0) 2024.12.13
728x90
반응형

rsync

  • remote sync의 약자
  • unix 및 linux 시스템에서 파일을 효율적으로 전송 및 동기화 하기 위한 유틸리티
  • 로컬/원격지 모두 동기화 가능
  • 변경된 사항만 빠르게 동기화가 가능
  • scp보다 빠르고 효율적

옵션 정리

-v: verbosity를 높이는 방법으로, 과정을 더 상세히 출력
-z: compress를 주는 옵션으로, 파일을 압축해서 복사. 용량이 큰 파일에 대해 사용
-h: 인간이 읽을 수 있는 형태로 복사 결과 출력
-a: Archive 모드로, symlink, 권한등의 속성을 그대로 복사. 항상 넣어 주는게 좋음
-l: symlink 형태로 복사
-p: 파일과 디렉토리들의 권한을 유지
-g: 그룹 속성을 유지
-o: 소유자 속성을 유지
-r: 디렉토리를 복사할 때 사용하는 옵션. -a 옵션을 사용할 경우 -a 안에 포함되어 있으므로 사용하지 않아도 됨

로컬에서 로컬로 파일 복사하기

  • 모든 속성 유지, 전송 과정 로그 상세화, 복사 결과 출력
    • 파일 용량이 적은 파일일 경우 -z 옵션 생략
rsync -avh <file_path> <target_path>
  • 특정 파일 제외
rsync -avh --exclude <제외할_파일_path> <file_path> <target_path>

# txt 확장자 파일만 제외할 때
rsync -avh --exclude '*.txt' <file_path> <target_path>

# 복수개의 확장자에 대해 제외할 때
rsync -avh --exclude={'*.txt', '*.iso'} <file_path> <target_path>

서버에 파일 보내기

  • scp 이용
scp -rp <file_path> <server_user>@<server_host>:<target_directory>
  • rsync 이용
    • 전송하는 파일 크기가 너무 클 때 대신해서 사용
rsync --avz <file_path> <server_user>@<server_host>:<target_directory>
728x90
반응형

'데브옵스 devOps > Server' 카테고리의 다른 글

[배포전략] 무중단 배포란?  (1) 2024.10.05
728x90
반응형

OpenTelemetry(OTel)

OpenTelemetry란?

  • Traces, Metrics, Logs 와 같은 데이터 instrumenting, generating, collecting, exporting 할 수 있는 Observability Framework.
  • 데이터를 수집, 변환 및 벡엔드 전송을 위한 표준화된 SDK / API / OTel Collector 제공을 목표로 함.
  • OTLP: OpenTelemetry Protocol
  • Prometheus, OTLP, Jaeger, Zipkin 등 매우 다양하고 많이 있음
    • Loki: Log 데이터의 Receiver
    • Prometheus: Metrics 에 대한 Receiver
    • Grafana Tempo: Trace에 대한 Receiver

필요한 이유

  • 표준화 된 데이터 수집 / 내보내기 / 관리가 가능해짐
    • 확장 및 이전이 용이해짐
  • 시스템 운영에 필요한 정보들을 직접 수집 및 모니터링이 가능함
  • 데이터 관리자 중앙집중화 되어 관리가 용이함
    • 특히 MSA 와 같은 분산 시스템에서 효과적임

용어 정리

  • Traces
    • 어플리케이션 / 클러스터 등에서 수행된 동작들 간의 지연(Latency)와 관계에 대한 데이터
  • Metrics
    • 시계열 데이터. 즉 시간의 순서에 따라 기록되는 숫자 및 통계적 데이터
    • 일정 시간마다 수집됨
    • 수치 값을 통해 이상 징후 감지 가능
  • Logs
    • 요청이 수행되는 동안 시스템의 임의의 시점에서 발생한 이벤트에 대한 데이터
    • 일반적으로 timestamp와 context payload를 포함함
    • json, binary 등의 형태로 기록됨
  • Observability
    • 아웃풋을 설명함으로써 시스템 내부 상태를 이해할 수 있게 하는 것을 의미
      • Traces, Metrics, Logs와 같은 telemetry data를 통해 시스템 내부 상태를 이해하게 됨을 의미
    • 즉, 코드는 반드시 traces, metrics, logs 와 같은 데이터를 산출해야 하고 observability 백엔드로 전송해야만 함

아키텍처

  • 개별 언어별 SDK
  • 데이터 수집
  • 변환 및 데이터 내보내기

OpenTelemetry Collector

  • 원격 측정 데이터(Metrics / Traces / Logs) 수신 및 처리
  • 이후 OpenTelemetry 백엔드로 데이터 내보내기
  • 구성
    • Receivers
      • gRPC / HTTP 통해 데이터 수신
      • 하나 이상의 Receivers 구성 가능
    • Processors
      • 수신한 데이터를 OpenTelemetry 보내기 전 데이터 처리
    • Exporters
      • 데이터를 하나 이상의 OpenTelemetry 백엔드로 내보내기
      • 하나 이상의 Exporter 사용 가능

단점

  • 기능 및 옵션의 다양화로 인한 러닝 커브 존재
  • 직접 데이터 수집 및 관리하기 때문에 운영 및 관리에 대한 부담이 증가

OpenTelemetry Collector 데모

728x90
반응형

'데브옵스 devOps > Monitoring' 카테고리의 다른 글

[PROMETHEUS] 프로메테우스  (2) 2024.10.17
728x90
반응형

Deployment

  • 파드들을 관리함을 의미
  • rolling update, rollback, scaling 과 같은 기능을 제공
  • web server, APIs, microservices에 적합하게 만듬
apiVersion: apps/v1  
kind: Deployment                        // Deployment 정의 
metadata:  
    name: webapp-deployment  
spec:  
    replicas: 3                         // 3개의 레플리카(인스턴스) - 아래 파드들
    selector:  
        matchLabels:  
            app: my-webapp  
    template:  
        metadata:  
            labels:  
                app: my-webapp  
        spec:  
            containers:  
            - name: webapp  
              image: nginx:latest  
              ports:  
                - containerPort: 80  
              envFrom:  
                - configMapRef:  
                    name: webapp-config  
            - name: database  
              image: mongo:latest  
              env:  
                - name: MONGO_INITDB_ROOT_USERNAME  
                  valueFrom:   
                    secretKeyRef:  
                        name: db-credentials  
                        key: username  
                - name: MONGO_INITDB_ROOT_PASSWORD  
                  valueFrom:  
                    secretKeyRef:  
                        name: db-credentials  
                        key: password  
              volumeMounts:  
                - name: db-data  
                  mountPath: /data/db  
    volumes:  
        - name: db-data  
          persistentVolumeClaim:  
          claimName: database-pvc  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
        - protocol: TCP  
          port: 80  
          targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap  
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"  

---  

apiVersion: v1  
kind: Secret  
metadata:  
    name: db-credentials  
type: Opaque  
data:  
    username: <base64-encoded-username>  
    password: <base64-encoded-password>  

---  

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
    name: database-pvc  
spec:  
    accessModes:  
        - ReadWriteOnce  
    resources:  
        requests:  
            storage: 1Gi
728x90
반응형
728x90
반응형

VOLUME

  • 파드 내의 모든 컨테이너가 접근 가능한 디렉토리
  • 컨테이너에서 스토리지(storage)를 분리시켜 컨테이너 재시작/재스케쥴과 별개로 데이터를 영속 관리 가능하게 함
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
    app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest 
      ports:  
        - containerPort: 80  
      envFrom:  
        - configMapRef:  
            name: webapp-config  
    - name: database  
      image: mongo:latest  
      env:  
        - name: MONGO_INITDB_ROOT_USERNAME  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: username  
        - name: MONGO_INITDB_ROOT_PASSWORD  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: password  
          volumeMounts:  
            - name: db-data                  
              mountPath: /data/db              // 데이터 볼륨을 /data/db 마운트한다
    volumes:  
    - name: db-data                            // db-data 볼륨에 영구히 저장된다
      persistentVolumeClaim:  
      claimName: database-pvc                 

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
      - protocol: TCP  
        port: 80  
        targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap  
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"  

---  

apiVersion: v1  
kind: Secret  
metadata:  
    name: db-credentials                   
type: Opaque  
data:  
    username: <base64-encoded-username>    
    password: <base64-encoded-password>

---

apiVersion: v1  
kind: PersistentVolumeClaim                // PVC - 스토리지 요구사항 정의
metadata:  
    name: database-pvc  
spec:  
    accessModes:  
        - ReadWriteOnce  
resources:  
    requests:  
        storage: 1Gi                       // 스토리지 요구사항 상세. 1Gi 짜리 스토리지
728x90
반응형
728x90
반응형

Secrets

  • 민감 정보 저장에 사용
  • 기본 base64 인코딩이 default
  • 파드에서 파일로 마운팅되거나 환경 변수로 사용할 수 있음
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
    app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest 
      ports:  
        - containerPort: 80  
      envFrom:  
        - configMapRef:  
            name: webapp-config  
    - name: database  
      image: mongo:latest  
      env:  
        - name: MONGO_INITDB_ROOT_USERNAME  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: username  
        - name: MONGO_INITDB_ROOT_PASSWORD  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: password  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
      - protocol: TCP  
        port: 80  
        targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap  
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"  

---  

apiVersion: v1  
kind: Secret  
metadata:  
    name: db-credentials                   // Secret 명칭
type: Opaque  
data:  
    username: <base64-encoded-username>    // 실제 base64 로 인코딩 된 값
    password: <base64-encoded-password>
728x90
반응형
728x90
반응형

Config Map

  • 파드에 환경변수 / 설정 파일로 마운트 된 내용들을 저장하는 용도
  • 컨테이너 이미지로부터 설정을 분리할 수 있으며, 컨테이너를 재빌드 할 필요 없이 설정을 업데이트 하기 용이하다
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
        app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest  
      ports:  
        - containerPort: 80  
      envFrom:    
        - configMapRef:            // ConfigMap 참조
              name: webapp-config  
    - name: database  
      image: mongo:latest  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
    - protocol: TCP  
      port: 80  
      targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap                  // ConfigMap 설정
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"
728x90
반응형
728x90
반응형

Service

  • Service는 파드들의 그룹에 접근하기 위한 안정적인 엔드포인트를 정의한 것
  • 어플리케이션을 클러스터 내의 다른 파드들에 노출시거나 외부 클라이언트에 노출시킬 수 있다.
  • Load Balancing과 자동 스케일링 기능을 제공하여, 어플리케이션이 매우 사용 가능한 상태로 남게 해 준다
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
        app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest  
      ports:  
        - containerPort: 80  
    - name: database  
      image: mongo:latest  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:            // 서비스 내의 파드를 선택한다
        app: my-webapp  // 파드가 해당 label을 metadata로 가진 이상, service는 이 파드를 타겟한다.
    ports:  
    - protocol: TCP   
      port: 80  
      targetPort: 80.   // 파드의 포트. 

Ingress

  • 클러스터 내에서 파드끼리 내부 통신을 가능하게 함
  • 즉, 서비스를 클러스터 외부 클라이언트에 노출시킴
  • 어플리케이션의 외부 엔트리 포인로서 동작
  • 들어오는 트래픽에 대해 라우팅 규칙과 로드 밸런싱을 설정할 수 있게 함
  • Ingress 사용을 위해서는 클러스터 내에 Ingress Controller가 배포되어야 함
apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
    name: webapp-ingress  
spec:  
    rules:  
    - host: mywebapp.example.com       // 클러스터 외부에서 접근할 수 있는 도메인
      http:                            
        paths:                         // 라우팅 규칙을 정의하는 부분
        - path: /  
          pathType: Prefix  
          backend:                     // 트래픽이 포워딩 되어야 하는 타겟 서비스 정의
            service:  
                name: webapp-service  
                port:  
                    number: 80
728x90
반응형

+ Recent posts