[TCP] TCP의 Keepalive 기능 및 튜닝

이미지
# TCP의 KeepAlive란? -> HTTP의 KeepAlive보다 더 Raw한 개념 -> TCP Level에서의 KeepAlive (3Way-HandShake로 인한 손실 줄이기 위함 -> 허나 쌓일경우 좀비 커넥션 발생 가능하기에, 관리가능하게 튜닝 필요 # 사용방안? -> 연결간 어느 한쪽이 사용해도 Session 유지 가능 -> 기본적으로 setsockopt의 SO_KEEPALIVE관련 설정 필요 # 기본적으로 셋팅된 시간? -> 아래 명령어로 확인 필요 $ sudo /sbin/sysctl -a | grep -i keepalive [centos@ap-northeast-2.compute.internal external] (master) $ sudo /sbin/sysctl -a | grep -i keepalive net.ipv4.tcp_keepalive_intvl = 75 ( KeepAlive Idle 체크 주기) -> 연결이 끊겼는지 확인 하는 주기  net.ipv4.tcp_keepalive_probes = 9 ( KeepAlive Idle 발생 이후 Probe 갯수) -> 연결이 끊겼다면, Ping의 개념으로 보내는 패킷 횟수 net.ipv4.tcp_keepalive_time = 7200 ( KeepAlive Probe를 보내는 주기) -> 9개의 Ping을 보낼때, Ping과 Ping 사이 간격 # 테스트 $ netstat -napo로 주기적 체크 확인 1. Keepalive Mode로 서버 띄움 2. Client <-> Server간 통신 3. Client 강제 종료 시 동작 (IDLE 발생) 4. Server 측 Probe 보내서 체크 5. 설정된 Probe 다 보냈다면, 강제 종료 # TCP와 HTTP의 KeepAlive...

[주식] IMO2020과 정유업계의 연관성

정유업계와 - IMO 2020으로 인한 해운업계의 연관성 ​ # 대표적인 정유회사 S-OIL SK이노베이션  # IMO 2020 -> 전세계 선박 연료 황함량 기준 3.5% -> 0.5% 제한 목표 규제  ​ # IMO 2020 해결할려면? 1. 저유황유사용 (황함유량 적은 기름) = 고도화 설비 필요하며, (기존 유류)벙커 C유에 비해 비쌈  ​ 2. 스크러버(황산화물 저감 장치) 설치 = 기존 연료 사용가능하나 선박 1척당 40~60억 소요 = 배기가스를 씻은 해수를 배출하기에 유럽은 입항금지  ​ 3. 액체천연가스(LNG)를 연료로 하는 선박 = 인프라 구축이 되어있지 않아 현실적 어려움 ​ # 정유업계 기업 전망 SK이노베이션 -> 저유황유 생산 3월부터 가동(다만 코로나 때문에 빠르진 않을듯) -> 실적개선 기대 -> 중-장기로 봐야할듯 하다​ ​ S-OIL -> 마찬가지 2021년까지 하루 4만배럴로 생산가능 -> 실적개선 기대 -> 중-장기로 봐야할듯 하다 # 뇌피셜 결론 S-OIL & SK 이노베이션 모두 저유황유 생산을 하며, 해운업계의 규제와 더불어 수익 개선이 일어날 수 있음 결론적으로 21~22년 사이 상승 가능성이 높아보임 하지만 코로나라는 변수가 큼. 현재 들어가는 것보다 코로나가 잠잠해지고 투자한다면, 어느정도 수익을 낼수 있을거라 생각함 (21~22년까지 장기로 본다면 60~80% 수익 가능하지 않을까 생각중)

[Nginx-C++로 서버 구축을 해보자] Nginx-Module 연결 [3]

이미지
이전에는 설치를 진행하였고, (https://warguss.blogspot.com/2018/12/nginx-c-nginx-centos-2.html) 이번에는 따로 만들 모듈로 요청을 받는 것을 진행 해 보겠습니다. 우선 간단한 에코 서버를 준비합니다... (https://gist.github.com/suyash/2488ff6996c98a8ee3a84fe3198a6f85 이 사이트의 server.c를 그냥 사용했습니다) 빌드 후 다시 띄워주세요 (g++ -o server 파일) ./server 여기서 port만 우선 사용할 포트로 수정합니다.  (저는 10002 port를 사용하였습니다) nginx 설정을 수정합니다. 요런식으로 수정하고 nginx 다시 띄웁니다. 그리고 다시 웹으로 접속합니다. [root@localhost.localdomain back_module] $ ./server client connected with ip address: 0.0.0.0 received: 'GET / HTTP/1.0 Host: 127.0.0.1:10002 Connection: close Cache-Control: max-age=0 Upgrade-Insecure' 잘 찾아오네요.... 정리하자면  1. back module 개발 2. nginx 설정에서 특정 Command는 Back Module로 보내게끔 수정(port 일치 필요) 3. back module 띄움 4. nginx 재시작 5. 접속 테스트 이렇게 될거 같네요.  nginx가 요청 - Logic 모듈이 잘 분리되어 있는거 같습니다.  이를 토대로 Common한 Http Server를 개발해볼 예정입니다. 감사합니다~ 추가로 읽으면 좋을 것 ...

[Nginx-C++로 서버 구축을 해보자] Nginx-Centos 설치 [2]

이미지
Nginx 개념에 대해 확인 하였는데, 이번에는 Nginx 설치 및 기본 화면 띄우기 목적으로 진행 하였습니다. 저는 Centos환경에서 했기 때문에 차이가 있을 수 있습니다. 설치를 위해 수행해야할 루틴은 다음과 같습니다. wget  http://nginx.org/download/nginx-1.15.7.tar.gz yum install pcre-devel   yum install openssl-devel nginx 압축 해제 tar -xvf nginx-1.1.5.7.tar.gz 내부 ./configure --prefix=$원하는 경로 입력 make make install 순차적으로 하나씩 보자면 1.  wget  http://nginx.org/download/nginx-1.15.7.tar.gz = nginx library 다운로드(원하는 버전으로 골라서 하시면됩니다) 2. yum install pcre-devel (nginx 설치 시 필요한 라이브러리로 선 설치 합니다) 3. yum install openssl-devel (마찬가지입니다.) 4. 다운로드 받은 것 해제합니다. 5. 해제 되면 ./configure 를 실행합니다.  (prefix를 통해 원하는 경로로 설정가능합니다) 6. make로 빌드 7. make install로 빌드한것을 configure로 설정한 경로로 셋업 합니다. 그 이후에는 설정 한 경로의 conf/nginx.conf에서 port 확인합니다. (보통 80port로 설정 되있을 텐데, 해제가 필요합니다) 저는 아래와 같이 방화벽 해제 하였습니다. 1. vi /etc/sysconfig/iptables 2. -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 3. service iptables restart 로...

[Nginx-C++로 서버 구축을 해보자] Nginx 간단 원리 확인 [1]

이미지
간단한 프로젝트 진행 중.... (https://github.com/warguss/CommonServer) NginX란? (영어 참 지옥이네요...) 하나 하나 풀어서 확인해 보겠습니다. Controlling NGINX Processes at Runtime - Master and Worker Processes = 주인 그리고 하인 수행... [Master-Worker?] = Master 스레드가 요청을 받아서, Worker 스레드에 나눠주는 개념 (프로세스로도 가능) (Worker 스레드는 기본적으로 스레드 풀로 구성) = Master가 모든 것을 관장 하신다고 보면 될거 같습니다. - 상세 = 공식 문서입니다. 전 영어 잘몰라서 번역기로 해보겠습니다... [요약하자면...] 1. Master Process와 하나 이상의 Worker Process존재 (캐싱 설정이 되어 있다면 메모리 or H/W 캐싱으로 처리가능 [무엇을?]) 2. Master Process는 conf 파일을 읽고, 지속적으로 Worker Process를 관리 3. 실제 요청 처리는 Worker Process가 처리 4. 요청에 대한 분배 처리는 OS-dependent(뭐지이거) 메카니즘으로 처리 5. worker process에 대한 갯수 설정은 nging.conf에서 하세요 (코어 갯수에 따라 자동적으로 조정되긴한다[진짠지...]) Controlling Nginx = Master Process 사용법 정도라서 넘어가겠습니다... 위 공식 문서는(https://docs.nginx.com/nginx/admin-guide/basic-functionality/runtime-control/#master-and-worker-processes) 입니다. 설정 파일들에 대한 자세한 설명들이 있지만, 이건 사용 방법 이라 판단 되기에 바로 설치로 넘어가도록 하겠습니다. ...

[EffectiveC++ 요약] 1장. C++에 왔으면 C++의 법을 따릅시다.

항목1. C++은 여러 언어의 연합체 = C = 객체 지향 개념의 C++ = 템플릿 = STL = 위 4가지로 구성 항목2. #define을 쓰려거든 const, enum inline을 떠올리자 Ex] #define TEST_Ratio 1.653 사용 시, 기호 테이블에 들어가지 않음 (Symbol Table) = 소스 -> 전처리기 -> 컴파일러 순으로 진행 시, = TEST -> 1.653으로 바꿔버려 어디에 오류가 있는지 찾기 힘듬 (사족) 컴파일 에러를 말하는지, Logic 에러를 말하는지 모르겠네 = TEST_Ratio가 사용된 만큼 메모리가 사용 (TEST_Ratio -> 1.653으로 바꾸기에, TEST_Ratio 등장 횟수 만큼 리소스 사용 = 매크로 대신 상수를 쓰는 방법으로 대체 (const double TestRatio = 1.653) = 상수 포인터 정의하는 경우 주의 사항 = char* 형식 문자열 상수 정의시 , ptr과 value까지 const로 선언하는 것이 보통 Ex] const char* const AuthorName = "Test Author"; -> const char* (Ptr에 대한 Const) -> const AuthorName (Value에 대한 Const) char* 보단 std::string을 쓰는것이 좋다 const std::string AuthorName("Test Author"); 항목2-1. 클래스 상수 정의 Ex] class Player{ private:  static const int NumTurns = 5; //상수 선언  ... }; (사족) numTurns는 객체가 사용되기 이전에 PreProcess 단계에서 만들어지기에 static이 필요할것으로 보인다. (미리 메모리에 올라가 있어야하니...) = NumTurns는 선언 된 것, 정의가 아니다. (...

git clone SSL Connection Error

실제 게임서버를 운영해보고자 서버 설치 작업을 ncloud통해 만들고 git clone을 사용해서 올리려 하였는데 git clone 자체가 fail 나는 현상이 발견되었습니다. git version도 1.7 -> 1.8로 올려도보고 다른 방법을 사용해보았지만 먹통이었는데, 해당 command처리를 통해 해결되었습니다. OS : Centos 6.6 64bit $ yum update -y nss curl git이 git clone시 curl을 통해 받아온다고 하는데, 그 과정에서 문제가 있었던것 같습니다.

[프로젝트 RTS] 게임서버를 만들어보자 [1]

이미지
최근 회사 일만으로 개발 실력 향상에 부족한 거 같아 게임을 만들어보자라는 계획을 잡고 후배와 진행중입니다.. (유니티 Client Unix C++ 서버 ) 목표로는 웜즈와 비슷한 UI로 Real Time 대전 액션 게임...인데 현실은... ... 어쩃든! 현재는 로그인/로그아웃만 구현이 되어있습니다. 이제 이동 및 이벤트에 대해 처리해야하는데, 갈길이 머네요 ㅎㅎ... 게임 서버 아키텍쳐에 대해서도 고민이 되고 구현 방식에도 참 다른점을 많이 느꼈습니다. (특히 protobuf가 지옥이었습니다..) 또, real time 서버에서는 구역화를 나누는게 어렵더군요 (전체 유저에게 이벤트 정보를 주기보다 구역을 나눠 근처에 있는 유저에게만 주는?) 현재 위 이슈에서 막혀있습니다... 좀더 노력을 해봐야겠네요 로그인 까지의 코드는 해당 github에 있습니다. ( https://github.com/warguss/ProjectRTS ) 추가로 읽으면 좋을 것

[취업] Kakao 코딩 테스트 문제[3]

이미지
다음 문제는 캐시와 LRU와 관련된 문제입니다. [문제] 지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다. 이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다. 어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다. 어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오. 입력 형식 - 캐시 크기(cacheSize)와 도시이름 배열(cities)을 입력받는다. - cacheSize는 정수이며, 범위는 0 ≦ cacheSize ≦ 30 이다. - cities는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다. - 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다. 출력 형식 [풀이] 이 문제의 경우 LRU(Least Recently Used)알고리즘을 이해하고 있냐를 묻는 문제입니다. LRU는 큐 + cache hit(우선순위)를 섞으신거라 보면되는데, 캐쉬가 가득 찼을 경우, 1. cache hit가 가장 낮은 것 검사 2. 만약 동일 hit 갯수가 있다면, 먼저 들어온 놈이 나가게 되는 형식입니다. LRU에 대해 일단 위 예제로 수행을 한다면.. 밑 케이스 의 출력은 50이고, 캐쉬 크기는 3입니다. (“Jeju”, “Pangyo”, ...

[취업] Kakao 코딩 테스트 문제[2]

이미지
2번째 문제를 한번 풀어보았습니다...! 점수판 계산 문제이며, 대게 파싱에 대한 문제인것 같습니다. 다음은 문제입니다. 2. 다트 게임 (난이도: 하) 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다. 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다. 다트 게임은 총 3번의 기회로 구성된다. - 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다. - 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수^1 , 점수^2 , 점수^3 )으로 계산된다. - 옵션으로 스타상(*) , 아차상( # )이 존재하며 스타상( * ) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다. - 스타상( * )은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상( * )의 점수만 2배가 된다. (예제 4번 참고) - 스타상( * )의 효과는 다른 스타상( * )의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고) - 스타상( * )의 효과는 아차상( # )의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고) - Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다. - 스타상( * ), 아차상( # )은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다. - 0 ~ 10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라. 입력 형식 ...

[취업] Kakao 코딩 테스트 문제 [1]

이미지
카카오 코딩테스트를 풀어보자! 한번 풀어보는 것에 대해 많은 도움이 될 것 같아 포스팅 해보려합니다. 저는 단순 풀어보는데에 의의를 두고 있기에, 더 좋은 방법이 있다면 공유 부탁드려요 문제를 사이트에서 직접 풀어보지 않아. 처음부터 끝까지 구현하긴 했는데... Solution에 대한 함수만 짜면 된다는 얘기를 들은 거 같아, 혹시 아신다면 공유 부탁드릴게요 우선 문제에 대한 설명입니다. ( http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/ ) 문제 1에 대해서 풀어보겠습니다...! 문제를 푼 환경은 Linux(Centos) C++로 풀었습니다. 1. 비밀 지도(난이도: 하) 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다. 1. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 “공백”(“ “) 또는 “벽”(“#”) 두 종류로 이루어져 있다. 2. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 “지도 1”과 “지도 2”라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다. 3. “지도 1”과 “지도 2”는 각각 정수 배열로 암호화되어 있다. 4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다. 입력 형식 = 입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다. - 1 ≦ n ≦ 16 -...

[Linux/CentOS/ProtoBuf] Centos - Protobuf 연동[echo 서버][2]

이미지
아래 포스팅에서의 작업은 다음과 같습니다. 1. *.proto 생성방법 2. 간단한 Echo 서버 및 Makefile 작성 3. 통신 테스트 1. *.proto 생성방법 ProtoBuf 통신을 위해서는 *.proto , *.pb 관련 파일을 생성해야 합니다. 이게 무엇인가하면, ProtoBuffer는 객체를 byte화 시키고(Serialize) Client쪽에서도 byte를 객체로(DeSerialize) 변환을 진행합니다. (통신에는 byte stream으로만 통신하기 때문에) [Serialize] [DeSerialize] 즉, Protocol과 같은 역활을 진행하기 때문에, Client - Server간에 Protocol에 해당하는 명세서를 작성한다고 생각하시면 편할것 같습니다. 그럼 이거를 수동으로 만드냐? 그건 아닙니다. ProtoBuffer에 프로그램이 존재하는데, 만드는 방법은 다음과 같습니다. protoc 프로그램을 통해, 정의된 *.proto를 *.pb로 생성하는 역활을 진행합니다. protoc 실행방법은 아래와 같습니다. (경로 = protobuf 메인/src/protoc ) protoc -I=../../../ProjectRTS/ClientRoot/proto --csharp_out=../../../ProjectRTS/ClientRoot/proto ../../../ProjectRTS/ClientRoot/proto/addressbook.proto -I에는 *.proto가 있는 경로 output에는 *.pb로 생성 될 경로 그 뒤의 경로는 어느 *.proto를 바꿀지 정의합니다. 해당 명령어는 C#에 해당하는 건데, c++의 경우는 --csharp_out을 단순 --cpp_out으로 변환하면 됩니다. 해당 명령을 진행하면 어떻게 되느냐? /* 해당 정의된 Package들이 ...

이 블로그의 인기 게시물

윤석열 계엄령 선포! 방산주 대폭발? 관련주 투자 전략 완벽 분석

대통령 퇴진운동 관련주: 방송·통신·촛불수혜주 완벽 분석

키움 OPEN API MFC 개발 (1)