커널(Kernel)
-
Linux I/O 스케줄러(cfq, deadline, noop)커널(Kernel) 2022. 12. 26. 21:14
환경 정보 OS: ubuntu18.04 I/O 발생 흐름 1. 사용자는 읽기나 쓰기를 통해서 I/O를 발생시킨다. 2. 발생한 I/O는 가상 파일 시스템이나 로컬 파일시스템 경로를 거친다. 3. 파일 시스템을 거친 I/O는 I/O 스케줄러를 통해 가공되고(병합, 정렬) 언제 블록 디바이스에 접근할지 정해진다. 4. 블록 디바이스에 접근해서 데이터를 읽거나 쓴다. I/O 스케줄러가 필요한 이유 우리가 사용하는 디스크는 크게 HDD와 SSD가 있다. HDD의 경우, 디스크 헤더를 움직여 데이터가 저장되어 있는 섹션에서 데이터를 읽거나 쓴다. 여러 데이터를 읽거나 쓰기 위해 헤더를 이리저리 움직이는 것은 시간을 많이 사용하게 되고, 결국은 성능 저하를 만든다. 마찬가지로 SSD 또한 한 번에 읽을 수 있는 데..
-
Application 튜닝해서 성능 최적화하기커널(Kernel) 2022. 12. 26. 01:03
이번 포스팅은 redis, flask로 이루어진 애플리케이션을 system level, app level에서 어떻게 튜닝하고 최적화할 수 있는지에 대해서 알아본다. 환경 정보 - OS: ubuntu 20.04 - IP: 172.30.1.40 - redis가 설치된 환경 - 부하 테스트를 위한 siege가 설치된 환경 - net.ipv4.tcp_max_tw_buckets=30000(time wait socket 개수를 30000개로 설정) - net.ipv4.tcp_tw_reuse = 0 (time wait 소켓을 재사용하지 않음) - net.ipv4.ip_local_port_range = 30000 60000 (약 3만 개의 포트를 사용할 수 있도록 설정) - redis, flask, siege는 모두 ..
-
Linux Dirty page가 I/O에 미치는 영향커널(Kernel) 2022. 12. 19. 00:26
환경 정보 OS: ubuntu18.04 Dirty page 커널은 page cache를 이용해서 디스크의 정보를 메모리에 잠시 저장하고, 필요할 때마다 메모리에 접근하여 속도를 향상시킬 수 있다. 이때 디스크에 쓰기 작업이 필요한 경우, 디스크에 직접 쓰지 않고 만들어놓은 페이지 캐시에 쓰는데 이렇게 write가 일어난 페이지를 dirty page라 한다. dirty page가 최종적으로 저장되기 위해서는 더티 페이지가 발생한 메모리 영역은 디스크에 동기화되어야 한다. 보통은 커널 스레드가 flush를 하여 더티 페이지를 디스크에 동기화하며, I/O가 많이 발생하는 서버는 더티 페이지가 언제 얼마나 동기화되느냐가 성능 튜닝의 중요한 요소가 된다. Dirty page 커널 파라미터 sysctl -a | g..
-
Linux TCP 재전송과 타임 아웃커널(Kernel) 2022. 12. 18. 00:54
환경 정보 OS: ubuntu18.04 TCP 재전송 TCP는 신뢰성 있는 연결이기 때문에 데이터를 확실하게 주고받아야 한다. sender은 receiver에게 요청을 보낸 후 receiver으로부터 ACK를 기다리는데, ACK를 받지 못하게 된다면 패킷이 중간에 손실되었다고 판단하고 요청을 재전송한다. 이렇게 요청을 재전송하는 것을 TCP 재전송이라 한다. RTO(Retransmission timeout) RTO는 재전송을 하기까지 ACK를 얼마나 기다려야 하는지를 나타내는 값이다. sender는 RTO안에 ACK를 받지 못하면 재전송을 한다. 그리고 RTO에는 일반적인 RTO와 Init RTO가 있는데 일반적인 RTO는 RTT(Round Trip Time)를 기준으로 결정된다. 예를 들어, RTT가 ..
-
Linux TCP Keepalive 정리커널(Kernel) 2022. 12. 11. 22:33
환경 정보 OS: ubuntu18.04 TCP Keepalive 종단 간 커넥션을 만들기 위해서는 TCP 맺음/ 끊기가 필요하다. 하지만 통신할 때마다 TCP 연결을 맺고 끊는 방식은 비효율적이기 때문에, 만들어진 세션을 계속 사용함으로써 자원을 아끼고 애플리케이션 응답속도를 향상시킬 수 있다. 이렇게 세션을 유지하는 방법이 keepalive이다. keepalive는 클라이언트와 서버 둘 다 사용할 수 있으며, 둘 중 하나라도 있으면 세션은 유지된다. keepalive로 커넥션을 맺게 되면, 서로가 살아 있는지 확인하기 위해 아주 작은 패킷 하나를 보내는데, 둘 중 하나에서만 보내도 충분하기 때문에 keepalive를 사용하기 유리한 쪽에서 보내 세션을 유지한다. keeplialive를 사용 중인 소켓은..
-
Linux TIME_WAIT 소켓 정리커널(Kernel) 2022. 12. 11. 16:50
환경 정보 OS: ubuntu18.04 이번 포스팅은 4-way handshake에서 TIME_WAIT 소켓을 어떻게 관리하면 좋을지에 대한 내용들을 다룬다. TCP 통신 과정 tcpdump를 통해서 client(192.168.9.194) => nginx(192.168.9.75:80)로 가는 패킷을 dump한다. tcpdump -i any port 80 -A -nn -w nginx.pcap curl 192.168.9.75 Wireshark를 이용하면, 방금 nginx로 보낸 요청이 tcp 3-way handshake, http get 요청, 4-way handshake라는 단계로 이루어져 있음을 확인할 수 있다. 일단 대략적인 흐름은 다음과 같다. 3-way handshake 1. [클라이언트 => ng..
-
Linux NUMA 아키텍처 정리커널(Kernel) 2022. 12. 5. 19:22
환경 정보 OS: ubuntu18.04 NUMA 아키텍처 NUMA는 Non-Uniform Memory Access의 약자로 불균형 메모리 접근을 의미한다. 불균형 메모리 접근이란 멀티 프로세서 환경에서 동시에 메모리 접근이 가능한 것을 말한다. 예를 들어, 0번 소켓 CPU에서 로컬 메모리에 접근, 1번 소켓 CPU에서 로컬 메모리에 접근이 동시에 일어날 수 있다. NUMA가 있기 전의 UMA 아키텍처의 경우 버스를 공유해서 사용했기 때문에 메모리에 동시 접근이 불가능했다. 참고 1. 노드(Node) - CPU와 CPU에 연결된 메모리를 노드라 한다. 2. 로컬 액세스(Local access) - 자신의 노드 안에서 메모리 접근을 로컬 액세스라 한다. 3. 리모트 엑세스(Remote Access) - 다..
-
Linux Swap 영역 정리커널(Kernel) 2022. 12. 4. 20:50
환경 정보 OS: ubuntu18.04 K8S를 사용 중인 환경이지만 swapon 환경이다. Swap 영역 swap 영역은 물리 메모리가 부족할 경우를 대비해서 만들어놓은 비상용 공간이다. 디스크의 일부를 사용하기 때문에 물리 메모리에 비해 접근과 처리속도가 떨어지므로 시스템 성능 저하를 일으킨다. free 커맨드를 통해서 메모리 영역과 swap 영역을 함께 확인할 수 있다. 현재 2GB의 스왑 영역을 확보하고 있으며, 전혀 사용하고 있지 않다. 스왑 영역을 사용하고 있다면 메모리와 관련해서 시스템에 문제가 있을 수 있다는 의미이다. 따라서 스왑 영역을 사용하고 있는 프로세스를 확인해볼 필요가 있다. 서비스 용도가 아닌 관리 용도의 프로세스에서 메모리 누수가 있어, 스왑 영역을 사용하게 되었을 수도 있기..