분류 전체보기
-
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는 모두 ..
-
Kube-API 서버는 Cert-manager가 만든 인증서를 어떻게 이해할까?K8S 2022. 12. 22. 20:49
kube api server와 webhook 서버는 TLS 통신을 한다. 그리고 오퍼레이터를 만들다 보면 webhook 서버에 대한 인증서는 cert-manager를 통해서 만들기 때문에 api server와 webhook server가 들고 있는 인증서의 root CA는 달라진다. 이때 API 서버에서 webhook 서버에게 요청을 보내기 위해서는 TLS로 통신하긴 하지만 서로의 root CA는 모르기 때문에 insecure 하게 통신해야 하지 않을까? 이러한 문제는 cert-manager의 CA injector를 통해서 해결할 수 있다. 일단 cainjector는 Mutating Webhooks, Validating Webhooks, Conversion Webhooks, API Services에 대한..
-
K8S Operator indexer 사용해서 성능 높이기K8S 2022. 12. 19. 18:00
operator를 만들 때, 만약 controller가 어떤 오브젝트의 특정 필드를 자주 찾아야 한다면 go client의 인덱싱을 이용하여 성능을 높일 수 있다. go client는 제일 처음 object를 List를 한번 해오고 이후부터는 watch를 통해서 변화를 감지한다. 이후 shared index informer에서 watch해서 변화된 내용을 work queue에 담아 controller로 보낸 후, controller의 reconcile loop에서 비즈니스 로직이 수행된다. shared index informer에는 캐시를 저장하는데 이는 reconcile 루프에서 indexer를 통해서 접근할 수 있다. 여기서 indexer는 특정 키를 기준으로 캐시에 index를 할 수있게 만든 것이..
-
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가 ..
-
K8S API Call 예제K8S 2022. 12. 14. 18:31
https://iximiuz.com/en/posts/kubernetes-api-call-simple-http-client/ How To Call Kubernetes API using Simple HTTP Client There are plenty of reasons to call the Kubernetes API using a CLI or GUI HTTP client. This article will show you how to get the API server address, authenticate requests using certificates and Service Account tokens, and call the API using kubectl in the iximiuz.com test.yaml..