-
[Virtumall #3] MySQL FULLTEXT 인덱스란?
기존 검색 SQL 쿼리에서 검색 성능을 높이기위해 인덱스의 사용은 매우 중요합니다. 인덱스는 보통 B-Tree 구조로 가장 왼쪽 접두사를 사용하는 경우에만 유용합니다. Virtumall 프로젝트에는 product(상품) 테이블이 있고 사용자가 상품을 검색하면 product.name에 검색어가 포함되어 있는지 확인하여 결과를 반환했습니다. product.name에 인덱스가 적용되어 있었지만, SELECT * FROM product WHERE product.name LIKE '%keyword%' 와 같이 검색을 하고 었고 LIKE %keyword% 구문은 인덱스를 타지않아 full scan이 이루어지고 있었습니다. ... Read More
-
[Virtumall #2] 부하테스트 중 일어난 일(2) - 스왑메모리로 ec2 free-tier 메모리 부족 해결하기
부하테스트를 하던 중 다음과 같은 에러와 함께 서비스가 중단되었습니다. Worker (pid:12) was sent SIGKILL! Perhaps out of memory? 저는 EC2 free-tier로 제공되는 인스턴스를 사용 중인데 free-tier로 제공되는 t2.micro는 1개의 CPU에 memory 1GiB를 제공하고 스왑메모리 공간도 따로 할당되어있지 않았습니다. 동시에 많은 요청이 Gunicorn worker에 쌓이다가 메모리 부족으로 worker process가 죽어버린 것으로 보입니다. 실제 response times의 중위값도 갈수록 길어지고 있어, 요청이 바로 응답되지 않고 대... Read More
-
[Virtumall #1] 부하테스트 중 일어난 일(1) - nginx worker_connections are not enough
웹 서버 구축 및 관리는 복잡한 과제로, 여러 설정과 시스템 리소스의 최적화를 요구합니다. 최근 저는 Nginx를 로드밸런서로 사용하던 중 worker_connections 부족으로 인한 에러를 만났습니다. 1024 working_connections are not enough, reusing connections worker_connections는 Nginx가 처리할 수 있는 동시 연결의 최대 수를 결정합니다. 이 값이 너무 낮으면 요청을 충분히 처리할 수 없게 되며, 결과적으로 웹 서버의 성능에 직접적인 영향을 미칩니다. 초기 대응으로 worker_connections의 수를 증가시키는 것이 일반적인 해... Read More
-
[Nginx] Nginx는 어떻게 많은 요청을 처리하는가?
Nginx는 고성능, 고가용성을 제공하는 웹 서버이자 리버스 프록시 서버로, 그 효율성과 확장성 때문에 널리 사용됩니다. Nginx는 로드밸런싱, 리버스 프록시, 레이턴시 감소(캐싱, 암호화, 압축) 등 다양한 기능을 제공하는 효율적인 도구이지만 오늘은 Nginx의 핵심인 이벤트 처리 방식에 대해 좀 더 자세히 알아보려고합니다. Nginx 아키텍처 개요 Nginx의 요청 처리 방식에 대해 자세히 알아보기 이전에 Nginx의 전체 구조를 간단하게 살펴보겠습니다. Nginx는 하나의 마스터 프로세스와 여러 작업자 프로세스가 있습니다. 또한 캐시 로더와 캐시 매니저와 같은 몇 가지 특수 목적 프로세스도 있습니다... Read More
-
[Python] 비동기와 blocking/non-blocking
code Python Jypyter Notebook: https://github.com/aohus/apt-alarm/blob/main/documents/async_lab/async.ipynb Python script: https://github.com/aohus/apt-alarm/blob/main/documents/async_lab/async.py Read More
-
[Python] Awaitable 객체란?(coroutine, Task, Future)
asyncio API의 await 키워드 뒤에는 Awaitable한 객체가 와야합니다. 이때, Awaitable한 객체란 무엇일까요? Coroutines and Tasks에서 답을 찾아봅시다. 우리는 객체가 await 표현식에서 사용될 수 있을 때 Awaitable 객체라고 말합니다. 많은 asyncio API는 어웨이터블을 받아들이도록 설계되었습니다. Awaitable 객체에는 세 가지 주요 유형이 있습니다: 코루틴, 태스크 및 퓨처. coroutine 파이썬 코루틴은 Awaitable이므로 다른 코루틴에서 기다릴 수 있습니다: import asyncio async def nested(): re... Read More
-
[Python] 파이썬 비동기 라이브러리 Asyncio
Asyncio 소개 Asyncio로 해결할 수 있는 것은? Asyncio의 목표는 대기를 필요로 하는 여러 개의 작업을 동시에 잘 수행하는 것입니다. 즉, 이 작업이 완료되길 기다리는 동안 다른 작업을 수행할 수 있도록 하는 것입니다. I/O 위주 작업에 스레드 기반 병행 처리보다 비동기 기반 병행 처리를 적용해야하는 두 가지 이유가 있습니다. Asyncio는 스레드를 사용하는 선점형 멀티태스킹보다 안전한 대안이 될 수 있습니다. 단순하지 않은 스레드 기반 애플리케이션에서 때때로 발생하는 오류, 경합 조건, 혹은 비결정론적 위험 요소가 발생하지 않습니다. Asyncio를 통해 동시에 수천개의 소켓 연결을... Read More
-
[Django] Django 에서 db connection 관리
서비스를 운영하다보면 DB Connection 관리에 대한 이슈가 종종 발생합니다. 이번 포스팅에서는 Django에서 DB 커넥션을 어떻게 관리하는지 알아보겠습니다. 기본적으로 Django는 내장된 Connection Pooling 을 제공하지 않습니다. Django의 ORM은 각 요청에 대해 데이터베이스 연결을 열고 요청이 완료되면 연결을 닫습니다. 즉, Django는 “long-lived” 연결을 유지하지 않고, 연결을 필요할 때마다 생성하고 해제한다는 것입니다. 그렇다고 연결 오버헤드를 방치하는 것은 아닙니다. Persistent Connection 방식을 적용하여 DB 쿼리를 처음 만들 때 DB 커넥션을 ... Read More
-
[OS] SIMD
CPU-level 1 tick 에서 계산하는 CAS 와 같은 연산 외에 매트릭스 연산 같은 병렬적 특성을 지니는 연산을 지원하는 개념인 SIMD 가 있습니다. 이 SIMD 에 대해서 알아보시고, 왜 이게 존재하는지 설명을 해주세요. Usage python에서는 NumPy 같은 라이브러리 등이 C와 Fortran으로 최적화 된 simd 연산을 사용한다. (ARM 아키텍처라는 m1 맥북 같은데서도 잘 동작하나? 챗지피티는 그렇다네ㅎ) 왜 존재하는지? 하나의 명령에 하나의 연산을 하는 SISD 방법과 SIMD 가 어떻게 다르게 동작하는지 어셈블리 코드로 살펴보자. SISD(Single Instruction Sin... Read More
-
[OS] CAS
CAS CAS(Compare-And-Swap)는 multithreading programming에서 사용하는 atominc instruction이다. 이 연산은 특정 메모리위치의 값이 주어진 값과 동일하다면 해당 메모리 주소를 새로운 값으로 대체한다. 이 연산은 atomic이기 때문에 새로운 값이 최신의 정보임을 보장한다. 만약 값 비교 와중에 다른 스레드에서 그 값이 업데이트 되어 버리면 쓰기는 실패한다. 간단히 bool을 리턴하기도 하고(compare-and-set), 메모리 위치에서 읽은 값(쓰인 값이 아님)을 리턴하기도 한다. function cas(p: pointer to int, old: int, n... Read More