목록BACKEND.*/Server (23)
dev.Log
SonarQube를 Docker로 띄웠는데 다음과 같은 증상을 겪은 적이 있을 것이다.컨테이너는 Up 상태포트(9000)도 열려 있음그런데 curl http://localhost:9000 하면 Connection refused로그를 보면 Elasticsearch가 계속 죽었다 살아남로그에는 보통 아래와 같은 메시지가 반복된다. bootstrap check failure: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 이 글에서는 이 오류의 정확한 원인과vm.max_map_count가 도대체 무엇인지,왜 SonarQube에서 필수인지 정리한다.vm.max_map_count란 무엇인가?vm...
리눅스를 쓰다 보면“이 프로그램은 왜 부팅할 때 자동으로 실행될까?”라는 생각을 한 번쯤 하게 된다.이때 등장하는 개념이 바로 시작 서비스다.시작 서비스란 간단히 말해시스템이 부팅되는 과정에서 자동으로 실행되는 프로그램이나 스크립트를 의미한다.SSH, 네트워크, 웹 서버, GUI 로그인 화면 같은 것들은모두 시작 서비스의 한 종류다.1. init이란 무엇인가리눅스에서 커널 부팅이 끝나면가장 먼저 실행되는 사용자 공간 프로세스가 있다. PID 1 = init 이 init 프로세스는 시스템 전체의 시작을 관리한다.어떤 서비스들을 실행할지어떤 순서로 실행할지어떤 상태에서 실행할지이 모든 것을 init 시스템이 책임진다.2. 옛날 방식: SysVinit과거 리눅스 배포판들은 SysVinit 방식을 사용했다.2-..
소켓통신 서버에서 커널파라미터를 튜닝할 일이 있었다. net.core.rmem_default: 소켓 생성 시 자동 할당되는 기본 receive buffer 크기.rmem_max: 어플리케이션에서 setsockopt(..., SO_RCVBUF, ...) 호출 시 최대 설정 가능한 값.net.ipv4.tcp_rmem : TCP 수신 버퍼의 자동 조정 범위를 지정. 커널은 네트워크 상태에 따라 이 범위 안에서 TCP 수신 버퍼 크기를 동적으로 조정 1. net.core.rmem_default 설명: 모든 소켓에 기본적으로 적용되는 수신 버퍼(default receive buffer) 크기.단위: 바이트(Byte)기본값 : 219024 (126KB)262144 (256KB) 2. net.core.rmem_m..
"신뢰할 수 있는 메모리 상태와 리소스 스케줄링"을 보장하기 위해서 🔧 1. 리소스 스케줄링 정확도 보장Kubernetes는 Pod 스케줄링 시 각 노드의 CPU/메모리 사용량을 기준으로 파드를 배치해.그런데 swap이 켜져 있으면 실제 메모리 부족인데도 스왑으로 인해 문제 없이 돌아가는 것처럼 보여.→ 결국 노드의 메모리 여유량을 과대평가해서 너무 많은 파드를 집어넣게 될 수 있어.→ 나중에 OOM(Out of Memory)으로 Pod가 죽거나, 전체 노드가 불안정해질 수 있음.⚡ 2. 성능 예측이 어려워짐스왑은 디스크 기반이라 매우 느려.어떤 Pod가 swap 영역을 과도하게 쓰기 시작하면, → I/O 병목 + 전체 노드 성능 저하 발생 가능.Kubernetes는 이런 예측 불가능한 성능 저하를 ..
이번주에는 서버실 두번이나 왔다갔다했다. 랩별로 자산이 있어서 알아서 관리해야하는 방식인것 같은데 오히려 좋다.서버 재시작 되면 자동으로 프로세스 뜨는지 테스트 해보고싶어서 재시작했는데 SSH가 안붙어서 터미널이 안켜졌다.뭔가 네트워크 매니저 문제일거같아서 가자마자 systemctl status NetworkManager했는데 비정상이다. 이런 경우인데 yum도 고장이 났었다. 아무튼 시스템로그 확인하고 네트워크 매니저 바이너리 ldd 해서 보니까 libssl2.so가 not found로 뜨더라... 누가 지웠을까... 넣어주니 yum도 돌아왔다! 아래 도커파일이랑 명령어 실행하면 rpm파일 USB 담을 때 빨리할 수 있어서 좋았다!# 1단계: 빌드 컨테이너FROM rockylinux:8 AS bu..
이번 주에는 두 개의 솔루션을 하나의 도커 환경에서 패키징하여 제공하는 업무를 진행했다.요구사항서버 재시작 시 자동으로 복구되어야 한다.도커 내부에서 실행되도록 구성해야 한다.고객사의 형상관리툴에서 제한하는 크기를 초과하지 않아야 한다.고객사의 형상관리툴을 통해 직접 설치 및 운영하는 방식이기 때문에 네트워크 구성, 솔루션별 프로세스 분리 여부, 재시작 정책, 로그 관리 방식 등이 사전에 명확히 정해지지 않은 상태였다.특히, 두 개의 솔루션을 각각 별도의 도커 컨테이너로 실행할지, 하나의 컨테이너에서 통합 관리할지에 대한 논의가 필요했다. 또한, 빠른 검증이 필요했기 때문에 일주일 내에 도커 구성을 완료하고 성능 테스트까지 진행해야 했다. (물론, 다른 업무도 병행하면서...)네트워크 방식 테스트도커 환..
아직은 Rocky Linux 8.X버전으로 나가는게 많아서 바꾸긴 좀 그렇지만8 완전 지원 종료(2029.05.31) 이후엔 io_uring으로 변경하면 좋지 않을까.... 📌 1. epoll과 io_uring의 핵심 차이 epollio_uring지원 I/O 타입주로 네트워크 I/O (소켓, TCP/IP 등)파일 I/O + 네트워크 I/O 모두 지원비동기 지원 방식이벤트 기반 감시 (poll()보다 개선)완전한 비동기 (Zero-copy, syscalls 최소화)시스템 콜 호출 수이벤트 감시용 epoll_wait() 필요SQE 큐를 통해 syscall 호출 최소화성능 (I/O 요청 수 많을 때)높은 부하에서 성능 저하 발생대량 I/O 처리 시 epoll보다 빠름멀티스레드 최적화일부 한계 있음완전한 멀티..
미리 알았더라면 좋았을 것 같은.... 1. 아이디는 유일해야 한다2. 아이디는 숫자로만 구성되어야 한다3. 아이디는 발급 날짜에 따라 정렬가능해야한다. multi-master 구성 시 이런 조건을 만족하는 ID 생성기를 구현하고자 할 때 트위터 스노플레이크 접근법이 있다. 1비트 - 41비트 - 5비트 - 5비트 - 12비트사인비트 - 타임스탬프 - 데이터센터ID - 서버ID - 일련번호1. 사인(sign)비트 : 1비트를 할당. 지금으로서는 쓰임새가 없지만 나중을 위해 유보. 음수와 양수를 구별하는데 사용2. 타임스탬프 : 기원시각 (epoch)이후로 몇 밀리초가 경과했는지를 나타내는 값3. 데이터센터ID : 2의5승 = 32개 데이터 센터 지원 가능 4. 서버ID : 데이터 센터당 32개 서버 사..