RabbitMQ - Channel Basic Consume
📘 Backend/기능 개발2024. 2. 2. 05:08RabbitMQ - Channel Basic Consume

📘 RabbitMQ - Channel Basic Consume 이전에 RabbitMQ를 이용한 데이터 파이프라인을 개발 했었는데, 단일 서버의 RabbitMQ Connection을 연결할 때 RabbitConfig를 이용해 Quorum Queue의 데이터를 Subscribe 했었습니다. 이전 포스팅 글 RabbitMQ - Publish & Subscribe MQTT Data RabbitMQ - Publish & Subscribe on Linux 이번 요구사항은 여러 서버에 분산된 RabbitMQ들을 클러스터링 하지않고, Spring Boot 서버에서 멀티 스레딩과 Thread Safe한 방식으로, 각각의 RabbitMQ Connection Factory에 연결 후 각 스레드에서 Channel을 Basic..

🚩 Headless OpenGL Rendering Error (TigerVNC & X11)
💻 Server/Linux2024. 1. 24. 11:36🚩 Headless OpenGL Rendering Error (TigerVNC & X11)

📘 해결해야 할 문제 문제 1 - Remote SSH GUI Rendering 실패 회사 일을 하다가 영상 분석 서버(Ubuntu)를 Remote로 GUI를 연결하려고 했으나 CLI만 연결되는 현상이 있었습니다. 이 부분은 Ubuntu Desktop을 설치하고 원격을 연결하려고 할 때 발생하였는데, 여러 방법들을 시도해 보다가 Tiger VNC를 사용하기로 하였습니다. 문제 2 - OpenGL Rendering 실패 아래 Tiger VNC 세팅 과정을 통해서 NVIDIA, Cuda Toolkit, OpenGL이 전부 인식이 잘됨에도 불구하고, Remote로 GUI를 연결 후 Docker Container를 실행하였으나 컨테이너 내부의 OpenGL이 렌더링되지 않는 에러인 glfw Error: 65544 ..

Atomic Operation & volatile & Metrics
📘 Backend/Concurrency2024. 1. 6. 23:03Atomic Operation & volatile & Metrics

📘 Atomic Operation의 판단 기준 원자적인 연산(Atomic Operation)을 판단하는 기준이 뭘까요? 전 글에서 예시를 들며 학습 했었지만 아직 크게 와 닿지는 않습니다. 그래서 어떤 연산지 원자적인지 모르니까 모든 함수를 synchronized를 이용해 동기화 한다고 가정해봅니다. 즉, 공유 변수에 액세스할 수 있는 모든 함수를 동기화 시킵니다. 그럼 병렬로 실행되는 코드의 개수를 최소화 해주게 되는데요. 예를 들어 동시 실행 될 거라 짐작하는 스레드를 4개 만들어서 실행하면, 모든 함수가 동기화 된 상태라 한번에 1개의 스레드만 실행 되고 나머지 3개는 Suspend 상태로 있게 됩니다. 이러면 사실상 스레드 1개만 있는것과 다를게 없습니다. 더 안 좋은 점은 여러 스레드를 유지하기..

Critical Section & Synchronized with Lock
📘 Backend/Concurrency2024. 1. 6. 20:37Critical Section & Synchronized with Lock

📘 Critical Section & Synchronized with Lock Thread 간 Resource 공유 시 발생할 수 있는 문제 - 지난 포스팅 글 전에 포스팅한 글에서 다뤘던 코드의 문제점을 다시 한 번 살펴봅니다. 2개의 스레드가 1개의 Counter를 공유하는데, 둘 다 그 카운터를 read/write 할 수 있었습니다. 또, 해당 작업들은 비 원자적(Atomic Operation) 입니다. 위 문제는 흔히 발생하는 문제로 일반적으로는 여러 작업의 집합을 모두 1개의 원자적 작업으로 보이게 만들곤 합니다. 어떠한 경우에도 2개의 스레드가 작업을 동시에 수행할 순 없기 때문입니다. void aggregateFunction() { operation1(); operation1(); opera..

Thread 간 Resource 공유 시 발생할 수 있는 문제
📘 Backend/Concurrency2024. 1. 6. 19:25Thread 간 Resource 공유 시 발생할 수 있는 문제

📘 스레드 간 리소스 공유 이번에는 Heap에 있는 변수를 공유해 서로 다른 스레드로 비 원자적인 작업을 동시에 수행하는 작업을 구현해 보았습니다. 이런 작업을 수행할때 생길 수 있는 문제점을 아래 예시 코드와 같이 작성하였습니다. 🚩 프로세스 내에서 공유할 수 있는 리소스 힙에 할당된 모든 항목 객체, 클래스 멤버, static 변수 프로세스 외부에 있는 모든 항목 📘 Thread 실행 순서 제어를 통한 예시 Thread.join()을 이용해 바로 예시 코드를 보겠습니다. @Slf4j public class InventoryCounter { public static void main(String[] args) throws InterruptedException { Counter counter = new ..

🚩[GPU Driver 충돌] Nouveau Kernel Driver 제거
💻 Server/Linux2023. 12. 27. 18:04🚩[GPU Driver 충돌] Nouveau Kernel Driver 제거

🚩 Nouveau Kernel Driver 제거 Ubuntu 22.04 LTS 버전에서 Nvidia Graphic Driver & Cuda Toolkit & OpenGL 설치 중 에러를 만났습니다. 이미 존재하는 nouveau 커널 드라이버와 설치하려는 그래픽 드라이버와 충돌이 나서 Installation이 자꾸 실패합니다. 로그를 보면 Nouveau Kernel Driver가 현재 사용 중 이라고 뜨고 있습니다. $ cat /var/log/nvidia-installer.log nvidia-installer log file '/var/log/nvidia-installer.log' installer version: 535.75 PATH: /usr/local/sbin:/usr/local/bin..

ReentrantLock을 이용한 Thread 동기화
📘 Backend/Concurrency2023. 12. 26. 19:09ReentrantLock을 이용한 Thread 동기화

📘 ReentrantLock 이번에 일을 하던 중 ReentrantLock을 사용해 Concurrency한 환경에서 여러 Thread간 안전하게 Lock을 사용 & 제공하며, Interrupt 처리를 통해 Thread간 상호작용을 제어하고 Thread Safe한 기능의 개발을 위해 사용했었습니다. 완벽하게 숙지를 못한 상태에서 일단 사용한 것이므로 예시를 통해 ReentrantLock을 복습한 글입니다. 📕 Synchronization ReentrantLock의 lock() & unLock() & tryLock() 을 이용해 Thread간 Race Condition을 방지하고, lockInterruptibly() 를 사용해 Lock을 획득할 때 다른 Thread에 의해 해당 Thread가 Interrup..

image