Study/Linux 10

[Linux]TCP 재전송

TCP 재전송이 일어나는 과정, 이로 인해 발생할 수 있는 애플리케이션 타임아웃TCP 재전송과 RTOTCP는 신뢰성 있는 연결이다. 데이터를 주고 받는 두 종단 간에 데이터를 주고 받음이 확실해야 한다.패킷을 보낸 후 ACK를 받지 못하면 패킷이 손실되었다고 판단하고 재전송한다. 이는 애플리케이션 입장에서 요청에 대한 응답을 받는 시간이 늘어난다. RTO(Retransmission Timeout)는 얼마나 기다려야 하는지에 대한 값으로, RTO 안에 ACK를 받지 못하면 보내는 쪽에서 재전송을 진행한다.일반적인 RTO는 RTT(Round Trip Time, 두 종단 간 패킷 전송에 필요한 시간)를 기준으로 설정된다.InitRTO는 TCP Handshake가 일어나는 첫 번째 SYN 패킷에 대한 RTO를 ..

Study/Linux 2024.04.25

[Linux]TCP Keepalive

TCP Keepalive 옵션을 이용해서 TCP 기반의 통신에서 세션을 유지하는 방법 이를 통해서 시스템이 얻는 것은 무엇인지, 그리고 주의해야 할 부분들은 어떤 것이 있는지 TCP Keepalive TCP Keepalive는 일정 시간이 지나면 연결된 세션의 두 종단이 서로 살아있는지를 확인하는 아주 작은 양의 패킷을 하나 보낸다. 연결을 유지하는 게 유리한 쪽에서만 진행해도 된다. 클라이언트 혹은 서버 둘 중에 하나라도 이 기능을 사용한다면 세션은 유지된다. Keepalive 패킷을 주고 받은 후 타이머는 다시 원래 값으로 돌아가 카운트를 진행한다. 이와 같은 방식으로 두 종단 간에 Keepalive를 확인하면서 양쪽의 세션이 끊기지 않고 유지된다. netstat을 사용해서 타이머를 확인해보자. ro..

Study/Linux 2024.04.24

[Linux]TIME_WAIT 소켓

TIME_WAIT 상태가 무엇을 의미하고 왜 발생하는지, 그리고 서비스에는 어떤 영향을 끼칠 수 있는지 TCP 통신 과정 3-way handshake SYN: 클라이언트가 서버로 통신을 시작하겠다 SYN+ACK: 서버는 그에 대한 응답 ACK: 클라이언트는 서버로부터 받은 패킷에 대한 응답 3-way handshake를 정상적으로 마친 다음 클라이언트는 서버에 데이터를 요청한다. 통신을 모두 마친 후 연결을 종료한다 → 4-way handshake TIME_WAIT 소켓의 문제점 먼저 연결을 끊는 쪽을 active closer, 반대를 passive closer라고 한다. active closer에 TIME_WAIT 소켓이 생성된다. server에 무조건 TIME_WAIT 소켓이 생성되는 것이 아니고 먼..

Study/Linux 2024.04.22

[Linux]NUMA

NUMA 아키텍처가 무엇인지, 메모리 할당에 어떤 영향을 미치는지 NUMA 아키텍처 Non-Uniform Memory Access (불균형 메모리 접근) 멀티 프로세서 환경에서 적용되는 메모리 접근 방식 UMA(Uniform Memory Access): 초창기 아키텍처 NUMA와 반대되는 개념 모든 프로세서가 공용 BUS를 이용해서 메모리에 접근하기 때문에, 동시에 접근이 불가능하다. NUMA는 로컬 메모리로의 접근이 동시에 이뤄질 수 있다. 하지만 로컬 메모리의 양이 모자라면 다른 CPU에 붙어있는 메모리에 접근이 필요하게 되고, 이때 메모리 접근에 시간이 소요되어 예상치 못한 성능 저하를 경험하게 된다. 그래서 로컬 메모리에서 얼마나 많이 메모리 접근이 일어나느냐가 성능 향상의 가장 중요한 포인트이다..

Study/Linux 2024.04.18

[Linux]swap

메모리가 부족한 것을 어떻게 확인할 수 있는지 부족할 경우에 커널은 어떻게 대처하는지 swap 영역 물리 메모리가 부족할 경우를 대비해서 만들어 놓은 영역 비상용으로 확보해 놓은 메모리 공간 하지만 디스크의 일부분을 메모리처럼 사용하기 위해 만들어 놓은 공간이기 때문에 이를 사용하면 시스템 성능 저하가 일어난다. root@worker1:~# free -k total used free shared buff/cache available Mem: 1974564 1117108 302996 2448 554460 679308 Swap: 0 0 0 아주 적은 양이더라도 swap 영역을 사용하고 있다면 메모리가 부족할 수 있다는 의미이기 때문에 어떤 프로세스가 사용하고 있는지 확인이 필요하다. /proc//smaps ..

Study/Linux 2024.04.14

[Linux]free 명령과 메모리

CPU가 프로세스의 연산 과정에 필요한 리소스라고 한다면, 메모리는 프로세스가 연산할 수 있는 공간을 제공해 주는 리소스라고 할 수 있다. 프로세스는 메모리라는 공간에 자신이 필요한 함수를 넣어 두거나 변수에 값을 저장하거나 하는 방식으로 연산을 위한 공간을 확보하고 작업을 진행한다. 메모리 사용량 확인하기 free 전체 메모리 용량, 사용 중인 용량, buffers와 cached로 명명되는 캐싱 영역의 용량 root@worker1:~# free -m total used free shared buff/cache available Mem: 1928 1047 95 2 784 706 Swap: 0 0 0 *-m은 메비바이트(MB) 단위로 출력 total: 전체 메모리의 양 used: 사용 중인 메모리의 양 f..

Study/Linux 2024.04.10

[Linux]Load Average와 시스템 부하

Load가 높다/낮다고 표현하는 이 값의 의미는 무엇이고 시스템에 어떤 영향을 미치는지, 그리고 이 값을 바탕으로 시스템의 부하를 어떻게 결정하면 좋을지를 살펴보자. Load Average 프로세스의 상태 중 R과 D 상태에 있는 프로세스 개수의 1분, 5분, 15분마다의 평균 값 얼마나 많은 프로세스가 실행 혹은 실행 대기 중이냐를 의미하는 수치이다. 프로세스의 수를 세는 것이기 때문에 시스템에 있는 CPU Core 수가 몇 개냐에 따라 각각의 값은 의미가 상대적이다. ex. 하나의 Run Queue에 두 개의 프로세스가 있는 경우(CPU Core가 1개)와 서로 다른 CPU의 Run Queue에 두 개의 프로세스가 있는 경우(CPU Core가 2개) 모두 Load Average 값은 2의 근사값이 나..

Study/Linux 2024.04.09

[Linux]top을 통해 살펴보는 프로세스 정보들

시스템 상태를 파악하기 위해 top 명령을 사용해보자. 전반적으로 파악하는 방법과 특히 프로세스와 관련된 값들이 어떤 의미가 있는지 보자. 시스템 상태 살피기 root@worker1:~# top top - 06:45:11 up 1:57, 1 user, load average: 1.46, 1.55, 1.16 Tasks: 300 total, 2 running, 298 sleeping, 0 stopped, 0 zombie %Cpu(s): 37.5 us, 14.2 sy, 9.2 ni, 38.2 id, 0.3 wa, 0.0 hi, 0.5 si, 0.0 st MiB Mem : 1928.3 total, 99.4 free, 1164.8 used, 664.0 buff/cache MiB Swap: 0.0 total, 0...

Study/Linux 2024.04.06

[Linux]시스템 구성 정보 확인

시스템 문제를 파악하기 위해서는 시스템 구성 정보 확인이 우선이다. 시스템의 정보를 알아야 시스템을 분석할 수 있다. 커널 정보 확인하기 uname -a user1@worker1:~/Desktop$ uname -a Linux worker1 5.15.0-88-generic #98~20.04.1-Ubuntu SMP Mon Oct 9 16:43:45 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 커널 버전: 5.15.0-88-generic dmesg : 커널 디버그 메시지를 출력한다. user1@worker1:~/Desktop$ dmesg | grep -i kernel | more [ 0.000000] KERNEL supported cpus: [ 0.020813] Booting par..

Study/Linux 2024.04.03

[Linux]gcc 컴파일

gcc 컴파일 gcc [파일명] : 기본값으로 out 파일이 생성 gcc 옵션 -o : 컴파일 과정에서 만들어지는 실행 파일의 이름 지정 -e : 전처리 과정의 결과를 화면에 출력 -c : 오브젝트 파일 생성 -S : 어셈블리 파일 생성 -v : 컴파일 과정을 화면에 출력 --save-temps : 컴파일시 생성되는 중간 파일 저장 gcc 예제 vi test.c #include int main(){ printf("Hello World!\n"); return 0; } test.c 파일을 생성 gcc test.c a.out 파일이 생성되었고 이를 실행하면 test.c의 코드를 실행 gcc 컴파일 과정 전처리기 : #include, #define으로 시작되는 전치리기 부분을 처리 컴파일러 : 하이 레벨의 언어..

Study/Linux 2020.12.16