From 4b44be6a296fd6bc5cc3d7df246e7e57301aed1d Mon Sep 17 00:00:00 2001 From: teddy Date: Thu, 19 Mar 2026 15:25:11 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9C=A8=20=EB=AA=A8=EB=8B=88=ED=84=B0=EB=A7=81=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/training/common/dto/MonitorDto.java | 4 ++-- .../common/service/GpuDmonReader.java | 14 +++++------- .../common/service/SystemMonitorService.java | 13 +++-------- .../model/ModelTrainMngApiController.java | 22 +++++++++---------- 4 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/kamco/cd/training/common/dto/MonitorDto.java b/src/main/java/com/kamco/cd/training/common/dto/MonitorDto.java index ccd49ae..8b82bef 100644 --- a/src/main/java/com/kamco/cd/training/common/dto/MonitorDto.java +++ b/src/main/java/com/kamco/cd/training/common/dto/MonitorDto.java @@ -5,8 +5,8 @@ import java.util.List; public class MonitorDto { - public int cpu; // 30초 평균 (%) - public String memory; // "3.2/16GB" + public int cpu; // 30초 평균 (%) + public String memory; // "3.2/16GB" public List gpus = new ArrayList<>(); public static class Gpu { diff --git a/src/main/java/com/kamco/cd/training/common/service/GpuDmonReader.java b/src/main/java/com/kamco/cd/training/common/service/GpuDmonReader.java index c16f837..0d41d33 100644 --- a/src/main/java/com/kamco/cd/training/common/service/GpuDmonReader.java +++ b/src/main/java/com/kamco/cd/training/common/service/GpuDmonReader.java @@ -76,7 +76,8 @@ public class GpuDmonReader { try { Thread.sleep(5000); // 5초 후에 시작 - } catch (InterruptedException ignored) {} + } catch (InterruptedException ignored) { + } } } @@ -86,16 +87,12 @@ public class GpuDmonReader { private void runDmon() throws Exception { // GPU utilization만 출력 (-s u) - ProcessBuilder pb = new ProcessBuilder( - "nvidia-smi", "dmon", "-s", "u" - ); + ProcessBuilder pb = new ProcessBuilder("nvidia-smi", "dmon", "-s", "u"); process = pb.start(); // dmon은 stdout으로 계속 데이터를 뿌림 (스트리밍) - try (BufferedReader br = new BufferedReader( - new InputStreamReader(process.getInputStream())) - ) { + try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) { String line; while ((line = br.readLine()) != null) { @@ -144,7 +141,8 @@ public class GpuDmonReader { if (process != null && process.isAlive()) { process.destroy(); } - } catch (Exception ignored) {} + } catch (Exception ignored) { + } } private boolean isNvidiaAvailable() { diff --git a/src/main/java/com/kamco/cd/training/common/service/SystemMonitorService.java b/src/main/java/com/kamco/cd/training/common/service/SystemMonitorService.java index a114eb5..e3c7517 100644 --- a/src/main/java/com/kamco/cd/training/common/service/SystemMonitorService.java +++ b/src/main/java/com/kamco/cd/training/common/service/SystemMonitorService.java @@ -68,9 +68,7 @@ public class SystemMonitorService { int index = entry.getKey(); int util = entry.getValue(); - gpuHistory - .computeIfAbsent(index, k -> new ArrayDeque<>()) - .add(util); + gpuHistory.computeIfAbsent(index, k -> new ArrayDeque<>()).add(util); Deque q = gpuHistory.get(index); if (q.size() > 30) q.poll(); @@ -185,10 +183,7 @@ public class SystemMonitorService { // ===================== // CPU 평균 (30초) // ===================== - dto.cpu = (int) cpuHistory.stream() - .mapToDouble(Double::doubleValue) - .average() - .orElse(0); + dto.cpu = (int) cpuHistory.stream().mapToDouble(Double::doubleValue).average().orElse(0); // ===================== // Memory (현재값) @@ -204,9 +199,7 @@ public class SystemMonitorService { Deque q = gpuHistory.get(index); - int avg = (int) (q == null ? 0 : - q.stream().mapToInt(i -> i).average().orElse(0) - ); + int avg = (int) (q == null ? 0 : q.stream().mapToInt(i -> i).average().orElse(0)); dto.gpus.add(new MonitorDto.Gpu(index, avg)); } diff --git a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java index c3b8133..07a0bdb 100644 --- a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java +++ b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java @@ -220,17 +220,17 @@ public class ModelTrainMngApiController { @Operation(summary = "학습서버 시스템 사용율 조회", description = "cpu, gpu, memory 사용율 조회") @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "검색 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Long.class))), - @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "200", + description = "검색 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @GetMapping("/monitor") public ApiResponseDto getSystem() throws IOException { return ApiResponseDto.ok(systemMonitorService.get()); -- 2.49.1 From 904968a1be48359ed0418ab1d59f8bc377a1eecb Mon Sep 17 00:00:00 2001 From: teddy Date: Thu, 19 Mar 2026 15:25:20 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9C=A8=20=EB=AA=A8=EB=8B=88=ED=84=B0=EB=A7=81=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1d907d0..0f0bb54 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -47,7 +47,7 @@ member: init_password: kamco1234! swagger: - local-port: 9080 + local-port: 8080 file: sync-root-dir: /app/original-images/ -- 2.49.1