목록Study/DevOps (11)
0x0102

I/O 스케줄러는 디스크 성능을 최대화하기 위해 구현된 커널의 일부이며, 모든 작업은 스케줄러를 통해 블록 디바이스에 전달된다. 이 때, 병합과 정렬이라는 두가지 방식을 사용하며 알고리즘에 따라 성능이 조절될 수도 있다. 이번에는 I/O 스케줄러의 역할과 알고리즘들, 워크로드를 확인해보자. 1. I/O 스케줄러의 필요성 디스크와 관련된 작업은 시간이 오래 소요되기 때문에 커널은 스케줄러를 통해 성능을 높이고자 한다. 이 때 병합과 정렬 두 가지 방법을 사용한다. 1) 병합 여러 개의 요청을 하나로 합치는 것 Request Queue에 여러 요청을 블록 디바이스의 Dispatch Queue에 그대로 넘겨주는 대신, 하나로 합쳐 넘겨줌으로써 디스크로의 명령 전달을 최소화하고 성능을 향상시킬 수 있다. 2) ..
1. dirty page dirty page: page cache에 있는 페이지 중 쓰기 작업이 이루어진 메모리 page writeback (or dirty page 동기화) : dirty page가 생성될 때마다 디스크에 쓰면 쓰기 I/O가 폭증하여 성능 저하가 발생할 수 있기에 몇가지 조건을 만족시켜야만 dirty page를 디스크로 동기화하는 과정 보통 pdflush,flush,bdflush 등 flush가 들어간 커널 스레드가 이 작업을 진행함 따라서 I/O가 많이 발생하는 서버에서는 dirty page를 언제 얼마나 동기화 시키느냐가 중요한 성능 튜닝 요소가 됨 2. dirty page 관련 커널 파라미터 1) vm_dirty_background_ratio dirty page 내용을 백그라운드로..

TCP는 자신이 보낸 데이터에 응답을 받지 못하면 패킷을 재전송하는데 이를 TCP 재전송이라고 한다. 성능 저하가 불가피하게 일어남에도 통신의 특성상 반드시 필요한 과정이다. 그 과정과 그로 인해 발생할 수 있는 타임아웃에 대해 알아보자. 1. TCP 재전송과 RTOTCP 과정에서 데이터를 보낸 쪽은 받는 쪽의 ACK를 기다리는데, 만약 받지 못한다면 패킷이 중간에 손실되었다고 판단하고 재전송한다. 여기서 ACK를 얼마나 기다려야하는지에 대한 값을 RTO (Retransmission Timeout)라 부른다. RTO 안에 ACK를 받지 못하면 TCP 재전송이 발생하는 것이다. RTO는 일반적인 RTO와 InitRTO 두 가지가 있다. 일반적인 RTO : RTT(RoundTripTime) 기준으로 설정 I..

1. TCP Keepalive란? TCP 통신을 위해서는 반드시 3way handshake가 필요하지만 통신량이 많고 지속적인 경우 불편함을 겪을 수 있다. 이 때 두 종단 간 맺은 세션을 유지해서 통신이 일어날 때마다 유지 중인 세션을 이용하는 방식인 TCP Keepalive를 생각할 수 있다. TCP Keepalive 환경에서의 패킷 흐름은 3 way handshake > 요청과 응답 > keepalive > ack > 요청 > 응답 순과 같다. TCP Keepalive는 연결된 두 세션이 살아있는지 확인하는 아주 작은 패킷을 하나 보내며 실행된다. 이 때 양쪽 모두 이 패킷을 보낼 필요는 없으며 둘 중 어느쪽이라도 이 기능을 사용하면 세션은 유지된다. 현재 사용하고 있는 네트워크 소켓이 Keepal..

1. TCP 통신 과정 3 way handshake : 통신을 시작하기 전 최초의 연결을 맺는 과정 클라이언트 --- SYN(통신 시작 신호) --> 서버 서버 --- SYN + ACK --> 클라이언트 클라이언트 --ACK--> 서버 이후 클라이언트는 서버에 데이터를 요청 4 way handshake 서버(연결을 끊으려고 하는 쪽) --FIN(종료 신호)--> 클라이언트 클라이언트 --- ACK --> 서버 // 클라이언트의 사용한 소켓 정리 클라이언트 --- FIN --> 서버 서버 --ACK--> 클라이언트 // 소켓 정리 + tcpdump로 위와 같은 과정을 실제로 확인해 볼 수 있다. 2. TIME_WAIT 소켓의 문제점 위에서 서버가 연결을 끊으려고 했다면 서버는 active closer, 끊..

1. NUMA 아키텍처 NUMA (Non-Uniform Memory Access) : 불균형 메모리 접근. 멀티 프로세서 환경에서 적용되는 메모리 접근 방식 0번 CPU가 자신의 로컬 메모리에 접근하는 동안 1번 CPU도 자신의 로컬 메모리에 접근할 수 있어 성능이 향상된다. 그러나 로컬 메모리의 양이 모자라면 다른 CPU 메모리에 접근이 필요하게 되고, 이때 메모리 접근에 시간이 소요되어 성능 저하가 발생할 수 있다. 따라서 로컬 메모리에서 메모리 접근이 얼마나 많이 일어나느냐가 성능 향상의 KEY-Point 이다. + Local Access : 각 CPU마다 별도의 메모리에 접근하는 방식 + node : CPU + 메모리 + Remote Access : NUMA에서 자신의 메모리가 아닌 다른 노드에 ..

메모리가 부족한 경우, 어떻게 확인하고 어떻게 대처할 수 있는가. 1. swap 영역- 물리 메모리가 부족할 경우를 대비해서 만들어 놓은 대비 공간. - 물리 메모리가 아니라 디스크의 일부를 메모리처럼 사용하기 위해 만든 공간이므로 메모리에 비해 접근과 처리속도는 현저히 떨어진다. -> 따라서 swap 영역 사용시 시스템의 성능 저하가 발생한다. swap 정보는 free 명령을 통해 알 수 있다.좌측 2097148 : 전체 swap 영역의 크기 (KB단위) 0 : 현재 사용 중인 swap 영역의 크기 우측 2097148 : 현재 남아있는 swap 영역의 크기 만약 swap 영역을 사용하고 있다면 시스템 메모리가 부족할 수 있다는 의미이므로 swap이 사용된다면 어떤 프로세스가 swap을 사용하는지 확인해..

CPU가 프로세스와 연산 과정에 필요한 리소스라면, 메모리는 프로세스가 연산을 할 수 있는 공간을 제공해주는 리소스로 커널이 제공하는 중요한 정보이다. free 명령어로 시스템 메모리의 사용량을 확인하고 의미하는 바를 확인해보자. 1. 메모리 사용량 확인free 명령어로는 전체 메모리 용량과 사용 중인 용량, buffers와 cahed로 명명되는 캐싱 영역의 용량을 확인하는데 사용된다. +) -m 옵션은 숫자들을 MB단위로 보기 위함이다. 윗줄 7962 : 시스템에 설치되어 있는 전체 메모리의 양 719 : 시스템에서 사용하고 있는 메모리의 양 6399: 시스템에서 아직 사용하고 있지 않는 메모리의 양 8 : 프로세스 사이에 공유하고 있는 메모리의 양 843 : buffers와 cache 영역을 제외하고..

3-1 Load Average 정의 얼마나 많은 프로세스가 실행 중 혹은 실행 대기 중인지를 의미하는 수치 높다면 -> 많은 수의 프로세스가 실행 중이거나 대기 중 낮다면 -> 적은 수의 프로세스가 실행 중이거나 대기 중 그러나 이는 프로세스의 수를 세는 것이므로 CPU Core의 개수에 따라 의미가 상대적이다. ex) Run Queue에 두 개의 프로세스가 동일하게 있어도(같은 Load Average라고 해도) CPU Core 개수에 따라 다른 의미를 갖는다. 3-2 Load Average 계산 uptime 명령은 /proc/loadavg 파일을 열어 내용을 읽고 출력해주는 명령어이다. 즉, Load Average 값을 직접 계산하는 것이 아닌 커널의 파일을 단순히 출력하는 것이다. 값을 계산하는 과정..

2장 top을 통해 살펴보는 프로세스 정보들 # top : 시스템 상태를 빠르게 파악할 수 있는 명령어 2-1 시스템의 상태 살피기 # top 를 옵션 없이 입력하면 인터벌 간격으로 화면이 갱신되며 정보가 확인된다. -b 옵션을 주면 순간의 top 정보를 확인할 수 있다. 상단에서 확인할 수 있는 정보로는 1) 서버의 시간과 구동 시간, 2) 로그인해 있는 사용자의 수,3) load average(현재 시스템이 얼마나 많은 일을 하고 있는지), 4) 시스템에서 구동 중인 프로세스 개수, 5) CPU Mem swap의 메모리 사용량 등이 있다. 하단에서 확인할 수 있는 정보로는 PID, 메모리 사용률, 상태, CPU 점유 시간 등이 있다. *PR : 프로세스의 실행 우선 순위 *NI: PR을 얼만큼 조절할..