분류 전체보기
서버 스트레스테스트 시 일정 주기로 멈춰요!
RUST만든 웹서버를, jmeter를 통해 stress test를 진행하였다. 만든 서버는 config 파일을 watch 하고 읽어서, 웹으로 들어온 요청에 json으로 적절히 응답해주는 간단한 서버이다. 그런데..! 스트레스 테스트 시 몇십 초 이후, (약 7000+개의 connection이 이뤄진 다음), connection 이 아무리 시간이 지나도 이루어지지 않는다. 그런데, 또 몇십 초 지나면, 일부 connection은 수립되기는 한다. 이 현상이 반복되고 있었다... 여러 문제를 체크해 보았다. 로컬에서 테스트도 해보고, cpu부하나 대역폭도 체크해 보았다. 처음에는 무지하게도 `TIME_WAIT` 을 의심했는데, TIME_WAIT을 없애기 위해 연결 종료시에 linger를 이용해 RST를 보..
docker exec format error
RUST로 (잘 만든) 서버를 도커로 패키징하여 aws ec2 t4g nano 인스턴스에 올렸다! exec format error exec failed, exec format error 라는 명령어와 함께 실행이 안된다. 해결 X86_64 환경에서 개발한 이미지는, 기본적으로 AMD 아키텍처에서 동작한다. ARM CPU 환경을 지원하기 위해서는 해당 아키텍처에서 개발해야 한다. 혹은, docker buildx 등을 사용해서 멀티아키텍처 개발을 한다. 클라우드 빌드를 통해 각 아키텍처마다 build를 할 수도 있겠다.
전직 이야기의 끝
전직 이야기가 이 글로서 끝이 난다. 이는 곧, 게임 업계로 취업하게 되었다는 것을 의미한다. 22년 8월부터 게임업계로 이직하기 위해 3년 6개월의 안드로이드 개발자 경력을 뒤로 하고 프로카데미와 함께 게임 서버 개발자를 향해 달려온 1년. 6월 한달간은 지원한 다양한 회사의 면접을 진행하느라 엄청 바빴다. 심지어 일주일에 면접이 6개인 주도 있었다. 게임잡에 포트폴리오를 정리해서 올려놓자마자, 몇몇 게임회사에서 먼저 연락이 왔다. 100명+인 기업들이었고, 평소에 알고있던 회사도 있었다. 게임잡을 통해 서버 개발자를 구하는 모든 공고를 스크랩한 뒤, 몇몇 공고에는 실제로 지원을 했다. 물론 모두 공채가 아닌 상시(수시)채용이었기에, 연락이 올지 안올지도 미지수였다. 그래도 지원한 대부분의 회사에서 면..
![동기화객체 성능테스트](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR7NgF%2FbtskgvHxgBL%2FS1ackKAotflIYCCWn9uVKk%2Fimg.png)
동기화객체 성능테스트
동기화객체 성능테스트 멀티스레드와 동기화 객체 멀티스레드 프로그래밍은 하나의 기능을 여러 스레드가 동일하게 실행하는 호모지니어스 방식과, 업무를 다르게 각자의 스레드로 분배하는 헤테로지니어스 방식으로 구분됩니다. 예를 들어, 게임 서버에서 길찾기 기능을 하나의 스레드로 분리하고, 네트워크 IO를 하나의 스레드로 분리한다면, 이는 헤테로지니어스 방식의 멀티스레드 설계입니다. 하지만, IOCP의 워커 스레드와 마찬가지로 하나의 동일한 로직을 수행하는 스레드가 여럿 있다면, 이는 호모지니어스 방식의 멀티스레드입니다. 이러한 멀티스레드 프로그래밍에서는 주의해야 할 점들이 생깁니다. 동기화 문제입니다. 가장 단순한 연산인 증감 연산마저도 CPU atomic하지 않기에, 수행 도중 context switching이..
![네트워크관리사 1급 이야기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3NkHt%2Fbtsji6Io7er%2FiDg6DvLnAOkwGaDu2h4WiK%2Fimg.png)
네트워크관리사 1급 이야기
네트워크관리사 1급 이야기 작년 하반기에 네트워크관리사 2급 자격증을 취득한 이후로, (https://hotfoxy.tistory.com/55) 네트워크관리사만큼은 1급을 따보고 싶었다. 물론 네트워크관리사는 1급 응시자가 매우매우 적다. 그렇기 때문에 국가공인으로 인정이 되지 않는 자격증이라고 한다. 아쉽긴 하지만, 그렇기 때문에 유효기간이 없는 자격증이라는 장점 또한 분명하다. 2급을 따고 나서 1급 신청할 때에도 적지 않은 비용때문에 이게 맞나, 결제 창에서 잠시 고민했지만.. 2급을 워낙 수월하게 땄던 탓에, 2급으로 내 실력을 표현하기에는 너무나도 아쉬웠다. HOW 사실 공부는, 60점 합격만을 위한다면 2급 교재나 2급 내용만 봐서도 나름 충분하다. 조금 더 자세히, 조금 더 깊은 문제가 나올..
![IOCP 서버 코어 개발하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVNqUa%2FbtsiOgELbD6%2FLDdDyrjVIFUraQ2dRdKkc0%2Fimg.png)
IOCP 서버 코어 개발하기
IOCP 서버 코어 개발 IOCP 기반 서버 코어 개발하기 이 문서는 IOCP를 기반으로 한 서버 라이브러리 개발 과정을 담았습니다. IO Completion Port IO Completion Port란, Windows OS에서 입출력 완료 통지를 알려주는 방식을 의미합니다. 흔히 소켓 모델의 하나로서 이야기되고는 하지만, 엄밀히 말하면 이는 그저 Overlapped IO에서 입출력 결과를 통지하는 하나의 방법론일 뿐입니다. 소켓 통신 또한 네트워크를 통한 IO이기에, 이에 대한 입출력 완료 통지를 IOCP를 통해 받도록 할 수 있습니다. Overlapped IO와 비동기 Overlapped IO란, IO가 Overlapped (중첩) 된다는 뜻으로서, 하나의 스레드가 한번에 하나의 IO만을 처리하는 것..
![패킷 직렬화버퍼](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7etbN%2FbtsdG4PBJjN%2FtqKdABBEAXELNXbivkJQW0%2Fimg.png)
패킷 직렬화버퍼
패킷 직렬화와 마샬링 네트워크간 통신이 이루어지기 위해서는, 레이어 7계층에서부터 보낼 데이터를 아래 층으로 요청하여 결국 1계층의 비트 스트림으로 변환되고, 이후 수신 때에도 비트 스트림으로부터 레이어 7계층의 의미있는 데이터로 해석해내는 과정이 필요합니다. 이러한 일련의 과정에서 ‘데이터를 바이트 스트림으로 변환하는 과정’을 ‘직렬화’라고 하며, 이를 포함하여 데이터의 메모리 구조를 저장이나 전송을 위해 적당한 자료형태로 변형하는 과정을 ‘마샬링’이라고 부르고 있습니다. 바이트 오더 바이트 오더, 바이트 순서는 OS가 내부적으로 데이터를 표현하는 방식을 의미하기에, 현재는 CPU 아키텍처에 따라 두 종류의 바이트 오더가 존재합니다. Little Endian이라고 불리는 방식은 데이터가 바이트 단위로 ..
![메모리풀과 프리리스트](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDJegb%2FbtsdHavwZr3%2Fg3jIYsssqjZQ8piCC52KT1%2Fimg.png)
메모리풀과 프리리스트
개요 메모리풀은 미리 메모리를 준비시키고 이를 재사용하게 함으로서 생성과 반환에 소모되는 시간을 없애는 기술입니다. 가상메모리 시스템에서도 4KB단위로 페이징하는 것이 메모리풀의 성격을 가지고 있다고 볼 수도 있겠습니다. 다양한 버킷 크기를 지원하는 메모리풀의 구현은 안전 장치가 더해질수록 기본 힙 관리자와 성능차이가 줄어들 것이므로, 이 프로젝트에서는 고정 크기의 객체 (오브젝트)에 대한 메모리풀을 도입하는 것으로 하겠습니다. 메모리풀과 프리리스트 메모리풀 메모리풀은 처음 초기화 시 지정된만큼 충분한 메모리 공간을 할당받아 관리를 시작합니다. 이 경우, 준비된 메모리를 할당받아 사용하고 반환하는 것은 성능 향상이 되지만, 만일 메모리풀이 부족할 경우 resize를 할 지, 이 오버헤드가 감당 가능한지 ..